Unity TPS3

장현태입니다·2025년 5월 20일

UI

에임

먼저 일반 이미지를 가져와서 sprite형태로 바꿔줘야한다.

그리고 ui를 생성해서 이미지를 적용하게 된다면

다음과같은 형태로 이미지가 생성 될 것이고,
에임 로딩을 애니메이션으로 구현해보자

적용한 스프라이트를 ImageType을 통해 360도 형태로 채우는걸 조정하는 fillAmount를 사용해서 애니메이션을 만들어 볼 것이다

지금은 이미 만들었던 애니메이션이라 보이지 않지만
Image.FillAmount를 선택해준다.

그리고 시작점의 값과 마지막점의 값을 적용하게 되면 다음과 같이 중간지점에서 채워지는것을 볼 수 있다

PlayerController의 스크립트에서 에임 사용은 에임 value가 true일때만 사용하기 때문에 에임 상태일때와 동일한 bool 값을 가진다.

HP

이전의 스프라이트와 비슷하게 이미지 설정을 해주고, hp바를 생성 해준다.

GameObject(empty) -> canvas -> GameObject(empty)
-> Image, Image 형식으로 생성하였다
빈 오브젝트를 연결해준 이유는 캔버스나 이미지에 바로 회전을 가할 경우 원치않은 회전이나 변경이 있을 수 있으므로 빈 오브젝트에 스크립트, 참조 등을 넣는다.

HpGuage : HPUI오브젝트에 넣어서 전체 회전 방향을 설정해주고 SetHpGuage를 통해 원하는 이미지의 fillamount의 값을 조정 해줄 수 있도록 설정 하였다.

PlayerStatus class)

PlayerController class)

PlayerStatus에 체력에 관한 변수를 선언하고,
PlayerController에서 SetHpUIGuage에서 HPGuage에서 SetHpGuage함수를 통해 fillaount 값을 이벤트화 시켜주었고, 이를 1,2번 키를 이용해 데미지를 받고, 체력을 회복하는 코드를 구현하였다.

AI Navigation

Unity에서 제공하는 AI 길찾기 기능이다.
먼저 맵에서 NavMeshSurface를 통해 높이, 기울기, 등 여러가지 특성을 정하고 해당 이름을 맵에 저장한다(bake)
이를 통해 오브젝트에 NavMeshAgent를 적용하고 속도 회전 등의 값들을 저장하고, 예를들어 어떤 오브젝트를 타겟으로 접근한다고 설정하면 그 타겟이 bake된 즉, 갈 수 있는 길을 따라 접근하게된다. 이 때, 맵에 cost를 부여해서 최대한 기피하는 길을 만들 수도 있다.

원하는 오브젝트를 선택하고 그 오브젝트에 적용하고싶은 agent Setting을 하면 된다.

bake를 한 맵을 구성하였다.

이 때, cost의 값을 변경한 부분을 설정해보자 이렇게 따로 객체의 자식 오브젝트의 bake를 해주는 Current Object Hierarchy를 사용해도 되고, NavMeshModifier를 해주어도 된다.

all Game Objects : 모든 객체에 적용
Volume : 네베메시의 박스 콜라이더 안의 오브젝트만 해당
Current Object Hierarchy : 자식 오브젝트만 적용

그리고 레이어에 따라 오브젝트의 bake를 정할 수 있다.

마지막으로 특정 객체에만 다른 bake를 해주고싶다면

몬스터구현

이제 네비메시로 이동 가능한 위치를 bake하고 몬스터를 구현 해보겠다. 몬스터의 정보는

다음과같이 간단하게 만들었고,

먼저 여러 몬스터를 만들 수 있도록 Monster를 추상클래스로 구현하였고, 상속받는 몬스터는 Goblin클래스로 구현하였다.

그리고, 공격을 받을 수 있는 모든 오브젝트에 연동하기 위해 인터페이스를 따로 만들었다.

상속과 인터페이스를 받고 움직임에 대한 변수, 공격에 대한 변수, 공격 이벤트, NavMeshAgent(움직임 구현)변수, 공격 딜레이 변수를 설정 하였다.

OnEnable,OnDisable에서 이벤트를 구독,구독취소 해주었고,
Update에서 시간 딜레이를 통해 Monster클래스의 공격 가능한지 불가능하다면 attackCount에서 Time.deltaTime만큼 뺴주었다.

SetMoveTarget을 통해 TargetIn()함수가 true일경우 SetDestination -> agent가 target.position을 향해 움직이고, 만약 targetDistance가 설정한 attackRange보다 작다면 IsAttacking이 가능한지 판별 후 이벤트를 실행하게 하였다.

먼저 TargetIn은 bool을 타입으로 OverlapShpere(구모형)에서 range범위 안에 정해둔 Layer의 수가 0보다 클경우 true아니면 false를 반환하고, SetTarget은 타입을 IDamagable로 설정하고,
Monster 변수의 IsAttacking을 true로, target의 IDamagable을 반환한다.
Attack함수는 이를 종합해서 agent.isStopped를 통해 agent오브젝트를 멈추고, IDamagable로 설정한 setTarget의 TakeDamage를 실행한다. 그리고 시간차를 위해 Monster의 IsAttacking을 false로 반환해서 딜레이를 주도록 했다.

1) 플레이어 범위 밖

2) 플레이어 범위 안

3) 플레이어 데미지 받기

0개의 댓글