STIKA

TIL[34] < MyZep > 본문

프로그래밍/Unity + C#

TIL[34] < MyZep >

STIKA 2024. 2. 22. 22:40

24.02.22 Thu

 

❤️ TIL [34]

Today I Learned


✏️ 작업 내용

✔️ 이벤트 시스템의 이해

✔️ Find


✔️ 이벤트 시스템의 이해

public class TopDownCharacterController : MonoBehaviour
{
    //TopDownCharacterController = 식당총책임자 식당 // 한개만있어야함

    //PlayerInputController = 카운터
    //OnMove = A코스메뉴 주문
    //OnLook = B코스메뉴 주문
    //InputValue = 주문한 코스메뉴의 재료

    //CallMoveEvent = 재료를 받아서 식당으로 가지고옴
    //OnMoveEvent = 쉐프가 코스요리에 있는 메뉴파트들에게 만들게끔 지시

    //팀이 만들어질때 기본형(TopDownCharacterController)이 먼저 만들어지고 팀이 만들어짐
    //TopDownMovement = 움직임을 맡은 팀
    //TopDownAimRotation = 쳐다보기를 맡은 팀

    //가게가 지어질 때 내가 원하는 코스에 대리자지원자를 받아서 쉐프로 임명
    public delegate void OnMoveDel(Vector2 direction);//대리자
    public OnMoveDel OnMoveEvent;//대리자를 쉐프로 임명 = A코스 담당 쉐프
    //public event OnMoveDel OnMoveEvent; -> event를 붙이면 노예계약같은 느낌
    //public이여서 다른곳에서 실행이 가능했음
    //근데 event를 붙이면 얘가 존재하는 이곳에서만 실행이 가능함
    //물론 메뉴 추가하는건 다른곳에서도 가능함

    //public delegate void OnMoveDel(Vector2 direction);//대리자구하는게 귀찮으면
    //public event Action<Vector2> OnMoveEvent;로 사용가능 //익명대리자(이름없는대리자)
    // 위에가 void 반환값이 없으면 Action 반환값이 있으면 Func

    public delegate void OnLookDel(Vector2 direction);//대리자2
    public OnLookDel OnLookEvent;//B코스 담당 쉐프


    public void CallMoveEvent(Vector2 direction)//재료값 , 재료값을 받아오는곳? playerinput의 value값
    {
        OnMoveEvent?.Invoke(direction);//재료가 왔으면 요리를 해야하므로 이 코스요리의 각 메뉴의 담당파트들에 재료 및 지시전달
    }

    public void CallLookEvent(Vector2 direction)
    {
        OnLookEvent?.Invoke(direction);
    }
}
public class PlayerInputController : TopDownCharacterController//왜상속? 
{
    //move라는 행동을 할때
    //    좌표값도 이동
    //    걸어가는 애니메이션
    //    걸어가는 소리
    //이걸한데 묶어서 관리할것
    //move라는 이벤트가 실행될때 저 모든것들이 한번씩 실행되도록

    public void OnMove(InputValue value)
    {
        Vector2 moveInput = value.Get<Vector2>();//재료
        //왜 value가 아니라 moveInput을 따로 저장하나요?
        //아 InputValue형을 Vector2로 바꿔주는형인가봄
        Debug.Log(moveInput);

        CallMoveEvent(moveInput);//그래서 왜 moveInput을 넘겨주나요 바로 value를 넘겨주면 안되나요?

    }

    public void OnLook(InputValue value)
    {
        Vector2 newAim = value.Get<Vector2>();//스크린 기준으로 포지션을 받아옴
                                              //그래서 플레이어가 있는 월드좌표로 변환해야함
        Vector2 worldPos = Camera.main.ScreenToWorldPoint(newAim);

        newAim = (worldPos - (Vector2)transform.position).normalized;//A에서 B를 빼면 B에서 A를 바라보는 방향이 나오는데 우린 방향만 알고싶기때문에 normalized;

        CallLookEvent(newAim);
    }
}
public class TopDownAimRotation : MonoBehaviour
{
    // 쳐다보기를 맡은 파트들을 모아놓은 구역(팀)
    // 이 쳐다보기를 맡은 팀에서 필요할거 같은걸 미리 가져오기

    private TopDownCharacterController _controller; //식당책임자

    [SerializeField] private SpriteRenderer characterRenderer;//요리할것


    private void Awake() //밑으로 들어갈 식당을 구하기 //내가 요리할 것 정하기
    {
        _controller = GetComponent<TopDownCharacterController>();//나라는 오브젝트에 TopDownController와 TopDownMovement가 달려있어야함

    }

    private void Start() //팀이 만들어질때 코스요리에 내가 만들 메뉴를 추가함 //식당의 쉐프가 이걸보고 요리지시를 내림
    {
        _controller.OnLookEvent += OnAim;

        //만들메뉴를 코스요리에 추가해놓고 대기타고있기
        //OnLookEvent쉐프가 재료가 들어온걸 봄
        //코스에 OnAim이라는메뉴파트가 포함되어있음
        //OnAim메뉴파트에게 재료를 주면서 만들라고함

    }

    private void OnAim(Vector2 direction)//OnAim파트 //OnAim파트가 맡은 메뉴의 레시피
    {
        //근데 얜 재료손질이 필요없어서 바로 만들어서 제출
        float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;

        //근데 얜 재료손질이 필요없어서 재료를 받자마자 요리해서 제출가능
    }
}
public class TopDownMovement : MonoBehaviour
{
    // 움직임을 맡은 파트들을 모아놓은 구역(팀)
    // 이 움직임을 맡은 팀에서 필요할거 같은걸 미리 가져오기
    
    private TopDownCharacterController _controller; //식당책임자

    private Vector2 _movementDirection = Vector2.zero; //재료
    private Rigidbody2D _rigidbody2D;//요리할것

    private void Awake() //밑으로 들어갈 식당을 구하기 //내가 요리할 것 정하기
    {
        _controller = GetComponent<TopDownCharacterController>();//나라는 오브젝트에 TopDownController와 TopDownMovement가 달려있어야함
        _rigidbody2D = GetComponent<Rigidbody2D>();
    }

    private void Start() //팀이 만들어질때 코스요리에 내가 만들 메뉴를 추가함 이걸 보고 식당의 쉐프가 요리지시를 내림
    {
        _controller.OnMoveEvent += Move;

        //만들메뉴를 코스요리에 추가해놓고 대기타고있기
        //OnMoveEvent쉐프가 재료가 들어온걸 봄
        //코스에 Move라는메뉴파트가 포함되어있음
        //Move메뉴파트에게 재료를 주면서 만들라고함
    }

    private void FixedUpdate()//재료손질과 요리파트가 나뉘어있을때 사용
    {
        //물리법칙을 적용하고 업데이트를 하려면 fixed사용
        ApplyMovement(_movementDirection);//손질된 재료로 레시피대로 요리 후 제출
    }

    private void Move(Vector2 dirction)//Move파트 //Move파트가 맡은 메뉴
    {
        _movementDirection = dirction;//재료 손질
    }

    private void ApplyMovement(Vector2 direction)//레시피
    {
        direction *= 5;

        //transform.position//transform은 신의 힘 //rigidbody는 물리법칙
        _rigidbody2D.velocity = direction; //velocity = 방향, 속도 //direction방향으로 5라는 만큼 이동
    }
}

 

 

✔️ Find

public void OnClickSelectCharacter(int index)
{
    characterType = (CharacterType)index;                   //요조건에 해당하는 애를 반환
    var character = GameManager.Instance.CharacterList.Find(item => item.CharacterType == characterType);
    characterSprite.sprite = character.CharacterSprite;
    characterSprite.SetNativeSize();

    selectCharacter.SetActive(false);
    information.SetActive(true);
}
public enum CharacterType
{
    Penguin,
    Knight
}

[System.Serializable]
public class Character
{
    public CharacterType CharacterType;
    public Sprite CharacterSprite;
    public RuntimeAnimatorController AnimatorController;
}

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public List<Character> CharacterList = new List<Character>();
}

이걸사용해서 아이템을 가져오는걸 만들 수 있지 않을까

 

 

 

 

https://github.com/STlCA/MyZep

 

GitHub - STlCA/MyZep

Contribute to STlCA/MyZep development by creating an account on GitHub.

github.com


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

'프로그래밍 > Unity + C#' 카테고리의 다른 글

TIL[36]  (0) 2024.02.28
TIL[35]  (0) 2024.02.27
TIL[33]  (0) 2024.02.22
D+32일 TIL < Audio Sound 오디오 사운드 >  (0) 2024.02.07
D+31일 TIL < UI >  (0) 2024.02.06