2016年8月9日 星期二

[Unity] 第三人稱俯瞰射擊:讓角色正面朝向游標位置

上圖擷取自Unity官方教學專案Survival Shooter



一、
簡略寫法:
在Update方法中建立一無垠的、虛擬的、y軸向上的平面,並使用Plane類別下的Raycast方法獲得滑鼠在該平面上的交點:

Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition); //須先宣告一Camera物件
float rayDistance;
Plane groundPlane = new Plane(Vector3.up, Vector3.zero);

if(groundPlane.Raycast(ray, out rayDistance))
 {
  Vector3 point = ray.GetPoint(rayDistance);

  Vector3 lockTransformRotation = new Vector3(point.x, transform.position.y, point.z);
  transform.LookAt(lockTransformRotation);
 }


二、
進一步之寫法:
主要於FixedUpdate方法中撰寫,使用Physics.Raycast於Camera射出射線,檢查射線與場景上實體平面的焦點,將角度儲存為Quaternion,套用於Rigidbody組件上:

首先宣告變數並於Awake中取得Mask:
 
int floorMask;         
float camRayLength = 100f; //射線長度
void Awake ()
        {
            floorMask = LayerMask.GetMask ("Floor"); 
        }


記得在場景上的平面設置為Floor Layer,以在程式中利用該Layer之LayerMask(遮罩)。

void FixedUpdate()
{
  Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition); //須先宣告一Camera物件
  RaycastHit floorHit;

  if(Physics.Raycast (ray, out floorHit, camRayLength, floorMask))
            {
                Vector3 playerOrientationToMouse = floorHit.point - transform.position;
                playerOrientationToMouse .y = 0f;

                Quaternion newRotatation = Quaternion.LookRotation (playerOrientationToMouse ); 
                myRigidbody.MoveRotation (newRotatation);
            }
}



以上參考自官方Survival Shooter 學習專案,有錯敬請不吝指正。

沒有留言:

張貼留言