Unity一HTC 手柄控制主角行走

来源:互联网 发布:安踏网络授权 编辑:程序博客网 时间:2024/05/16 11:44

实现:头盔转动控制移动的方向,手柄中touchPad的上、下、左、右控制移动的向前、向左、向右、向后移动

  1. 设置头部
  2. using UnityEngine;  
  3. using System.Collections;  
  4.   
  5. public class ChildTransform : MonoBehaviour  
  6. {  
  7.   
  8.     public Transform same;  
  9.   
  10.     // Use this for initialization  
  11.     void Start () {  
  12.       
  13.     }  
  14.       
  15.     // Update is called once per frame  
  16.     void FixedUpdate () {  
  17.   
  18.         transform.localEulerAngles = new Vector3(0,same.localEulerAngles.y,0);  
  19.   
  20.         transform.localPosition = new Vector3(same.localPosition.x, 0, same.localPosition.z);  
  21.     }  
  22. }  


  1. 设置移动
  2. using UnityEngine;  
  3. using System.Collections;  
  4.   
  5. public class Move : BaseClass  
  6. {  
  7.     /// <summary>  
  8.     /// 手柄位置  
  9.     /// </summary>  
  10.     SteamVR_TrackedObject tracked;  
  11.   
  12.   
  13.     /// <summary>  
  14.     /// 玩家  
  15.     /// </summary>  
  16.     public Transform player;  
  17.   
  18.     /// <summary>  
  19.     /// 方向   
  20.     /// </summary>  
  21.     public Transform dic;  
  22.   
  23.     /// <summary>  
  24.     /// 速度  
  25.     /// </summary>  
  26.     public float speed;  
  27.   
  28.     void Awake()  
  29.     {  
  30.         //获取手柄控制  
  31.         tracked = GetComponent<SteamVR_TrackedObject>();  
  32.   
  33.     }  
  34.   
  35.     // Use this for initialization  
  36.     void Start () {  
  37.       
  38.     }  
  39.       
  40.     // Update is called once per frame  
  41.     void FixedUpdate () {  
  42.         var deviceright = SteamVR_Controller.Input((int)tracked.index);  
  43.   
  44.   
  45.         //按下圆盘键  
  46.         if (deviceright.GetPress(SteamVR_Controller.ButtonMask.Touchpad))  
  47.         {  
  48.   
  49.             Vector2 cc = deviceright.GetAxis();  
  50.   
  51.             float angle = VectorAngle(new Vector2(1, 0), cc);  
  52.   
  53.             //下  
  54.             if (angle > 45 && angle < 135)  
  55.             {  
  56.   
  57.                 player.Translate(-dic.forward * Time.deltaTime * speed);  
  58.             }  
  59.             //上    
  60.             else if (angle < -45 && angle > -135)  
  61.             {  
  62.                 //Debug.Log("上");  
  63.                 player.Translate(dic.forward * Time.deltaTime * speed);  
  64.             }  
  65.             //左    
  66.             else if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180))  
  67.             {  
  68.                 //Debug.Log("左");  
  69.                 player.Translate(-dic.right * Time.deltaTime * speed);  
  70.             }  
  71.             //右    
  72.             else if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0))  
  73.             {  
  74.                 //Debug.Log("右");  
  75.                 player.Translate(dic.right * Time.deltaTime * speed);  
  76.             }  
  77.   
  78.         }  
  79.     }  
  80.   
  81.   
  82.   
  83.     /// <summary>  
  84.     /// 根据在圆盘才按下的位置,返回一个角度值  
  85.     /// </summary>  
  86.     /// <param name="from"></param>  
  87.     /// <param name="to"></param>  
  88.     /// <returns></returns>  
  89.     float VectorAngle(Vector2 from, Vector2 to)  
  90.     {  
  91.         float angle;  
  92.         Vector3 cross = Vector3.Cross(from, to);  
  93.         angle = Vector2.Angle(from, to);  
  94.         return cross.z > 0 ? -angle : angle;  
  95.     }  
  96.   
  97. }  


0 0