반응형
플레이어가 투사체를 발사하고, 그것을 부채꼴로 날려보내면서 천천히 포물선을 그리며 날아가게 하는것을 구현해 보았다.
솔직히 말해서 야매로 구현되어있는 스크립트지만, 예쁘게 나오기에 우선은 사용하기로 했다.
구조는 투사체 오브젝트 안에 빈 오브젝트(Target)를 넣어, 0도기준 직진 방향으로 살짝 밀어내 준다. 지금 기준에서는 z축을 2정도 앞으로 보내놓은 상태에서, 투사체를 Target으로 계속 쫒아가게 하며, 그와 동시에 rotation값을 조금씩 표적까지 틀어내 주는것이다.
탄환수가 한발일 경우에는 직선으로 나가며, 한발 한발 늘어날떄마다 부채꼴로 나누어 투사체를 발사시키는 스크립트까지 작성해두었다.
투사체는 Target에 맞추어 이동하므로, 생성시에 각 투사체의 각도를 조절해주고 발사하면 곡선을 그리며 목표를 향해 날아간다.
하지만 시작부터 rotation을 건들면 모양이 예쁘지 않으므로, 설정한 시간만큼 직선으로 나가다가 그 뒤로부터 각도를 틀게 해두었다.
[탄환 발사 스크립트]
IEnumerator BulletTest(){
while(true){
if(_bulletCount > 1){
float fullAngle = Mathf.Clamp((15 * _bulletCount), 0, 90f);
float angle = fullAngle / (_bulletCount - 1);
Vector3 rot = Vector3.zero;
for(int i = 0; i < _bulletCount; i++){
GameObject obj = PoolManager.GetPoolItem("Bullet");
obj.GetComponent<BulletManager>().SetTime();
obj.transform.position = _playerAttackPoint.position;
rot.y = 0 - fullAngle * 0.5f;
rot.y += angle * i;
obj.transform.localScale = Vector3.one;
obj.transform.eulerAngles = rot;
obj.SetActive(true);
}
}
else{
GameObject obj = PoolManager.GetPoolItem("Bullet");
obj.GetComponent<BulletManager>().SetTime();
obj.transform.position = _playerAttackPoint.position;
obj.transform.localScale = Vector3.one;
obj.transform.rotation = Quaternion.identity;
obj.SetActive(true);
}
yield return new WaitForSeconds(.5f);
}
}
[투사체 스크립트]
public class BulletManager : MonoBehaviour
{
[Range(1f, 100f)] public float speed;
[Range(0.1f, 2f)] public float timer;
[SerializeField] private Transform target;
private float _time;
private Vector3 _rot;
public void SetTime(){
_time = timer;
}
void Update()
{
if(MainSystem.inst._nowBossHitPoint != null){
if(_time > 0){
_time -= Time.deltaTime;
transform.position = Vector3.Lerp(transform.position, target.position, Time.deltaTime * speed);
}
else{
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(MainSystem.inst._nowBossHitPoint.position - transform.position), Time.deltaTime * (speed * 0.2f));
transform.position = Vector3.Lerp(transform.position, target.position, Time.deltaTime * speed);
}
}
else{
PoolManager.ReturnPoolObject("Bullet", gameObject);
}
}
private void OnTriggerEnter(Collider col) {
if(col.CompareTag("Core")){
MainSystem.inst.FX_Hit(transform);
PoolManager.ReturnPoolObject("Bullet", gameObject);
}
}
}
반응형
'개발일지(Unity)' 카테고리의 다른 글
【떠돌이용병 키우기】스킬 쿨타임 및 ui 업데이트 기능 구현. 그리고 백엔드 연결까지. (0) | 2023.12.25 |
---|---|
【떠돌이용병 키우기】밑작업 (0) | 2023.12.23 |
[Unity/C#] 오브젝트풀(Object Pool) (0) | 2022.02.26 |
210414 대족장 사장님 개발일지 (0) | 2021.04.15 |
21.04.05 자 대족장사장님 개발일지 (0) | 2021.04.05 |
댓글