HTC Vive手柄圓盤控制角色移動

這篇文章主要寫的是通過手柄控制移動在場景中漫遊。 
在通過手柄控制移動時,我主要寫了兩個腳本一個ChildTransform.cs、Move.cs; 
1、 ChildTransform這個腳本主要是爲了獲取頭部Y軸方向的轉動。以及頭部在x、z軸方向的移動。將這個信息賦值給這個腳本綁定的對象身上。 
2、 Move這個腳本主要是爲了控制玩家的移動的,移動的方向是依據綁定ChildTransform這個腳本的transform信息。 
這樣就能實現,頭盔轉動控制移動的方向,手柄中touchPad的上、下、左、右控制移動的向前、向左、向右、向後移動。 
操作步驟: 
1、 首先我們需要先創建一個空對象,命名爲moveDic。 
2、 然後將腳本ChildTransform綁定在moveDic上。 
3、 將Camera(head)賦值給ChildTransform的Same變量。 
這個就能將Camera(head)的方向信息賦值給moveDic。 
腳本 
Movie.cs 有3個公共變量: 
1、 Player:將 [Camera Rig]賦值給它。 
2、 Dic:將moveDic賦值給它。 
3、 Speed:主要是控制移動的速度。


using UnityEngine;
using System.Collections;

public class ChildTransform : MonoBehaviour
{
    public Transform same;

    void FixedUpdate()
    {
        transform.localEulerAngles = new Vector3(0, same.localEulerAngles.y, 0);
        transform.localPosition = new Vector3(same.localPosition.x, 0, same.localPosition.z);
    }
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HTC.UnityPlugin.Vive;
using HTC.UnityPlugin.Pointer3D;

public class Move : MonoBehaviour {

	/// <summary>
	/// 玩家
	/// </summary>
	public Transform player;

	/// <summary>
	/// 方向 
	/// </summary>
	public Transform dic;

	/// <summary>
	/// 速度
	/// </summary>
	public float speed;

	public GameObject targetObj = null;

	private ReticlePoser rp;
	void Awake()
	{
		rp = GameObject.Find ("VivePointers/Right/Reticle").GetComponent<ReticlePoser>();
	}

    // Update is called once per frame
	void FixedUpdate () {
		targetObj = rp.raycaster.FirstRaycastResult().gameObject;

		//按下圓盤鍵
		if (ViveInput.GetPress(HandRole.RightHand,ControllerButton.PadTouch))
		{
			Vector2 cc = ViveInput.GetPadTouchAxis(HandRole.RightHand);
			float angle = VectorAngle(new Vector2(1, 0), cc);

			//下
			if (angle > 45 && angle < 135)
			{
				player.Translate(-dic.forward * Time.deltaTime * speed);
			}
			//上  
			else if (angle < -45 && angle > -135)
			{
				//Debug.Log("上");
				player.Translate(dic.forward * Time.deltaTime * speed);
			}
			//左  
			else if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180))
			{
				//Debug.Log("左");
				player.Translate(-dic.right * Time.deltaTime * speed);
			}
			//右  
			else if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0))
			{
				//Debug.Log("右");
				player.Translate(dic.right * Time.deltaTime * speed);
			}
		}
        if (ViveInput.GetPress(HandRole.LeftHand,ControllerButton.Pad)) {
            Vector2 cc = ViveInput.GetPadTouchAxis(HandRole.LeftHand);
            float angle = VectorAngle(new Vector2(1, 0), cc);

            //下
            if (angle > 45 && angle < 135)
            {
                player.Translate(-dic.up * Time.deltaTime * speed);
            }
            //上  
            else if (angle < -45 && angle > -135)
            {
                //Debug.Log("上");
                player.Translate(dic.up * Time.deltaTime * speed);
            }
        }
	}


//	void OnTriggerEnter(Collider collider){
//		Debug.Log("cube");
//	}
//	void OnCollisionEnter(){
//		Debug.Log("cube");
//	}
	/// <summary>
	/// 根據在圓盤才按下的位置,返回一個角度值
	/// </summary>
	/// <param name="from"></param>
	/// <param name="to"></param>
	/// <returns></returns>
	float VectorAngle(Vector2 from, Vector2 to)
	{
		float angle;
		Vector3 cross = Vector3.Cross(from, to);
		angle = Vector2.Angle(from, to);
		return cross.z > 0 ? -angle : angle;
	}
}

Move腳本主要是根據 
deviceright.GetAxis()獲取在TouchPad中按下的位置信息,然後與(0,1)點求夾角。然後根據這個角度來判斷在按下是TouchPad的上、下、左、右。 
其實TouchPad就相當於一個半徑爲1的圓(單位圓)。而GetAxis(),就是單位圓中點的座標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章