https://insengreview0510.tistory.com/36
[유니티3D] 플레이어 위치로 원거리 공격하는 적
총알 코드 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bullet : MonoBehaviour { // Start is called before the first frame update public float speed = 5.5f; private Rigidbody bulletRigidbody; void Start() {
insengreview0510.tistory.com
저번 글에서는 3D에서 플레이어 위치로 원거리 하는 적을 구현했다. 나는 이를 토대로 2D에서 플레이어 위치로 원거리 공격하는 적을 구현하려고 했는데 의외로 다른 부분이 제법 있어서 애를 먹었다.
총알 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
// Start is called before the first frame update
private Rigidbody2D bulletRigidbody;
Transform playerPos;
Vector2 dir;
void Start()
{
playerPos = GameObject.Find("Player").GetComponent<Transform>();
dir = playerPos.position - transform.position;//dir : direction(방향)줄임말
GetComponent<Rigidbody2D>().AddForce(dir.normalized * Time.deltaTime * 100000);
Destroy(gameObject, 5f); //5초 뒤 파괴
}
// Update is called once per frame
void Update()
{
}
}
전에 올렸던 3D와 달라진 부분은 Rigidbody가 아닌 Rigidbody2D가 사용되었다는 점이 가장 먼저 보인다. 이것만 바뀌고 대부분의 코드가 같을거라 예상했으나 3D에서는 됐지만 2D에서 안되는 것이 있었다. 이것은 나중에 적군 코드까지 보여주고 한꺼번에 정리하겠다.
설명
플레이어의 위치를 Transform으로 받아온다.
플레이어의 위치 - 적 위치를 해서 방향벡터를 구한다.
그 후 방향벡터.normalize를 해서 단위 벡터를 구한 후 그 단위 벡터로 AddForce를 해준다.
적군 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
// Start is called before the first frame update
public GameObject bulletPrefab; //생성할 탄알의 원본 프리팹
public float attackRate = 2f; //공격주기
private Transform target; //발사할 대상
private float timeAfterAttack; //최근 공격 시점에서 지난 시간
void Start()
{
timeAfterAttack = 0f; //최근 공격 이후의 누적 시간을 0으로 초기화
}
// Update is called once per frame
void Update()
{
timeAfterAttack += Time.deltaTime;
if(timeAfterAttack >= attackRate)
{
timeAfterAttack = 0f;//누적된 시간 리셋
//bulletPrefab의 복제본을 transform.position 위치와 transform.rotation 회전으로 생성
GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
}
}
}
설명
총알 프리팹 가져오고 공격주기가 될 때마다 총알을 생성한다. 저번 글에서는 공격 주기를 일정 범위 내에서 랜덤으로 선택되어 공격했다면 이번엔 그냥 2초마다 생성되도록 했다.
저번 글에서 등장하지 않았던 벡터가 등장하게 된 이유는 다음과 같다.
3D에서 코드를 만들 때는 발사 과정이
1. BulletSpawner에서 총알을 생성한다.
2. LookAt()를 사용하여 총알의 방향을 플레이어를 향하게 바꾼다.
3. transform.forward를 사용해서 바라보고 있는 방향으로 총알이 날아가게 한다.
이었다.
여기서 forward가 z축 방향으로의 이동이었기 때문에 2D에서 제작할 때 먹히지 않았던 것이다.
그래서 직접 방향을 벡터 연산을 통해서 구해주고 그 방향으로 날아가게 하는 코드로 바꾼 것이다.
요약 : 고딩 때 기하와 벡터 공부 안했던 세대인데 벡터를 사용하게 되어서 기분이 묘했다. 그래도 대학교 1학년 때 벡터 공부 나름 열심히 했어서 벡터를 만나서 반가웠달까나. 과거에 공부했던 내용이 나오면 뭔가 기분이 좋음.
'오르막길 > Unity' 카테고리의 다른 글
[유니티3D] 플레이어 위치로 원거리 공격하는 적 (0) | 2023.04.11 |
---|---|
비주얼 스튜디오 유니티 자동완성 안될 때 해결 방법 (0) | 2023.04.05 |
댓글