Unity 연습 01

안또니오·2022년 5월 19일
0

유니티

목록 보기
1/6

유니티를 안 만진지 너무 오래 돼서,
다시 이직 준비겸 유니티 공부를 시작했다.

간단히 만들어본 프로젝트는 옛날 곰플레이어에서 실행할 수 있던 느낌의 프로젝트이다.

실행영상

플레이어(가운데 캡슐)은 RigidBody를 이용해서 이동했고,
공과 충돌을 편하게 이용하기 위해 사용했다.

이동은 Input.GetAxis를 이용했다.

OnTriggerEnter 메서드를 이용해서,
총알에 맞았을 때 총알인지 판단하여, 그렇다면 Active상태를 False로 바꿔줬다.

 private void OnTriggerEnter(Collider other) {
        //if(other.gameObject.GetComponent<BulletMove>() !=null){
        // GetComponent를 자주 호출하는 것은 안 좋다고 알고 있어,
        // Prefab에 Tag를 설정하고 CompareTag를 이용해 확인하는 방식으로 수정했다.
        if(other.gameObject.CompareTag("bullet")){
            other.gameObject.SetActive(false);
            StartCoroutine(flash());
        }
    }

다만, 저 코드에서는 충돌이 있을 때 마다 GetComponent를 실행하기 때문에 그리 좋은 코드는 일단 아닌 것 같다.
Tag등을 이용하면 더 무난하게 이용할 수 있을 것 같다.
코루틴을 이용해서 부딪힌 경우 깜빡거리도록 만들었다.

IEnumerator flash(){
        for(int i = 0 ; i<8 ; i++)
        {
            myMaterial.color = myMaterial.color == Color.white ? Color.red : Color.white ; 
            yield return wait;
        }
    }

총알은 지속적으로 할당과 삭제를 반복하면 파편화될 것을 우려해
Start()메소드에서 만들어놓은 뒤 Queue에 담아서 이용한다.
일정한 시간 마다 Active를 true로 만들어서 이용한다.

public class ShooterController : MonoBehaviour
{
    public GameObject bullet;
    float coolTime = 3f;
    Queue<GameObject> magazine;
    // Start is called before the first frame update
    void Start()
    {
        magazine = new Queue<GameObject>();
        for(int i = 0 ; i<15 ; i++)
        {
            GameObject go = Instantiate(bullet);
            go.transform.position = transform.position + Vector3.up;
            magazine.Enqueue(go);
            go.SetActive(false);

        }
            StartCoroutine(shoot());
    }
    IEnumerator shoot(){
       while(true){ 
           yield return new WaitForSeconds(coolTime);
        GameObject b = magazine.Dequeue();
        b.SetActive(true);
        magazine.Enqueue(b);
        coolTime = Random.Range(0.5f, 1.9f);}
    }
}

총알은 Update에서 움직이도록 만들고
OnEnalbe 메소드를 이용해 코루틴을 실행하여, 일정시간 뒤에 Active==false로,
OnTriggerEnter 메서드를 이용해, 부딛혔을 때 Active==false로 설정한다.

총알이 캐릭터를 찾아가는 로직은 Vector3의 연산을 이용했고,
Awake 단계에서 Find함수를 이용해 목표물(플레이어)를 할당해주고
활성화될때, 방향을 설정해준다.

private void Awake() {
        aim = FindObjectOfType<PlayerController>().gameObject;
     
    }  
    private void OnEnable() {
        initVec = transform.position;
        vel = aim.transform.position - transform.position;
        vel = vel.normalized;
        StartCoroutine(Deactivator());
    }

깃허브 링크

자세한 코드는 여기서 확인할 수 있다.

간단한 프로젝트인데도 2시간 정도가 소요된 것 같다.
너무 많이 까먹었다.

profile
2020. 11월 공부시작.

0개의 댓글