Degulleo3D/Assets/Scripts/Character/Enemy/CasterDemonController.cs
Fiore 50e5b8db98 feat : 매직미사일 기본 동작 구현
- 플레이어가 움직이는 방향을 참고하여 예측샷 발사
2025-04-29 14:00:03 +09:00

93 lines
2.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CasterDemonController : EnemyController
{
private bool _doneBattleSequence = true;
private bool _isFirstNoPath = true;
[SerializeField] private Transform teleportTransform;
[SerializeField] private Transform bulletShotPosition;
[SerializeField] private GameObject magicMissilePrefab;
public override void BattleSequence()
{
// 전투 행동이 이미 진행 중일 경우 실행 막기
if (_doneBattleSequence)
{
// 전투 행동 시작
_doneBattleSequence = false;
// TODO : 배틀 중일 때 루프
Debug.Log("## 몬스터의 교전 행동 루프");
StartCoroutine(ShotMagicMissile());
}
}
public override void OnCannotFleeBehaviour()
{
if (_isFirstNoPath)
{
Debug.Log("## 몬스터가 처음으로 막다른 길에 몰렸습니다.");
}
else
{
Debug.Log("## 몬스터가 다시 막다른 길에 몰렸습니다.");
}
}
private IEnumerator ShotMagicMissile()
{
for (int i = 0; i < 3; i++)
{
// 1. 기본 위치
Vector3 basePos = TraceTargetTransform.position;
Vector3 aimPosition = basePos;
// 2. 플레이어 Rigidbody로 속도 얻기
if (TraceTargetTransform.TryGetComponent<Rigidbody>(out var rb))
{
// 아주 짧은 시간만 예측
float predictionTime = 0.3f;
aimPosition += rb.velocity * predictionTime;
}
// 높이는 변경할 필요 없음
float fixedY = bulletShotPosition.position.y;
aimPosition.y = fixedY;
// 3. 그 위치를 바라보고
transform.LookAt(aimPosition);
// 4. 미사일 생성 및 초기화
var missile = Instantiate(
magicMissilePrefab,
bulletShotPosition.position,
transform.rotation
);
missile.GetComponent<MagicMissile>()
.Initialize(new BulletData(aimPosition, 5f, 10f, 5f));
yield return new WaitForSeconds(0.4f);
}
// 짧은 텀 후 끝내기
yield return new WaitForSeconds(1f);
_doneBattleSequence = true;
}
private void Teleport()
{
}
}