Monster M_V1
Monster M_V1 기본정보
요청사항
- 몬스터는 처음 대기 상태로 DetectingAreaR범위 내 Player 탐색만 수행
- Player 탐색 성공 시 AttackDuration만큼 플레이어 추적.
- Player 탐색이 성공한 경우에는 탐색 반지름을 확장시켜 Player가 맵 어디에 있던 추적 가능하도록 조정
- AttackDuration후 AttackCoolTime동안 대기
- 다시 Player 추적
- 각각의 상태에 따른 애니메이션 연결
- 공격력, 이동속도, 몬스터에 할당된 시간들은 조절 가능하도록 public으로 선언해 줄 것
필요한 변수들 선언
using System.Collections;
using UnityEngine;
public class M_V1 : MonsterBase
{
public float AttackCoolTime;
public float AttackDuration;
...
}
각각 변수들의 용도는
- AttackCoolTime
- 공격 후 다음 공격까지의 시간
- AttackDuration
- 공격이 이뤄지는 시간
기본 함수(Start, Update)
using System.Collections;
using UnityEngine;
public class M_V1 : MonsterBase
{
...
// Start is called before the first frame update
protected override void Start()
{
base.Start();
monsterType = MonsterType.M_V1;
StartCoroutine(MonsterRoutine());
}
// Update is called once per frame
void Update()
{
}
...
}
기본 함수는 MonsterBase의 Start를 호출에 Monster에서 공통적으로 사용하는 변수들을 초기화했다.
이후 MonsterType을 설정하고 Coroutine을 실행해 줬다.
몬스터는 기본적으로 코루틴으로 동작하게 설계했기에 Update는 사용하지 않았다.
코루틴 관련 함수
using System.Collections;
using UnityEngine;
public class M_V1 : MonsterBase
{
...
public override IEnumerator MonsterRoutine()
{
while (true)
{
if (!DetectionSuccess && DetectionPlayerPosition())
{
DetectionSuccess = true;
DetectingAreaR = 15.0f;
}
if (DetectionSuccess)
{
// Debug.Log("Player 탐지 완료");
yield return AttackPreparation();
yield return new WaitForSeconds(AttackCoolTime);
}
yield return null;
}
}
public override IEnumerator AttackPreparation()
{
// 방향 설정
SpriteFlipSetting();
var speed = MoveSpeed * Time.deltaTime;
float elapsedTime = 0f;
while (Vector3.Distance(transform.position, TargetPosition) > speed)
{
DetectionPlayerPosition();
elapsedTime += Time.deltaTime;
// Move during DurationTime
if (elapsedTime >= AttackDuration)
{
MAnimator.SetBool("Move", false);
yield break;
}
MAnimator.SetBool("Move", true);
rb.MovePosition(Vector3.MoveTowards(rb.position, TargetPosition, MoveSpeed * Time.fixedDeltaTime));
yield return new WaitForFixedUpdate();
}
MAnimator.SetBool("Move", false);
}
}
Player가 탐지된 후에는 DetectingAreaR를 확대해 계속 추적이 가능하도록 했다.
AttackPreparation()에서는 Target과 Monster의 Position을 이용해 프레임 단위로 플레이어를 추적할 수 있도록 만들었다.
DetectionPlayerPosition()과 SpriteFlipSetting()는 목차(참고 사항)에 링크된 MonsterBase에서 이전에 정의했다.
기타
다른 몬스터와 공통된 로직들은 MonsterBase에서 정의했기에 추가할 부분이 많이 없었다.
MonsterBase에서 많은 것들이 정의되어 있기에 먼저 보는 것을 추천한다.
참고 사항
MonsterBase
마무리하며..
MonsterBase를 잘 정의해 두었기에 코드가 깔끔해졌다.
기획팀에서 필요한 변수만 에디터에 노출시켜서 좋았다는 피드백을 받아 뿌듯했다.
'Unity > Hackers Window' 카테고리의 다른 글
[Unity] Monster 구현 : M_VE - 1 (1) | 2024.11.16 |
---|---|
[Unity] Monster 구현 : M_V3 (0) | 2024.11.15 |
[Unity] Monster 구현 : M_V2 (0) | 2024.11.14 |
[Unity] Hackers Window (0) | 2024.11.10 |
[Unity] Monster Base 구현 (1) | 2024.10.13 |