开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1532

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2200|回复: 34

[决晴谷] SteamVR:Easy Vive(一)

[复制链接]  [移动端链接]
排名
15097
昨日变化
7

8

主题

34

帖子

538

积分

Rank: 9Rank: 9Rank: 9

UID
130021
好友
10
蛮牛币
253
威望
0
注册时间
2015-11-26
在线时间
102 小时
最后登录
2017-1-12

专栏作家

QQ
发表于 2016-8-2 23:52:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x

本章节主要讲解使用SteamVR Plugins插件为基础,来介绍Vive开发的入门,重点讲解设备的激活和控制接口。SteamVR Pluginsunity官方资源商店可以免费下载,这里我就不给出链接了。
导入SteamVR Plugins后,不要在他的示例上去做开发,那样你会走弯路。因为这个插件的设备初始化代码很怪异,甚至可以说无法使用。因此我们需要自己写设备的初始化代码以及设备的操作接口。
我们对原插件进行封装后就可以愉快的使用了,之后怎么开发就和这个设备无关了,我们开发这类的应用无非是获取相关的接口操作。
新建场景,然后在Camera上添加组件SteamVR_Camera,然后点击 Expand 按钮,之后我们就得到了一个基本的VR相机。
然后我们在Camera的下面新建两个GameObject,并命名为LeftHandRightHand。同时添加组件SteamVR_TrackedObject。然后在各自的下面添加一个对象名为Mode,并绑定组件SteamVR_RenderModel。
如下图所示:
E)_1D45)GJD{~D2WTCSDF]T.png
如果对这些步骤有疑问,可以查看百度文库按照上面的操作完成基本的对象搭建操作:http://wenku.baidu.com/view/eaaec2f058fb770bf68a55b1.html
接下来就是开始撸代码了,新建脚本SteamVR_InitManager.cs,来获取手柄的激活和相关的初始化代码。
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using Valve.VR;
using System;
public class SteamVR_InitManager : MonoBehaviour
{
    public event Action<SteamVR_TrackedObject> OnLeftDeviceActive;//左手柄激活事件
    public event Action<SteamVR_TrackedObject> OnRightDeviceActive;//右手柄激活事件

    public SteamVR_TrackedObject LeftObject;
    public SteamVR_TrackedObject RightObject;

    private bool[] isAllConnect;//0代表右手状态,1代表左手状态
    private uint leftIndex = 100;//左手柄对应的设备ID
    private uint rightIndex = 100;//右手柄对应的设备ID


    private static SteamVR_InitManager instance;

    public static SteamVR_InitManager Instance {
        get {
            if (instance == null) {
                instance = GameObject.FindObjectOfType<SteamVR_InitManager>(); 
            }
            return instance;
        }
    }

    // Use this for initialization
    void Awake()
    {
        LeftObject = transform.FindChild("LeftHand").GetComponent<SteamVR_TrackedObject>();
        RightObject = transform.FindChild("RightHand").GetComponent<SteamVR_TrackedObject>();
        LeftObject.gameObject.SetActive(false);
        RightObject.gameObject.SetActive(false);
    }
    void Start()
    {
        StartCoroutine(CheckDeviceActive());
    }
    void OnEnable()
    {
        OnLeftDeviceActive += LeftDeviceActive;
        OnRightDeviceActive += RightDeviceActive;
    }
    void OnDisable()
    {
        OnLeftDeviceActive -= LeftDeviceActive;
        OnRightDeviceActive -= RightDeviceActive;
    }

    /// <summary>
    /// 检测手柄设备是否激活
    /// </summary>
    /// <returns></returns>
    IEnumerator CheckDeviceActive()
    {
        yield return new WaitForSeconds(1);
        while (!isAllConnect[0] || !isAllConnect[1])
        {
            for (uint i = 1; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
            {
                if (i == leftIndex || i == rightIndex) continue;//已经初始化的不再进入判断
                if (OpenVR.System != null && OpenVR.System.IsTrackedDeviceConnected(i))
                {
                    OnDeviceConnected(new object[] { i, true });
                }
            }

            yield return new WaitForFixedUpdate();
        }

        yield return 0;
    }

    /// <summary>
    /// 检测激活的设备是否是手柄
    /// </summary>
    /// <param name="args"></param>
    private void OnDeviceConnected(object[] args)
    {
        if (args != null && args.Length > 1)
        {
            uint index = (uint)args[0];
            bool isConnect = (bool)args[1];
            var system = OpenVR.System;
            if (isConnect && system != null && system.GetTrackedDeviceClass(index) == ETrackedDeviceClass.Controller)
            {
                uint tmpleftIndex = (uint)system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
                uint tmprightIndex = (uint)system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
                if (index == tmprightIndex)
                {
                    isAllConnect[0] = true;
                    rightIndex = index;
                    OnRightDeviceActive(RightObject);
                }
                else if (index == tmpleftIndex)
                {
                    isAllConnect[1] = true;
                    leftIndex = index;
                    OnLeftDeviceActive(LeftObject);
                }
            }
        }
    }

    private void RightDeviceActive(SteamVR_TrackedObject obj)
    {
        DeviceActive(obj, rightIndex);
    }

    private void LeftDeviceActive(SteamVR_TrackedObject obj)
    {
        DeviceActive(obj, leftIndex);
    }
    /// <summary>
    /// 匹配对应的设备号,完成手柄模型的设置
    /// </summary>
    /// <param name="device"></param>
    /// <param name="index"></param>
    void DeviceActive(SteamVR_TrackedObject device, uint index)
    {
        SteamVR_TrackedObject.EIndex eIndex = (SteamVR_TrackedObject.EIndex)Enum.Parse(typeof(SteamVR_TrackedObject.EIndex), "Device" + index);
        device.index = eIndex;
        device.GetComponentInChildren<SteamVR_RenderModel>().index = eIndex;
        device.gameObject.SetActive(true);
    }

}

然后就是大家比较关心的手柄控制接口代码DeviceInput.cs,我基本上把所有的手柄控制事件都写完了.这个脚本添加到左右Hand对象上就行了。
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System;
using Valve.VR;
public class DeviceInput : MonoBehaviour {
    //Swipe directions
    public enum SwipeDirection
    {
        NONE,
        UP,
        DOWN,
        LEFT,
        RIGHT
    };
    public event Action OnPressTrigger;    //按住扳机键                            
    public event Action OnPressDownTrigger;  // 按下扳机键                             
    public event Action OnPressUpTrigger;    //抬起扳机键                               
    public event Action OnTouchPad;      //按住触摸板                        

    public event Action OnPressDownGripButton;   //按下侧键                           
    public event Action OnPressDownMenuButton;   //按下菜单键                          
    public event Action<Vector2> OnBeginTouch;  //触摸触摸板的位置                                 
    public event Action<Vector2> OnEndTouch;//抬起触摸板的位置

    public event Action OnTouchPadDown;  //按下触摸板                               
    public event Action OnTouchPadUp;//抬起触摸板
    public event Action<SwipeDirection> OnPadSwipe;

    [SerializeField]
    private float m_SwipeWidth = 0.6f;         //The width of a swipe


    private Vector2 m_PadDownPosition;                        
    private float m_LastHorizontalValue;                       
    private float m_LastVerticalValue;                          

    private SteamVR_TrackedObject Hand;


    private SteamVR_Controller.Device device;
    private Vector2 m_PadPosition;

    public void Start()
    {
        Hand = GetComponent<SteamVR_TrackedObject>();
    }

    public void Update()
    {
        CheckInput();
    }

    private void CheckInput()
    {
        // Set the default swipe to be none.
        SwipeDirection swipe = SwipeDirection.NONE;
        if (device == null)
        {
            device = SteamVR_Controller.Input((int)Hand.index);
            print("NUll Device");
            return;
        }
        if (device.GetPress(EVRButtonId.k_EButton_SteamVR_Trigger))
        {
            if (OnPressTrigger != null) OnPressTrigger();
        }
        if (device.GetPressDown(EVRButtonId.k_EButton_SteamVR_Trigger))
        {
            if (OnPressDownTrigger != null) OnPressDownTrigger();

        }
        if (device.GetPressUp(EVRButtonId.k_EButton_SteamVR_Trigger))
        {
            if (OnPressUpTrigger != null) OnPressUpTrigger();
        }

        if (device.GetTouch(EVRButtonId.k_EButton_SteamVR_Touchpad))
        {
            if (OnTouchPad != null) OnTouchPad();
            m_PadPosition = device.GetAxis();
        }
        if (device.GetTouchUp(EVRButtonId.k_EButton_SteamVR_Touchpad))
        {
            if (OnTouchPadUp != null) OnTouchPadUp();
            if (OnEndTouch != null) OnEndTouch(m_PadPosition);
            swipe = DetectSwipe();
            m_PadDownPosition = Vector2.zero;
        }
        if (device.GetTouchDown(EVRButtonId.k_EButton_SteamVR_Touchpad))
        {
            if (OnTouchPadDown != null) OnTouchPadDown();
            if (OnBeginTouch != null) OnBeginTouch(m_PadDownPosition = device.GetAxis());
        }
        if (device.GetPressDown(EVRButtonId.k_EButton_Grip))
        {
            if (OnPressDownGripButton != null) { OnPressDownGripButton(); }
        }
        if (device.GetPressDown(EVRButtonId.k_EButton_ApplicationMenu))
        {
            if (OnPressDownMenuButton != null) OnPressDownMenuButton();
        }
        if (swipe != SwipeDirection.NONE)
        {
            OnPadSwipe(swipe);
            if (device.GetTouch(EVRButtonId.k_EButton_SteamVR_Touchpad))
            {
                m_PadPosition = device.GetAxis();
            }
            else {
                m_PadDownPosition = Vector2.zero;
            }
        }
    }

    private SwipeDirection DetectSwipe()
    {
        Vector2 swipeData = (m_PadPosition - m_PadDownPosition).normalized;

        bool swipeIsVertical = Mathf.Abs(swipeData.y) > m_SwipeWidth;

        bool swipeIsHorizontal = Mathf.Abs(swipeData.x) > m_SwipeWidth;
        if (swipeData.y > 0f && swipeIsVertical)
            return SwipeDirection.UP;

        if (swipeData.y < 0f && swipeIsVertical)
            return SwipeDirection.DOWN;

        if (swipeData.x > 0f && swipeIsHorizontal)
            return SwipeDirection.RIGHT;

        if (swipeData.x < 0f && swipeIsHorizontal)
            return SwipeDirection.LEFT;

        return SwipeDirection.NONE;
    }

    public void OnDisEnable()
    {
        OnPressTrigger = null;    //按住扳机键                            
        OnPressDownTrigger = null;  // 按下扳机键                             
        OnPressUpTrigger = null;    //抬起扳机键                               
        OnTouchPad = null;      //按住触摸板                        
        OnPressDownGripButton = null;   //按下侧键                           
        OnPressDownMenuButton = null;   //按下菜单键                          
        OnBeginTouch = null;  //触摸触摸板的位置                                 
        OnEndTouch = null;//抬起触摸板的位置
        OnTouchPadDown = null;  //按下触摸板                               
        OnTouchPadUp = null;//抬起触摸板
        OnPadSwipe = null;
    }

}


OK,接下来写一个简单的测试类来测试相关的代码:TestEvent.cs
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System;
/// <summary>
/// 这是一个测试类,简单的测试了手柄的激活以及部分手柄的操作事件
/// 两个手柄分开注册,这样扩展性非常好,相同的按键可以做不同的处理
/// 大家可以补充测试
/// </summary>
public class TestEvent : MonoBehaviour {

    void OnEnable() {
        SteamVR_InitManager.Instance.OnLeftDeviceActive += OnLeftDeviceActive;//左手柄激活
        SteamVR_InitManager.Instance.OnRightDeviceActive += OnRightDeviceActive;//右手柄激活
    }

    private void OnRightDeviceActive(SteamVR_TrackedObject obj)
    {
        print("OnRightDeviceActive"+obj);
        SteamVR_InitManager.Instance.RightHandInput.OnPressDownTrigger += OnPressDownTrigger;
        SteamVR_InitManager.Instance.RightHandInput.OnTouchPadDown += OnTouchPadDown;
    }

    private void OnPressDownTrigger()
    {
        print("OnPressDownTrigger");
    }

    private void OnTouchPadDown()
    {
        print("OnTouchPadDown");
    }

    private void OnLeftDeviceActive(SteamVR_TrackedObject obj)
    {
        print("OnLeftDeviceActive" + obj);
        SteamVR_InitManager.Instance.LeftHandInput.OnPressDownTrigger += OnPressDownTrigger;
        SteamVR_InitManager.Instance.LeftHandInput.OnTouchPadDown += OnTouchPadDown;

    }

    void OnDisable() {
        SteamVR_InitManager.Instance.OnLeftDeviceActive -= OnLeftDeviceActive;//左手柄激活
        SteamVR_InitManager.Instance.OnRightDeviceActive -= OnRightDeviceActive;//右手柄激活
    }
}

下一章我主要介绍手柄和射线事件的相结合代码,以及抛物线的绘制和移动,欢迎大家关注



评分

参与人数 1鲜花 +2 收起 理由
fwfawfsadf + 2

查看全部评分


回复

使用道具 举报

6蛮牛粉丝
1171/1500
排名
1163
昨日变化
7

0

主题

91

帖子

1171

积分

Rank: 6Rank: 6Rank: 6

UID
35660
好友
0
蛮牛币
1619
威望
0
注册时间
2014-7-22
在线时间
408 小时
最后登录
2017-1-20
发表于 2016-8-3 09:37:41 | 显示全部楼层
写的挺好的,收获蛮多,期待下一篇更加精彩。。。

回复 支持 反对

使用道具 举报

5熟悉之中
540/1000
排名
3825
昨日变化
24

3

主题

82

帖子

540

积分

Rank: 5Rank: 5

UID
144553
好友
3
蛮牛币
1564
威望
0
注册时间
2016-4-5
在线时间
213 小时
最后登录
2017-1-20
发表于 2016-8-3 09:38:55 | 显示全部楼层
沙发,点赞

回复

使用道具 举报

5熟悉之中
778/1000
排名
2036
昨日变化

0

主题

87

帖子

778

积分

Rank: 5Rank: 5

UID
78949
好友
0
蛮牛币
843
威望
0
注册时间
2015-3-11
在线时间
233 小时
最后登录
2017-1-20
发表于 2016-8-3 11:19:07 | 显示全部楼层
学习学习,感谢分享!
[发帖际遇]: silenthill 捡了钱没交公 蛮牛币 降了 2 . 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
663/1000
排名
3117
昨日变化
5

0

主题

85

帖子

663

积分

Rank: 5Rank: 5

UID
52616
好友
1
蛮牛币
1387
威望
0
注册时间
2014-11-2
在线时间
278 小时
最后登录
2016-12-30
QQ
发表于 2016-8-3 12:07:51 | 显示全部楼层
期待抛物线

回复

使用道具 举报

1

主题

7

帖子

32

积分

Rank: 1

UID
54123
好友
0
蛮牛币
41
威望
0
注册时间
2014-11-8
在线时间
26 小时
最后登录
2016-8-19
发表于 2016-8-3 13:20:41 | 显示全部楼层
好帖,顶一个!

回复

使用道具 举报

6蛮牛粉丝
1499/1500
排名
1416
昨日变化
4

5

主题

280

帖子

1499

积分

Rank: 6Rank: 6Rank: 6

UID
137142
好友
1
蛮牛币
6306
威望
0
注册时间
2016-2-21
在线时间
592 小时
最后登录
2017-1-20
发表于 2016-8-3 13:34:41 | 显示全部楼层
自己封装 赞

回复

使用道具 举报

3偶尔光临
243/300
排名
5961
昨日变化
2

2

主题

41

帖子

243

积分

Rank: 3Rank: 3Rank: 3

UID
158341
好友
0
蛮牛币
446
威望
0
注册时间
2016-7-28
在线时间
64 小时
最后登录
2017-1-14
发表于 2016-8-3 15:04:25 | 显示全部楼层
继续关注楼主的文章,谢谢分享
[发帖际遇]: 一个袋子砸在了 aoyoo 头上,aoyoo 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
284/300
排名
8170
昨日变化
4

1

主题

68

帖子

284

积分

Rank: 3Rank: 3Rank: 3

UID
60012
好友
0
蛮牛币
2297
威望
0
注册时间
2014-12-8
在线时间
133 小时
最后登录
2016-11-2
发表于 2016-8-3 20:03:37 | 显示全部楼层
楼主您好,发现一个问题.在SteamVR_InitManager类中,并没有测试类RightHandInput的实现?请问SteamVR_InitManager是不是没有写全呀.求学习

回复 支持 反对

使用道具 举报

排名
26649
昨日变化
19

0

主题

22

帖子

47

积分

Rank: 1

UID
23838
好友
0
蛮牛币
93
威望
0
注册时间
2014-5-4
在线时间
19 小时
最后登录
2016-9-25
QQ
发表于 2016-8-3 20:08:19 | 显示全部楼层
yilianxin 发表于 2016-8-3 20:03
楼主您好,发现一个问题.在SteamVR_InitManager类中,并没有测试类RightHandInput的实现?请问SteamVR_InitMan ...

多谢提醒,的确是少了几行代码,今晚回家补全。其实很简单了,激活手柄后获取对应手柄的DeviceInput就行了,我会补全的

回复 支持 反对

使用道具 举报

排名
26649
昨日变化
19

0

主题

22

帖子

47

积分

Rank: 1

UID
23838
好友
0
蛮牛币
93
威望
0
注册时间
2014-5-4
在线时间
19 小时
最后登录
2016-9-25
QQ
发表于 2016-8-3 20:08:53 | 显示全部楼层
yilianxin 发表于 2016-8-3 20:03
楼主您好,发现一个问题.在SteamVR_InitManager类中,并没有测试类RightHandInput的实现?请问SteamVR_InitMan ...

多谢提醒,的确是少了几行代码,今晚回家补全。其实很简单了,激活手柄后获取对应手柄的DeviceInput就行了,我会补全的。

回复 支持 反对

使用道具 举报

5熟悉之中
743/1000
排名
7666
昨日变化
11

3

主题

102

帖子

743

积分

Rank: 5Rank: 5

UID
58132
好友
0
蛮牛币
103
威望
0
注册时间
2014-11-27
在线时间
533 小时
最后登录
2017-1-20
发表于 2016-8-3 21:44:09 | 显示全部楼层
手柄的获取是自动的么,,index也是固定的么,,,有时候明明两个手柄都激活了,在场景中却仅仅显示一个手柄,,,另一个很难获取的到

回复 支持 反对

使用道具 举报

排名
15097
昨日变化
7

8

主题

34

帖子

538

积分

Rank: 9Rank: 9Rank: 9

UID
130021
好友
10
蛮牛币
253
威望
0
注册时间
2015-11-26
在线时间
102 小时
最后登录
2017-1-12

专栏作家

QQ
 楼主| 发表于 2016-8-3 21:46:48 | 显示全部楼层
抱歉,昨天复制代码错了,现在补上完整的代码


[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using Valve.VR;
using System;
public class SteamVR_InitManager : MonoBehaviour
{
    public event Action<SteamVR_TrackedObject> OnLeftDeviceActive;//左手柄激活事件
    public event Action<SteamVR_TrackedObject> OnRightDeviceActive;//右手柄激活事件

    public SteamVR_TrackedObject LeftObject;
    public SteamVR_TrackedObject RightObject;

    private bool[] isAllConnect;//0代表右手状态,1代表左手状态
    private uint leftIndex = 100;//左手柄对应的设备ID
    private uint rightIndex = 100;//右手柄对应的设备ID


    private static SteamVR_InitManager instance;

    public DeviceInput LeftHandInput;
    public DeviceInput RightHandInput;
    public static SteamVR_InitManager Instance {
        get {
            if (instance == null) {
                instance = GameObject.FindObjectOfType<SteamVR_InitManager>(); 
            }
            return instance;
        }
    }

    // Use this for initialization
    void Awake()
    {
        LeftObject = transform.FindChild("LeftHand").GetComponent<SteamVR_TrackedObject>();
        RightObject = transform.FindChild("RightHand").GetComponent<SteamVR_TrackedObject>();
        LeftObject.gameObject.SetActive(false);
        RightObject.gameObject.SetActive(false);
    }
    void Start()
    {
        StartCoroutine(CheckDeviceActive());
    }
    void OnEnable()
    {
        OnLeftDeviceActive += LeftDeviceActive;
        OnRightDeviceActive += RightDeviceActive;
    }
    void OnDisable()
    {
        OnLeftDeviceActive -= LeftDeviceActive;
        OnRightDeviceActive -= RightDeviceActive;
    }

    /// <summary>
    /// 检测手柄设备是否激活
    /// </summary>
    /// <returns></returns>
    IEnumerator CheckDeviceActive()
    {
        yield return new WaitForSeconds(1);
        while (!isAllConnect[0] || !isAllConnect[1])
        {
            for (uint i = 1; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
            {
                if (i == leftIndex || i == rightIndex) continue;//已经初始化的不再进入判断
                if (OpenVR.System != null && OpenVR.System.IsTrackedDeviceConnected(i))
                {
                    OnDeviceConnected(new object[] { i, true });
                }
            }

            yield return new WaitForFixedUpdate();
        }

        yield return 0;
    }

    /// <summary>
    /// 检测激活的设备是否是手柄
    /// </summary>
    /// <param name="args"></param>
    private void OnDeviceConnected(object[] args)
    {
        if (args != null && args.Length > 1)
        {
            uint index = (uint)args[0];
            bool isConnect = (bool)args[1];
            var system = OpenVR.System;
            if (isConnect && system != null && system.GetTrackedDeviceClass(index) == ETrackedDeviceClass.Controller)
            {
                uint tmpleftIndex = (uint)system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
                uint tmprightIndex = (uint)system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
                if (index == tmprightIndex)
                {
                    isAllConnect[0] = true;
                    rightIndex = index;
                    OnRightDeviceActive(RightObject);
                }
                else if (index == tmpleftIndex)
                {
                    isAllConnect[1] = true;
                    leftIndex = index;
                    OnLeftDeviceActive(LeftObject);
                }
            }
        }
    }

    private void RightDeviceActive(SteamVR_TrackedObject obj)
    {
        DeviceActive(obj, rightIndex);
        RightHandInput = obj.GetComponent<DeviceInput>();
    }

    private void LeftDeviceActive(SteamVR_TrackedObject obj)
    {
        DeviceActive(obj, leftIndex);
        LeftHandInput = obj.GetComponent<DeviceInput>(); 
    }
    /// <summary>
    /// 匹配对应的设备号,完成手柄模型的设置
    /// </summary>
    /// <param name="device"></param>
    /// <param name="index"></param>
    void DeviceActive(SteamVR_TrackedObject device, uint index)
    {
        SteamVR_TrackedObject.EIndex eIndex = (SteamVR_TrackedObject.EIndex)Enum.Parse(typeof(SteamVR_TrackedObject.EIndex), "Device" + index);
        device.index = eIndex;
        device.GetComponentInChildren<SteamVR_RenderModel>().index = eIndex;
        device.gameObject.SetActive(true);
    }

}




回复 支持 反对

使用道具 举报

排名
15097
昨日变化
7

8

主题

34

帖子

538

积分

Rank: 9Rank: 9Rank: 9

UID
130021
好友
10
蛮牛币
253
威望
0
注册时间
2015-11-26
在线时间
102 小时
最后登录
2017-1-12

专栏作家

QQ
 楼主| 发表于 2016-8-3 21:51:34 | 显示全部楼层
悲梦天下 发表于 2016-8-3 21:44
手柄的获取是自动的么,,index也是固定的么,,,有时候明明两个手柄都激活了,在场景中却仅仅显示一个手 ...

index不是固定的,刚开始不了解他的初始化代码结果犯了很低级的错误走了弯路,后来看了他初始化代码,简直不能用,所以我自己封装了手柄初始化事件还有手柄的监听事件。
我封装后的代码解决了设备初始化问题,可以显示模型,任意时刻激活模型都行的。欢迎测试!

点评

暂时未发现什么问题. 提个建议:希望作者可以在案例后附一个unitypackage,有时候也就是随手的事情.但是可以帮助很多初学的新人.. 再次谢谢作者的分享  发表于 2016-8-3 22:55

回复 支持 1 反对 0

使用道具 举报

3偶尔光临
284/300
排名
8170
昨日变化
4

1

主题

68

帖子

284

积分

Rank: 3Rank: 3Rank: 3

UID
60012
好友
0
蛮牛币
2297
威望
0
注册时间
2014-12-8
在线时间
133 小时
最后登录
2016-11-2
发表于 2016-8-3 23:19:21 | 显示全部楼层
本帖最后由 yilianxin 于 2016-8-3 23:26 编辑

貌似发现问题,.如果在手柄关闭的情况下.可以激活模型.但是如果关闭手柄.....画面中模型还存在....其次触摸方向盘时,会引发以下错误
NullReferenceException: Object reference not set to an instance of an object
DeviceInput.CheckInput () (at Assets/__Script/Unit/GameController/DeviceInput.cs:151)
DeviceInput.Update () (at Assets/__Script/Unit/GameController/DeviceInput.cs:97)


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表