Notice
Recent Posts
Recent Comments
Link
STIKA
TIL[34] < MyZep > 본문
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
✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기
✏️ 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 |