오늘 안에 모든 구현 사항을 다 하고 내일 ReadMe에 구현 한 내용을 정리하는 시간을 가지는 계획을 갖고 시작하겠다...
설명: Interactions에 Multi Tap(연속 입력)기능으로 원래는 스크립트로 버튼을 누를 시 딜레이를 정하여 딜레이 시간안에 또 눌러서 사용하는 방법을 해당의 기능으로 간단하게 구현 할 수 있다.
사용:
1. Tap Count > 입력해야하는 탭 수
2. Max Tap Spacing > 탭 사이의 남은 시간
3. Max Tap Duration > 탭의 최대 지속 시간
4. Press Point > 모르겠음?
[SerializeField] private GameObject panel;
private Camera camera;
private Vector3 distance;
void Start()
{
camera = Camera.main;
// NPC 스프라이트와 겹치면 안되기 때문에 y축 길이 추가
distance = new Vector3(0, 0.8f, 0);
}
private void Update()
{
// 패널의 위치는 World 위치이므로 계속 값을 변경해 줘야함
Vector2 textpos = transform.position + distance;
panel.transform.position = camera.WorldToScreenPoint(textpos);
}
설명: camera.WorldToScreenPoint(textpos)로 해당 UI(Panel)의 위치를 변경 해줬는데 처음에만 Screen좌표로 설정을 했지만 거리는 World좌표이므로 Start에 1번만 실행을 할 경우에는 좌표가 서로 달라 거리가 안 좁혀지는 상황이 생기기 때문에 Update로 계속 위치를 변경해줘야함
[SerializeField] private SpriteRenderer KnightSprite;
[SerializeField] private SpriteRenderer ElfSprite;
[SerializeField] private Animator KnightAnimator;
[SerializeField] private Animator ElfAnimator;
설명: 선택한 캐릭터 선택시 캐릭터의 정보를 저장하여 오브젝트 활성화에 따라서 정보 활용
설명: 해당 InputField에 텍스트 입력하고 Join을 클릭하면 해당 텍스트를 CharacterName으로 저장됨
public class GameTime : MonoBehaviour
{
private Text timeText;
void Start()
{
timeText = GetComponent<Text>();
}
void Update()
{
// 실제 시간으로 text에 출력되게 함
timeText.text = DateTime.Now.ToString(("HH:mm"));
}
}
설명: DataTime.Now로 실제 시간을 나타내는 것으로 해당 값을 string으로 변경하여 Text에 추가
설명: 2번의 내용을 버튼으로 활성화
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
[SerializeField] private Text playerName;
[SerializeField] private Text nameGroup;
[HideInInspector] public List<string> NPCNames;
private void Awake()
{
if (Instance != null) return;
Instance = this;
}
void Update()
{
NameView();
}
// NPC가 실시간으로 추가 될 수 있기 때문에 Update에 추가
private void NameView()
{
nameGroup.text = playerName.text;
for (int i = 0; i < NPCNames.Count; i++)
{
nameGroup.text += "\n" + NPCNames[i];
}
}
}
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class NPC : MonoBehaviour
{
[SerializeField] private string name;
[SerializeField] private GameObject panel;
[SerializeField] private Text nameText;
private Camera camera;
private Vector3 distance;
public GameObject dialog; // 해당 NPC대화
void Start()
{
camera = Camera.main;
// NPC 스프라이트와 겹치면 안되기 때문에 y축 길이 추가
distance = new Vector3(0, 0.8f, 0);
// NPC 이름 UI에 출력
nameText.text = name;
// NPC 이름 정보 게임매니저에 추가
GameManager.Instance.NPCNames.Add(name);
}
}
설명: 싱글톤으로 게임매니저를 만들어 List NPCNames;을 생성하고 NPC에서 해당 싱글톤으로 값을 보내서 Text를 더해줌
설명: 1번의 내용을 버튼으로 활성화
public class CharacterInteraction : MonoBehaviour
{
// 상호작용 가능할 때 보이는 키
[SerializeField] private GameObject interaction;
private Controller controller;
private GameObject dialog;
void Start()
{
controller = GetComponent<Controller>();
controller.OnTalk += NPCTalk;
}
// 상호작용 키의 활성화에 따라서 대화창 활성화
private void NPCTalk()
{
if (interaction.activeSelf)
{
dialog.SetActive(true);
}
}
// NPC와 가까워졌을 때 상호작용 키 활성화
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Npc"))
{
interaction.SetActive(true);
dialog = collision.GetComponent<NPC>()?.dialog;
}
}
// NPC와 멀어졌을 때 상호작용 키 비활성화
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Npc"))
{
interaction.SetActive(false);
}
}
}
설명: 해당 사진처럼 NPC와 가까워지면 E의 상호작용 키가 나오고 누르면 해당 NPC 대사가 나온다.
1. InputSystem interactions: 다양한 기능을 추가할 수 있음
2. World좌표에서 Screen좌표로 변경 시 주의 점: Update또는 FixedUpdate로 계속 값을 변경 해줘야 함
1. 없음
1. 없음
시작에 모든 구현은 끝이 났으니 내일 ReadMe로 구현 사항을 정리하고 과제 제출해야겠다.