HTC Vive基础

timg.jpg

如何获取圆盘位置

642887-99d0021207e8189e.png
20170309135850.png

public class anjiangTouch : MonoBehaviour
{
    public SteamVR_TrackedObject track;
    public SteamVR_Controller.Device device;
    void Start ()
    {
        track = GetComponent<SteamVR_TrackedObject>();
    }
    
    void Update ()
    {
        device = SteamVR_Controller.Input((int) track.index);
        if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
        {
            float angleTrue = ReturnDiretion();
            if (angleTrue>45&&angleTrue<135)
            {
                Debug.Log("下");
            }
            if (angleTrue < -45 && angleTrue > -135)
            {
                Debug.Log("上");
            }
            if (angleTrue < 180 && angleTrue > 135||(angleTrue<-135&&angleTrue>-180))
            {
                Debug.Log("左");
            }
            if (angleTrue >0  && angleTrue < 45 || (angleTrue > -45 && angleTrue < 0))
            {
                Debug.Log("右");
            }
            
        }
    }

    public  float ReturnDiretion()
    {
        Vector2 axis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad);
        Vector3 crossA = Vector3.Cross(Vector2.right, axis);
        float angle = Vector2.Angle(Vector2.right, axis);
        return crossA.z > 0 ? -angle : angle;
    }
}

手柄震动

             //左手震动  
            var device1 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost);
            SteamVR_Controller.Input(device1).TriggerHapticPulse(2000);
            // 获取左右手柄的标志
            var device2 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);
            // 设置获取手柄的震动值
            SteamVR_Controller.Input(device2).TriggerHapticPulse(100);

瞬移功能的实现

写入一下脚本并将其挂载在左手手柄或者右手手柄上,并在其上添加另一个按键脚本<SteamVR_TrackedController>

642887-d9638aef0a58609c.png

using UnityEngine;
using System.Collections;

public class CatchPointer : MonoBehaviour
{
    public bool active = true;
    public Color color;
    public float thickness = 0.002f;
    public GameObject holder;
    public GameObject pointer;
    bool isActive = false;
    public bool addRigidBody = false;
    public Transform reference;
    public event PointerEventHandler PointerIn;
    public event PointerEventHandler PointerOut;
    public Vector3 HitPoint;
    Transform previousContact = null;

    // Use this for initialization
    void Start ()
    {
        holder = new GameObject();
        holder.transform.parent = this.transform;
        holder.transform.localPosition = Vector3.zero;

        pointer = GameObject.CreatePrimitive(PrimitiveType.Cube);
        pointer.transform.parent = holder.transform;
        pointer.transform.localScale = new Vector3(thickness, thickness, 100f);
        pointer.transform.localPosition = new Vector3(0f, 0f, 50f);
        BoxCollider collider = pointer.GetComponent<BoxCollider>();
        if (addRigidBody)
        {
            if (collider)
            {
                collider.isTrigger = true;
            }
            Rigidbody rigidBody = pointer.AddComponent<Rigidbody>();
            rigidBody.isKinematic = true;
        }
        else
        {
            if(collider)
            {
                Object.Destroy(collider);
            }
        }
        Material newMaterial = new Material(Shader.Find("Unlit/Color"));
        newMaterial.SetColor("_Color", color);
        pointer.GetComponent<MeshRenderer>().material = newMaterial;
    }

    public virtual void OnPointerIn(PointerEventArgs e)
    {
        if (PointerIn != null)
            PointerIn(this, e);
    }

    public virtual void OnPointerOut(PointerEventArgs e)
    {
        if (PointerOut != null)
            PointerOut(this, e);
    }


    // Update is called once per frame
    void Update ()
    {
        if (!isActive)
        {
            isActive = true;
            this.transform.GetChild(0).gameObject.SetActive(true);
        }

        float dist = 100f;

        SteamVR_TrackedController controller = GetComponent<SteamVR_TrackedController>();

        Ray raycast = new Ray(transform.position, transform.forward);
        RaycastHit hit;
        bool bHit = Physics.Raycast(raycast, out hit);

        if(previousContact && previousContact != hit.transform)
        {
            PointerEventArgs args = new PointerEventArgs();
            if (controller != null)
            {
                args.controllerIndex = controller.controllerIndex;
            }
            args.distance = 0f;
            args.flags = 0;
            args.target = previousContact;
            OnPointerOut(args);
            previousContact = null;
        }
        if(bHit && previousContact != hit.transform)
        {
            PointerEventArgs argsIn = new PointerEventArgs();
            if (controller != null)
            {
                argsIn.controllerIndex = controller.controllerIndex;
            }
            argsIn.distance = hit.distance;
            argsIn.flags = 0;
            argsIn.target = hit.transform;
            OnPointerIn(argsIn);
            previousContact = hit.transform;
        }
        if(!bHit)
        {
            previousContact = null;
        }
        if (bHit && hit.distance < 100f)
        {
            dist = hit.distance;
        }
        if (bHit)
        {
            HitPoint = hit.point;
        }

        if (controller != null && controller.triggerPressed)
        {
            pointer.transform.localScale = new Vector3(thickness * 5f, thickness * 5f, dist);
        }
        else
        {
            pointer.transform.localScale = new Vector3(thickness, thickness, dist);
        }
        pointer.transform.localPosition = new Vector3(0f, 0f, dist/2f);
    }
}

随后我们实现传送(Test_Teleporter)脚本,并将其挂载在摄像CameraRig上,脚本编写如下:

public class Test_Teleporter : MonoBehaviour {

    // 拿到手柄对象
    public GameObject LeftController;
    //修改后的射线检测脚本
    private Test_LaserPointer Pointer;
    // 右手柄的控制器
    private SteamVR_TrackedController LeftSt;
    // 事件调用函数
    ClickedEventHandler ce;
    // 当前的目标位置
    Transform currentTransform;
    // 碰撞事件
    PointerEventArgs arg;
    void Start()
    {
        Pointer = LeftController.GetComponent<Test_LaserPointer>();
        LeftSt = LeftController.GetComponent<SteamVR_TrackedController>();
        // 利用Laserpoint里面的事件函数来检测目标位置
        Pointer.PointerIn += LeftPointIn;
        //  利用Laserpoint里面的事件函数来检测目标位置
        Pointer.PointerOut += LeftPointOut;
        // 利用手柄控制器来检测我们的扳机事件
        LeftSt.TriggerClicked += TriggerClicked;
    }

    // 没有检测到碰撞信息
    void LeftPointOut(object sender, PointerEventArgs e)
    {   // 当前位置没有
        currentTransform = null;
    }
    // 检测到碰撞信息
    void LeftPointIn(object sender, PointerEventArgs e)
    {   // 设置目标位置为检测到的目标
        currentTransform = e.target;
    }
    // 扳机事件
    void TriggerClicked(object sender, ClickedEventArgs e)
    {
        // 如果检测到目标位置
        if (currentTransform != null)
        {    // 移动
            this.gameObject.transform.position = new Vector3(Pointer.HitPoint.x - LeftController.transform.localPosition.x, Pointer.HitPoint.y, Pointer.HitPoint.z - LeftController.transform.localPosition.z);
        }
    }
}

子弹发射功能的实现

public class TrackedController_shoot : 
SteamVR_TrackedController {
        void Start () {
        base.Start();
    }

    void Update () {
        base.Update();
    }

 public override void OnTriggerClicked(ClickedEventArgs e)
    {
        GameObject go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        go.transform.position = this.gameObject.transform.position;
        go.transform.localScale = new Vector3(0.1f,0.1f,0.1f);
        go.AddComponent<Rigidbody>().AddForce(this.transform.forward * 100);
        go.tag = "Super";
    }
}

隔空取物功能的实现

首先需要给物体添加刚体并且设置其Is Kinematic为true.然后给其写入代码如下:

  // 检测手柄指向物体或离开物体
    SteamVR_LaserPointer l;
    // 手柄事件系统
    SteamVR_TrackedController t;
    Transform pointT;
    GameObject currentCatch;
    void Start () {

        l = GetComponent<SteamVR_LaserPointer>();
        l.PointerIn += PointerIn;
        l.PointerOut += PointerOut;

        t = GetComponent<SteamVR_TrackedController>();
        t.TriggerClicked += TriggerClicked;
        t.TriggerUnclicked += TriggerUnclicked;
    }

    void PointerIn(object sender, PointerEventArgs e)
    {
        if (e.target.gameObject.tag == "Super")
        {
            pointT = e.target;
        }
    }
    void PointerOut(object sender, PointerEventArgs e)
    {
        pointT = null;
    }
    void TriggerClicked(object sender, ClickedEventArgs e)
    {
        if (pointT == null)
        {
            return;
        }
        pointT.position = this.transform.position;
        pointT.gameObject.AddComponent<FixedJoint>().connectedBody = this.GetComponent<Rigidbody>();
        currentCatch = pointT.gameObject;
    }
    void TriggerUnclicked(object sender, ClickedEventArgs e)
    {
        if (currentCatch == null)
        {
            return;
        }
        var device = SteamVR_Controller.Input((int)this.GetComponent<SteamVR_TrackedObject>().index);
        device.TriggerHapticPulse(2800);
        // 松开将速度传递给物体
        currentCatch.GetComponent<Rigidbody>().velocity = device.velocity * 5;
        currentCatch.GetComponent<Rigidbody>().angularVelocity = device.angularVelocity;
        Destroy(currentCatch.GetComponent<FixedJoint>();
        currentCatch = null;

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容