본문 바로가기
Learn_Unity/CatEscape

CatEscape_3

by (S39) 2024. 1. 30.

화살 오브젝트 배치

 

 

화살을 제어할 스크립트 생성 (ArrowController) 및 컴포넌트 연결

 

화살을 일정한 속도로 수직으로 낙하시키기

- 클래스 내부에 선언

[SerializeField] private float speed = 3; // 낙하속도

 

void Update()
    {
        // movement = 방향 * 속도 * 시간
        Vector3 movement =  Vector3.down * speed * Time.deltaTime; // Vector3.down -> 정규화 벡터

        this.transform.Translate(movement); // movement 만큼 이동
        
    }

 

 

 

화살이 바닥에 닿으면 삭제[ Destroy() ]

    void Update()
    {
        // movement = 방향 * 속도 * 시간
        Vector3 movement =  Vector3.down * speed * Time.deltaTime; // Vector3.down -> 정규화 벡터

        this.transform.Translate(movement); // movement 만큼 이동
        
        TouchFloor(); // TouchFloor() 메서드 실행

    }
 private void TouchFloor()
    {
        if(this.transform.position.y < -3.0f)
        {
            Destroy(this.gameObject); // 이 스크립트가 붙어있는 게임 오브젝트 삭제
            // Destroy(this); -> 이 스크립트 삭제

        }
    }

 

 

 

화살이 고양이에게 닿으면 삭제

충돌감지하기

  1. 고양이와 화살에 반지름으로 원을 그린다. [ On DrawGizmos() ]
  2. 고양이과 화살의 반지름의 합이 고양이와 화살의 거리보다 가깝거나 같으면 충돌로 판정

1. 고양이와 화살에 반지름으로 원을 그리기. [ On DrawGizmos() ]  >> 유니티 씬 상에서의 시각화

 

- 고양이 스크립트(PlayerController)

public class PlayerController : MonoBehaviour
{
    private float posX; // 한정된 x축이 저장될 float 변수 선언
    private float radius = 1f; // 고양이의 반지름
   private void OnDrawGizmos() //이벤트 메소드 -> 유니티 엔진상에서 조건만족시 자동호출 
    {
        Gizmos.color = Color.blue; // 기즈모 색상 정의
        Gizmos.DrawWireSphere(this.transform.position, radius); // DrawSphere(위치, 반지름) -> 구형태의 와이어 기즈모 그리기
    }

 

- 화살 스크립트(ArrowController)

private float radius = 0.5f; // 화살의 반지름
 private void OnDrawGizmos() //이벤트 메소드 -> 유니티 엔진상에서 조건만족시 자동호출 
    {
        Gizmos.color = Color.blue; // 기즈모 색상 정의
        Gizmos.DrawWireSphere(this.transform.position, radius); // DrawSphere(위치, 반지름) -> 구형태의 와이어 기즈모 그리기
    }

 

- 결과

 

 

2. 고양이와 화살의 반지름의 합이 고양이와 화살의 거리보다 가깝거나 같으면 충돌로 판정하여 삭제(ArrowController)

- 고양이가 저장될 게임오브젝트 변수 선언

- 시작시 해당 변수에 고양이 오브젝트를 "이름"으로 찾아서 저장

public class ArrowController : MonoBehaviour
{
    [SerializeField] private float speed = 3; // 낙하속도
    private GameObject playerCat; // 고양이가 저장될 게임 오브젝트 변수 선언
    private float radius = 0.5f; // 화살의 반지름
    // Start is called before the first frame update
    void Start()
    {
        this.playerCat = GameObject.Find("player"); // 고양이의 오브젝트를 찾아 변수에 저장
    }

 

- 고양이의 컴포넌트로 있는 스크립트를 가져오기

private void TouchCat() // 고양이와 화살의 거리를 통한 충돌 판정구현
    {
        // 고양이와 화살의 거리 구하기
        Vector2 arrowPositon = this.transform.position; // 화살의 위치
        Vector2 catPosition = playerCat.transform.position; // 고양이의 위치
        Vector2 dir = arrowPositon - catPosition; // 방향 + 거리
        float distance = dir.magnitude; // 거리만 산출

        // 반지름 가져오기
        float arrowR = this.radius; // 화살의 반지름
        PlayerController playerController = this.playerCat.GetComponent<PlayerController>(); // 고양이의 스크립트 컴포넌트 가져오기
        float catR = playerController.radius; // 고양이의 반지름 >> private로 선언해 놓아 못가져오니 public으로 전환

        // 반지름 더하기
        float sumRdius = arrowR + catR;

        // 고양이와 충돌시 화살 삭제
        if(distance <= sumRdius)
        {
            Destroy(this.gameObject);
        }

    }

 

- 메소드 사용

 void Update()
    {
        // movement = 방향 * 속도 * 시간
        Vector3 movement =  Vector3.down * speed * Time.deltaTime; // Vector3.down -> 정규화 벡터

        this.transform.Translate(movement); // movement 만큼 이동
        
        TouchFloor(); // TouchFloor() 메서드 실행
        TouchCat(); //TouchCat()  메서드 실행

    }

 

- 결과

 

 

'Learn_Unity > CatEscape' 카테고리의 다른 글

CatEscape_5  (0) 2024.01.30
CatEscape_4  (0) 2024.01.30
CatEscape_2  (1) 2024.01.30
CatEscape_1  (1) 2024.01.30
CatEscape_R&D  (1) 2024.01.30