Unity 또 하나의 충돌체크 Debug.DrawRay, Physics.Raycast 에 대해
Unity 에서는 보통 충동 체크에 Collider,
Box, Sphere, Capsule 등을 주로 사용합니다.
Debug 는 게임을 개발하는 동안 쉽게 디버깅하기 위해 목적의 클래스입니다.
public static void DrawRay(Vector3 start, Vector3 dir, Color color = Color.white, float duration = 0.0f, bool depthTest = true);
DrawRay 는 색상과 함께 Start 지점부터 Start 지점 + dir(방향과 길이) 까지 선을 그리는 역할을 합니다.
Start는 시작 지점, dir은 Ray의 방향과 길이, Color 는 라인의 색상, duration 은 라인의 표시 시간, depthTest 는 라인이
카메라에서 가까운 오브젝트에 의해 숨겨진 경우에 라인을 숨길지의 여부를 나타냅니다.
우선, 이정도 설명에서 소스를 보도록 하죠.
private int speed = 10; private int rotateSpeed = 100; private int power = 7; private Transform swanPoint; public Transform bullet; private float raySpeed = 0; void Start () { swanPoint = transform.Find("SwanPoint"); } void Update () { Move(); Attack(); } private void Move() { float moveSpeed = speed * Time.deltaTime; float rMoveSpeed = rotateSpeed * Time.deltaTime; float keyVertical = Input.GetAxis("Vertical"); float keyHorizontal = Input.GetAxis("Horizontal"); transform.Translate(Vector3.forward * keyVertical * moveSpeed); transform.Rotate(Vector3.up * keyHorizontal * rMoveSpeed); } void Attack() { // 1. Debug.DrawRay(swanPoint.position, swanPoint.forward * 15, Color.red); }
위 소스에서 1번에 DrawRay 를 사용하고 있습니다.
swanPoint의 시작점 부터 정면 방향으로 15 만큼의 길이까지, 빨간색의 라인을 그리도록 되어있습니다.
위의 그림과 같이 빨간색 선이 그려졌네요.
이제 저 라인에 적 Object 가 닿을 경우에 미사일을 발사하도록 처리하겠습니다.
void Attack() { Debug.DrawRay(swanPoint.position, swanPoint.forward * 15, Color.red); // 2. RaycastHit hit; // 3. if (Physics.Raycast(swanPoint.position, swanPoint.forward, out hit, 15)) { // Debug - 1 Debug.Log(hit.collider.name + "1"); // 4. if(hit.collider.name == "Enemy"){ // Debug - 2 Debug.Log(hit.collider.name + "2"); Transform obj = Instantiate(bullet, swanPoint.position, swanPoint.rotation); obj.GetComponent
().velocity = swanPoint.forward * power; } } }
RaycastHit 는 Raycast에서 정보를 다시 얻는데 사용합니다.
그림을 클릭하면 할 수 있습니다.
Debug -1 , Debug -2 의 로그를 한번 확인해보겠습니다.
Enemy1 과 Enemy2 가 일정하게 찍히는 걸 확인 할 수 있습니다.
반면 Bullet1 은 찍히는 숫자가 크게 차이가 나는데, 처음에는 원인을 알 수 없었습니다.
하지만 잘 생각해보면 간단한 문제였죠.
미사일이 생성되서 발사되는데 Ray 광선 상에서 광성의 maxDistance 까지 이동 되기때문에 그 사이에 호출되는 것입니다.
이번 포스팅은 여기서 마치겠습니다.