응용프로그램/유니티(Unity)

Unity - 3D게임만들기(Ray로 오브젝트 방향전환)

zelkova 2016. 10. 2. 18:26

<목차로 돌아가기>


    

  Ray로 오브젝트 방향전환하기


오브젝트를 생성한뒤 소스코드를 붙이고 아래의 코드를 실행하면 됩니다.


Player.cs

  1. using UnityEngine;
  2.  using System.Collections;

  3.  [RequireComponent (typeof(PlayerController))]
  4.  public class Player : MonoBehaviour
  5.  {
  6.    public float moveSpeed = 5;
  7.    Camera viewCamera;
  8.    PlayerController controller;

  9.    void Start ()
  10.    {
  11.      controller = GetComponent();
  12.      viewCamera = Camera.main;
  13.    }

  14.    void Update ()
  15.    {
  16.      Vector3 moveInput = new Vector3(Input.GetAxis("Horizontal"), 0,
  17.      Input.GetAxis("Vertical"));
  18.      Vector3 moveVelocity = moveInput.normalized * moveSpeed;
  19.      controller.Move(moveVelocity);

  20.      Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition); 
  21.      Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
  22.      float rayDistance;

  23.      if(groundPlane.Raycast(ray,out rayDistance))
  24.      {
  25.        Vector3 point = ray.GetPoint(rayDistance);
  26.        //Debug.DrawLine(ray.origin, point, Color.red);

  27.        controller.LookAt(point);
  28.      }
  29.    }
  30.  }

8줄 : Camera viewCamera;

  카메라 선언하기


14줄 : viewCamera = Camera.main;
  ViewCamera에 카메라 할당하기

23줄 : Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);

  화면상의 위치를 반환해주는 메소드입니다. 지금은 마우스의 위치를
  통해서 위치를 반환합니다.


24줄 : Plane groundPlane = new Plane(Vector3.up, Vector3.zero);

  플레인을 수직으로 통과하는 법선백터를 생성합니다.


25줄 : float rayDistance;


27줄 : if(groundPlane.Raycast(ray,out rayDistance))

  ouy 변수를 참조로 전달한다.


29줄 : Vector3 point = ray.GetPoint(rayDistance);

  Plane의 평면을 통과하는 지점을 구할 수 있음

  Debug.DrawLine(ray.origin, point, Color.red);


30줄 : Debug.DrawLine(ray.origin, point, Color.red);

  시각적으로 ray선이 어디를 표시하고 있는지 확인할 수 있음




PlayerController.cs

  1. using UnityEngine;
  2.  using System.Collections;

  3.  [RequireComponent (typeof (Rigidbody))]
  4.  public class PlayerController : MonoBehaviour
  5.  {
  6.    Vector3 velocity;
  7.    Rigidbody myRigidbody;
  8.    void Start ()
  9.    {
  10.      myRigidbody = GetComponent();
  11.    }
  12.    public void Move(Vector3 _velocity)
  13.    {
  14.      velocity = _velocity;
  15.    }
  16.    public void LookAt(Vector3 lookPoint)
  17.    {
  18.      Vector3 heightCorrectedPoint = new Vector3(lookPoint.x, 
  19.      transform.position.y, lookPoint.z);
  20.      transform.LookAt(heightCorrectedPoint); // 바라보게 하는 것
  21.    }
  22.    public void FixedUpdate()
  23.    {
  24.      myRigidbody.MovePosition(myRigidbody.position + velocity * 
  25.      Time.fixedDeltaTime);
  26.    }
  27.  }


19줄 : Vector3 YFixPoint = new Vector3(lookPoint.x, transform.position.y, lookPoint.z);

  y값을 고정시켜서 YFixPoint에 저장한다. 


20줄 : transform.LookAt(YFixPoint);

  lookPoint를 보는 방향으로 변환한다.






        Ray gazerRay = new Ray(transform.position, transform.forward);

        _endPoint = gazerRay.GetPoint(100f);

전방 100f 거리의 위치를 가져옴.

반응형