feat : 매직미사일 기본 동작 구현

- 플레이어가 움직이는 방향을 참고하여 예측샷 발사
This commit is contained in:
Fiore 2025-04-29 14:00:03 +09:00
parent 393b538920
commit 50e5b8db98
8 changed files with 66 additions and 7 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 37e30a87d9c904c898232118c82b5fbc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/JYY/Prefabs/Bullets/Dummy Magic Missaile.prefab (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9c16b44c8736e4007ad5f0733ce433e1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/JYY/Scenes/MonsterTest.unity (Stored with Git LFS)

Binary file not shown.

View File

@ -57,6 +57,8 @@ public class BulletBase : MonoBehaviour
private void OnTriggerEnter(Collider other) private void OnTriggerEnter(Collider other)
{ {
// TODO: 주인공 캐릭터를 찾는 로직 추가 필요
// 주인공 스크립트를 찾아 처리할 것.
var character = other.GetComponent<CharacterBase>(); var character = other.GetComponent<CharacterBase>();
if (character != null) if (character != null)
{ {

View File

@ -2,7 +2,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class MagicMissaile : BulletBase public class MagicMissile : BulletBase
{ {
} }

View File

@ -8,6 +8,7 @@ public class CasterDemonController : EnemyController
private bool _isFirstNoPath = true; private bool _isFirstNoPath = true;
[SerializeField] private Transform teleportTransform; [SerializeField] private Transform teleportTransform;
[SerializeField] private Transform bulletShotPosition;
[SerializeField] private GameObject magicMissilePrefab; [SerializeField] private GameObject magicMissilePrefab;
public override void BattleSequence() public override void BattleSequence()
@ -20,9 +21,8 @@ public class CasterDemonController : EnemyController
// TODO : 배틀 중일 때 루프 // TODO : 배틀 중일 때 루프
Debug.Log("## 몬스터의 교전 행동 루프"); Debug.Log("## 몬스터의 교전 행동 루프");
StartCoroutine(ShotMagicMissile());
// 전투 행동이 끝남
_doneBattleSequence = true;
} }
} }
@ -39,15 +39,54 @@ public class CasterDemonController : EnemyController
} }
} }
private void ShotMagicMissile() private IEnumerator ShotMagicMissile()
{ {
this.transform.LookAt(TraceTargetTransform.position); 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() private void Teleport()
{ {
} }
} }