2024-05-13

이재형·2024년 5월 13일
0
post-thumbnail

시작하기에 앞서

오늘 안에 모든 구현 사항을 다 하고 내일 ReadMe에 구현 한 내용을 정리하는 시간을 가지는 계획을 갖고 시작하겠다...

Unity(2D) 입문

배운 내용

1. InputSystem interactions

사진:

설명: Interactions에 Multi Tap(연속 입력)기능으로 원래는 스크립트로 버튼을 누를 시 딜레이를 정하여 딜레이 시간안에 또 눌러서 사용하는 방법을 해당의 기능으로 간단하게 구현 할 수 있다.
사용:
1. Tap Count > 입력해야하는 탭 수
2. Max Tap Spacing > 탭 사이의 남은 시간
3. Max Tap Duration > 탭의 최대 지속 시간
4. Press Point > 모르겠음?


2. World좌표에서 Screen좌표로 변경 시 주의 점

[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로 계속 위치를 변경해줘야함


2D 게임 개발 2일차

진행 사항

1. 캐릭터 선택 시스템

[SerializeField] private SpriteRenderer KnightSprite;
[SerializeField] private SpriteRenderer ElfSprite;

[SerializeField] private Animator KnightAnimator;
[SerializeField] private Animator ElfAnimator;

사진:

설명: 선택한 캐릭터 선택시 캐릭터의 정보를 저장하여 오브젝트 활성화에 따라서 정보 활용


2. 캐릭터 이름 입력 시스템

사진1:

사진2:

설명: 해당 InputField에 텍스트 입력하고 Join을 클릭하면 해당 텍스트를 CharacterName으로 저장됨


3. 시간 표시

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에 추가


4. 인게임 이름 변경

사진:

설명: 2번의 내용을 버튼으로 활성화


5. 참석 인원 UI

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를 더해줌


6. 인게임 캐릭터 선택

사진:

설명: 1번의 내용을 버튼으로 활성화


7. NPC 상호작용(대화)

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로 구현 사항을 정리하고 과제 제출해야겠다.

profile
한국사람

0개의 댓글