객체지향형으로 코드를 작성했다는데 솔직히 나는 아직 이해를 잘 못했다.
하여튼 배운 부분에 대해서만 정리해보자.
저번 시간에 InputSystem에 대해 간단하게 배웠는데
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
public void OnLook(InputValue value)
{
Vector2 newAim = value.Get<Vector2>();
Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
newAim = (worldPos - (Vector2)transform.position).normalized;
CallLookEvent(newAim);
}
public void OnFire(InputValue value)
{
IsAttacking = value.isPressed;
}
내부에 On(InputSystem Action이름)을 대소문자 구분하여 한 글자도 틀리지 않고 정확하게 입력해야만
InputSystem을 읽어올 수 있다...
OnLook을 Onlook으로 입력했다가 이거 찾겠다고 많은 시간을 소요했다..
다음은 AnimationController라는 스크립트를 따로 작성하여 조건 만족 시
자동으로 bool이나 trigger값을 건드려서 작동시키게 해주는 코드인데
문자열로 연산시에는 연산량이 크게 증가하기 때문에
해쉬화 해서 정수형으로 데이터를 저장해서 비교하면 연산량이 상대적으로 줄게 된다.
private static readonly int isWalking = Animator.StringToHash("isWalking");
private static readonly int isHit = Animator.StringToHash("isHit");
private static readonly int Attack = Animator.StringToHash("attack");
animator에서 주요 트리거가 되는 3가지 단어를 해쉬화 해서 RO로 저장했다.
private void Start()
{
controller.OnAttackEvent += Attacking;
controller.OnMoveEvent += Move;
if (healthSystem != null)
{
healthSystem.OnDamage += Hit;
healthSystem.OnInvicibillityEnd += InvicibillityEnd;
}
}
private void Move(Vector2 vector)
{
animator.SetBool(isWalking, vector.magnitude > magnituteThreshold);
}
private void Attacking(AttackSO sO)
{
animator.SetTrigger(Attack);
}
private void Hit()
{
animator.SetBool(isHit, true);
}
private void InvicibillityEnd()
{
animator.SetBool(isHit,false);
}
후에 스타트 문 내부에 함수를 더해주고
각 함수는 해당 트리거나 불 조건이 True냐 False냐를 정하게 만들어준다.
그리고 정보를 SO화 시켜서 사용하는 방법에 대해서도 알려줬는데
[CreateAssetMenu(fileName = "DefaultAttackSO", menuName = "TopDownControlloer/Attacks/Default", order = 0)]
public class AttackSO : ScriptableObject
{
[Header("Attack Info")]
public float size;
public float delay;
public float speed;
public float power;
public LayerMask target;
[Header("KnockBack Info")]
public bool isOnKnockBack;
public float knockbackPower;
public float knockbackTime;
}
[CreateAssetMenu(fileName = "RangedAttackSO", menuName = "TopDownControlloer/Attacks/RangeAttack", order = 1) ]
public class RangedAttackSO : AttackSO
{
[Header("Ranged Attack Data")]
public string bulletNameTag;
public float duration;
public float spread;
public int numberOfProjectilesPerShot;
public float multipleProjectilesAngle;
public Color projectileColor;
}
아직 정확히 이해는 못했지만
유니티에서 AttackSO라는 접근 값을 하나 추가해주는 것 같다.
생성해보면
이런 식으로 제작되는데
비슷한 오브젝트에 데이터를 입력할 때 편하게 사용할 수 있을 것 같다.
이번에는 공격종류와 공격 세부사항에 대해 정리되었다.
괜히 AttackSO라고 계속 부르고 호출되서 더 헷갈리지
생각해보면 Stat이라는 이름으로 만들어서
각 몬스터마다
공격력 체력 방어력 순으로 입력해도 큰 문제는 없을 것 같다.
일종의 구조체? 클래스?를 밖으로 빼놓은? 그런 느낌이다.
중간에 컴퓨터가 한 번 꺼져서 과제 하던게 날아가서
오늘 TIL은 여기서 마무리 하겠다..
1인 개발을 위한 무료에셋스토어 (0) | 2024.08.30 |
---|---|
게임의 특정 상호작용 분석해보기 (0) | 2024.08.21 |
UNITY 에셋스토어 무료 쿠폰으로 에셋 구매 완료 (0) | 2024.08.21 |
Unity를 이용해 만든 프로젝트 조사 (0) | 2024.08.20 |
스파르타 코딩 캠프 사전캠프 시작 (0) | 2024.08.20 |