화살 오브젝트 배치

화살을 제어할 스크립트 생성 (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); -> 이 스크립트 삭제
}
}
화살이 고양이에게 닿으면 삭제
충돌감지하기
- 고양이와 화살에 반지름으로 원을 그린다. [ On DrawGizmos() ]
- 고양이과 화살의 반지름의 합이 고양이와 화살의 거리보다 가깝거나 같으면 충돌로 판정
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 |