這篇文章主要寫的是通過手柄控制移動在場景中漫遊。
在通過手柄控制移動時,我主要寫了兩個腳本一個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(),就是單位圓中點的座標。