본문 바로가기
공부/Unity 기초

2D 슈팅 - 3 / 충돌 시스템 구현

by svcbn 2022. 5. 15.

적 충돌 구현

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 태어날 때 30% 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
// 살아가면서 그 방향으로 계속 이동하고싶다.
public class Enemy : MonoBehaviour
{
    // 방향
    Vector3 dir;

    // 속력
    public float speed = 5;

    // Start is called before the first frame update
    void Start()
    {
        // 태어날 때
        // 30 % 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
        int result = UnityEngine.Random.Range(0, 10);
        if (result < 3)
        {
            // 플레이어 방향
            GameObject target = GameObject.Find("Player");

            // dir = target - me
            dir = target.transform.position - transform.position;
            dir.Normalize();
        }
        
        else
        {
            // 아래방향
            dir = Vector3.down;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // 살아가면서 그 방향으로 계속 이동하고싶다.
        transform.position += dir * speed * Time.deltaTime;
    }

    public GameObject explosionFactory;
    private void OnCollisionEnter(Collision other)
    {
        // 시각효과 공장에서 시각효과를 만들어서
        GameObject explosion = Instantiate(explosionFactory);

        // 내 위치에 가져다 놓고싶다.
        explosion.transform.position = transform.position;
        
        // 충돌시 플레이어, 총알 파괴
        Destroy(other.gameObject);

        // 충돌시 에너미 파괴
        Destroy(gameObject);

    }
}

 

OnCollisionEnter > 충돌 발생시 호출

 

Destroy > GameObject 제거

 

※ 충돌하려는 물체 중 어느 한쪽이라도 RigidBody가 적용되어있지 않다면 충돌 발생하지 않음.

 

 

 

 

맵 경계 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DestroyZone : MonoBehaviour
{

    private void OnTriggerEnter(Collider other)
    {
        // 부딪히는걸 파괴
        Destroy(other.gameObject);
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

리소스 과다 방지