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

扫一扫,访问微社区

问答求助

关注:485

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 705|回复: 14

[技术讨论] 关于射线与button时间问题

[复制链接]  [移动端链接]
6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
发表于 2016-12-15 09:58:04 | 显示全部楼层 |阅读模式
15蛮牛币
先上部分代码
private void Start()
    {
        if (GetComponent<VRTK_UIPointer>() == null)
        {
            Debug.LogError("VRTK_ControllerUIPointerEvents_ListenerExample is required to be attached to a Controller that has the VRTK_UIPointer script attached to it");
            return;
        }

        if (togglePointerOnHit)
        {
            GetComponent<VRTK_UIPointer>().activationMode = VRTK_UIPointer.ActivationMethods.Always_On;
        }

        //Setup controller event listeners
        GetComponent<VRTK_UIPointer>().UIPointerElementEnter += VRTK_ControllerUIPointerEvents_ListenerExample_UIPointerElementEnter;
        GetComponent<VRTK_UIPointer>().UIPointerElementExit += VRTK_ControllerUIPointerEvents_ListenerExample_UIPointerElementExit;
    }

    private void VRTK_ControllerUIPointerEvents_ListenerExample_UIPointerElementEnter(object sender, UIPointerEventArgs e)
    {
        Debug.Log("UI Pointer entered " + e.currentTarget.name + " on Controller index [" + e.controllerIndex + "]");      
  if (e.currentTarget.name.Contains("PlayButton") && GetComponent<VRTK_ControllerEvents>().triggerPressed)
        {
            //timelimit += Time.deltaTime
            string sceneindex = e.currentTarget.name.Substring(10, 2);
}
}
}




最近想做一个射线停留在按钮3S后,才触发某个事件。射线是按住扳机键一直触发,然后我想的是直接在触发中计算停留时间,大概就是timelimit += Time.deltaTime。但是我发现射线检测到指定按钮,射线效果虽然在,但是射线事件其实就停止了,timelimit += Time.deltaTime一直都是0.1xxxxxS,没有叠加,这样我发现完全没法计算出停留时间,有大神来帮忙解决下么?或者懂得朋友来讨论下,谢谢了

[发帖际遇]: innaturegod 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

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

3

主题

56

帖子

663

积分

Rank: 5Rank: 5

UID
185831
好友
0
蛮牛币
1546
威望
0
注册时间
2016-11-22
在线时间
236 小时
最后登录
2017-10-20
QQ
发表于 2016-12-15 09:58:05 | 显示全部楼层
你可以用  协程 IEnumerator  来做

回复

使用道具 举报

6蛮牛粉丝
1368/1500
排名
1656
昨日变化
5

3

主题

270

帖子

1368

积分

Rank: 6Rank: 6Rank: 6

UID
130474
好友
0
蛮牛币
2452
威望
0
注册时间
2015-12-1
在线时间
445 小时
最后登录
2017-10-19
发表于 2016-12-15 10:19:24 | 显示全部楼层
估计是检测到按钮,然后只触发了一次,只有不停的触发,时间才会累积叠加。看看按钮是触发一次的函数还是连续触发的

回复

使用道具 举报

6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
 楼主| 发表于 2016-12-15 10:34:24 | 显示全部楼层
mofans 发表于 2016-12-15 10:19
估计是检测到按钮,然后只触发了一次,只有不停的触发,时间才会累积叠加。看看按钮是触发一次的函数还是连 ...

就是射线检测按钮这个事件只触发一次。
我想的解决方法就是让按钮连续触发,然后累计时间在触发另一个事件,这方法我还在试。
但是我想,射线检测按钮这个事件,这块代码就不能连续检查么?我用的VRTK有这样的方法吗?我很想讨论下这个。。。

回复

使用道具 举报

6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
 楼主| 发表于 2016-12-15 10:40:04 | 显示全部楼层
王港 发表于 2016-12-15 10:29
你可以用  协程 IEnumerator  来做

协程怎么做呢?
if (e.currentTarget.name.Contains("PlayButton") && GetComponent<VRTK_ControllerEvents>().triggerPressed)
        {
           //协程
      StartCoroutine(do);
            //timelimit += Time.deltaTime
            string sceneindex = e.currentTarget.name.Substring(10, 2);
}
IEnumerator  do(){
debug.log("111111");
waitforsecend(time);
debug.log("222222");
}
这样么?但是它常常是执行debug.log("111111");之后,开始执行 string sceneindex = e.currentTarget.name.Substring(10, 2);之后的。然后再执行waitforsecend(time);和
debug.log("222222");

回复

使用道具 举报

4四处流浪
342/500
排名
6717
昨日变化
5

1

主题

83

帖子

342

积分

Rank: 4

UID
144935
好友
1
蛮牛币
490
威望
0
注册时间
2016-4-9
在线时间
110 小时
最后登录
2017-11-11
发表于 2016-12-15 10:47:14 | 显示全部楼层
加个bool值触发后根据时间进行重置。

回复

使用道具 举报

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

3

主题

56

帖子

663

积分

Rank: 5Rank: 5

UID
185831
好友
0
蛮牛币
1546
威望
0
注册时间
2016-11-22
在线时间
236 小时
最后登录
2017-10-20
QQ
发表于 2016-12-15 11:02:33 | 显示全部楼层
你给 string sceneindex = e.currentTarget.name.Substring(10, 2);和之后的 加个bool   在waitforsecend(time);之后更改bool的值

回复

使用道具 举报

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

3

主题

56

帖子

663

积分

Rank: 5Rank: 5

UID
185831
好友
0
蛮牛币
1546
威望
0
注册时间
2016-11-22
在线时间
236 小时
最后登录
2017-10-20
QQ
发表于 2016-12-15 11:04:48 | 显示全部楼层
或者你把之后的 直接放在协程里

回复

使用道具 举报

6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
 楼主| 发表于 2016-12-15 11:05:35 | 显示全部楼层
@峰 发表于 2016-12-15 10:47
加个bool值触发后根据时间进行重置。

嗯,不停的重置射线检查方法吗?感觉有道理啊,我去试试,谢谢

回复

使用道具 举报

6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
 楼主| 发表于 2016-12-15 11:12:45 | 显示全部楼层
王港 发表于 2016-12-15 11:04
或者你把之后的 直接放在协程里

嗯,我去试试。
不过我要求的是停留3s后进入事件,但是如果在3s内移开,它就不进入了,感觉协程不是很好办啊。
还是感谢了

回复

使用道具 举报

6蛮牛粉丝
1368/1500
排名
1656
昨日变化
5

3

主题

270

帖子

1368

积分

Rank: 6Rank: 6Rank: 6

UID
130474
好友
0
蛮牛币
2452
威望
0
注册时间
2015-12-1
在线时间
445 小时
最后登录
2017-10-19
发表于 2016-12-15 12:25:28 | 显示全部楼层
innaturegod 发表于 2016-12-15 10:34
就是射线检测按钮这个事件只触发一次。
我想的解决方法就是让按钮连续触发,然后累计时间在触发另一个事 ...

 GetComponent<VRTK_UIPointer>().UIPointerElementEnter 进入,触发进入一次。
 GetComponent<VRTK_UIPointer>().UIPointerElementExit  退出,触发退出函数一次。
所以你要看下他本身还有没有其他的触发函数,才能添加委托调用多次你的函数。
比如像按钮的按住.释放==,射线连续碰到物体==。

回复

使用道具 举报

5熟悉之中
656/1000
排名
6025
昨日变化
5

11

主题

135

帖子

656

积分

Rank: 5Rank: 5

UID
152229
好友
0
蛮牛币
2532
威望
0
注册时间
2016-6-16
在线时间
296 小时
最后登录
2017-11-22
发表于 2016-12-15 14:19:14 | 显示全部楼层
本帖最后由 wtujoxk 于 2016-12-15 14:20 编辑

这是我用两个Cube搭建的场景,你看看是不是这样的

QQ图片20161215141721.png

代码:挂在相机上
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;

///@brief
///文件名称:RayTesting
///功能描述:
///数据表:
///作者:YuXianQiang
///日期:#CreateTime#
///R1:
///修改作者:
///修改日期:
///修改理由:

public class RayTesting : MonoBehaviour 
{
    private Transform lastTr;
    private float time = 0;
    private int num = 0;
    void Update()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 500.0f))
        {
            //画一条射线
            Debug.DrawLine(ray.origin, hit.point, Color.red);

            //射线进入物体,只执行一次
            if (hit.transform != lastTr)
            {
                Debug.Log("我进入" + hit.transform.name + "物体了");
            }

            lastTr = hit.transform;

            //下面计算射线停留时间
            time += Time.deltaTime;
            if (time >= 2.0f)
            {
                time = 0;
                Debug.Log("进入执行" + num++ + "次");
            }
        }
        else
        {
            //射线离开物体,只执行一次
            if (hit.transform != lastTr)
            {
                Debug.Log("我离开" + lastTr.name + "物体了");
                time = 0;
                lastTr = hit.transform;
            }
        }
    }
}



回复

使用道具 举报

6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
 楼主| 发表于 2016-12-15 14:57:57 | 显示全部楼层
mofans 发表于 2016-12-15 12:25
 GetComponent().UIPointerElementEnter 进入,触发进入一次。
 GetComponent().UIPointerElementExit  ...

就是没有射线连续碰到物体的,按键按住的倒是有。
最后我还是写到button上了,解决了这个问题....

回复

使用道具 举报

6蛮牛粉丝
1017/1500
排名
2440
昨日变化
2

14

主题

168

帖子

1017

积分

Rank: 6Rank: 6Rank: 6

UID
172976
好友
4
蛮牛币
216
威望
0
注册时间
2016-9-30
在线时间
365 小时
最后登录
2017-11-23
 楼主| 发表于 2016-12-15 15:01:05 | 显示全部楼层
wtujoxk 发表于 2016-12-15 14:19
这是我用两个Cube搭建的场景,你看看是不是这样的

我用的是VRTK的封装事件,挂在HTC手柄控制上的,这个普通射线包括计时其实我是会的。
我最后把事件写在button上已经解决了控制时间的问题。
最后还是谢谢你的回答

回复

使用道具 举报

5熟悉之中
827/1000
排名
2946
昨日变化
18

10

主题

144

帖子

827

积分

Rank: 5Rank: 5

UID
159012
好友
1
蛮牛币
2379
威望
0
注册时间
2016-7-27
在线时间
279 小时
最后登录
2017-11-24
QQ
发表于 2016-12-15 17:01:45 | 显示全部楼层
unity的官方实例里有关于视觉停留的 很不错,而且还有滑动条可以显示事件 可以看一下

回复

使用道具 举报

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

本版积分规则

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