【VR】(一)Unity3d开发 VR使用手柄圆盘控制 人物移动(平移)

举报
恬静的小魔龙 发表于 2021/10/14 09:03:55 2021/10/14
【摘要】 推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875 一、前言HTC vive手柄各个按钮的响应事件,已实现的功能是按手柄上的原盘上下左右键移动,是平移,不是射线瞬移。这种方式在眼镜里太晕了。 二、代码using UnityEngine; using System.Collections; public class Move ...

推荐阅读

一、前言

HTC vive手柄各个按钮的响应事件,已实现的功能是按手柄上的原盘上下左右键移动,是平移,不是射线瞬移。这种方式在眼镜里太晕了。

二、代码

using UnityEngine;  
using System.Collections;  
  
public class Move : MonoBehaviour {  
  
    /// <summary>    
    /// 手柄位置    
    /// </summary>    
    SteamVR_TrackedObject tracked;  
  
  
    /// <summary>    
    /// 玩家    
    /// </summary>    
    public Transform player;  
  
    /// <summary>    
    /// 方向     
    /// </summary>    
    public Transform dic;  
  
    /// <summary>    
    /// 速度    
    /// </summary>    
    public float speed;  
  
    void Awake()  
    {  
        //获取手柄控制    
        tracked = GetComponent<SteamVR_TrackedObject>();  
  
    }  
  
    // Use this for initialization    
    void Start()  
    {  
  
    }  
  
    // Update is called once per frame    
    void FixedUpdate()  
    {  
        var deviceright = SteamVR_Controller.Input((int)tracked.index);  
  
  
        //按下圆盘键    
        if (deviceright.GetPress(SteamVR_Controller.ButtonMask.Touchpad))  
        {  
  
            Vector2 cc = deviceright.GetAxis();  
  
            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);  
            }  
        }  
        else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))  
        {  
  
            Debug.Log("按下扳机键");  
        }  
        else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.Grip))  
        {  
  
            Debug.Log("按下手柄侧键");  
        }  
        else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))  
        {  
  
            Debug.Log("按下手柄菜单键");  
        }  
        else if (deviceright.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))  
        {  
  
            Debug.Log("按下手柄菜单键");  
        }  
    }  
  
  
  
    /// <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;  
    }  
}  
```
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。