目标点标记(VRTK_DestinationMarker)

发表于2016-11-05
评论0 4.8k浏览
概述
  这个抽象类提供在游戏世界里发送目的标记事件的功能. 它可以用于实现一些特定功能的地点标记需求,例如传送功能.
  它的派生子类 VRTK_WorldPointer 用于处理指示射线的事件,当指示射线接触到游戏中的区域的时候发送事件.

Inspector可见参数
  Enable Teleport: 如果勾选此项那么事件参数中的teleport会被置为true,传送相关脚本就能知道是否该移动到新的位置.

事件类
  DestinationMarkerEnter - 当与其他gameobject发生collision时发送事件.
  DestinationMarkerExit - 当与其他gameobject结束collision时发送事件.
  DestinationMarkerSet - 当destination marker是active时发送事件,确定最新的目标点 (可用于选择和传送).

事件装载参数

?
1
2
3
4
5
6
7
8
public struct DestinationMarkerEventArgs
{
    public float distance;
    public Transform target;
    public Vector3 destinationPosition;
    public bool enableTeleport;
    public uint controllerIndex;
}

 · float distance - 原点和碰撞点之间的距离.
 · Transform target - 指示射线碰撞到游戏对象的的Transform.
 · Vector3 destinationPosition - 目标点的世界坐标.
 · bool enableTeleport - 是否应该触发传送.
 · uint controllerIndex 发送指示射线的手柄索引.


  可以看出来这个事件,需要记录指示射线碰到别的物体时,碰撞点的位置,与手柄之间的距离等

方法
SetInvalidTarget/1

?
1
> public virtual void SetInvalidTarget(string name)

 · Parameters
 · string name - 无效target的tag或class的name.
 · Returns
 · none
  SetInvalidTarget方法用于将包含匹配name的给定tag或class设为invalid destination targets.
SetNavMeshCheckDistance/1

?
1
> public virtual void SetNavMeshCheckDistance(float distance)

 · Parameters
 · float distance - nav mesh采样的最大距离.
 · Returns
 · none
  SetNavMeshCheckDistance方法返回从标记点开始进行nav mesh采样的最大距离
SetHeadsetPositionCompensation/1

?
1
> public virtual void SetHeadsetPositionCompensation(bool state)

 · Parameters
 · bool state - 当设置destination marker时是否要考虑头显在play area中的位移改变.
 · Returns
 · none
  SetHeadsetPositionCompensation方法决定当设置destination marker时,是否要将头显关于play area中心的偏移量计入考虑. 如果为 true 那么位置的偏移会被考虑影响.

发送事件代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//发送事件,实际调用
public virtual void OnDestinationMarkerEnter(DestinationMarkerEventArgs e)
{
    if (DestinationMarkerEnter != null)
    {
        DestinationMarkerEnter(this, e);
    }
}
 
//发送事件,实际调用
public virtual void OnDestinationMarkerExit(DestinationMarkerEventArgs e)
{
    if (DestinationMarkerExit != null)
    {
        DestinationMarkerExit(this, e);
    }
}
 
//发送事件,实际调用
public virtual void OnDestinationMarkerSet(DestinationMarkerEventArgs e)
{
    if (DestinationMarkerSet != null)
    {
        DestinationMarkerSet(this, e);
    }
}

事件装载代码

?
1
2
3
4
5
6
7
8
9
10
protected DestinationMarkerEventArgs SetDestinationMarkerEvent(float distance, Transform target, Vector3 position, uint controllerIndex)
{
    DestinationMarkerEventArgs e;
    e.controllerIndex = controllerIndex;
    e.distance = distance;
    e.target = target;
    e.destinationPosition = position;
    e.enableTeleport = enableTeleport;
    return e;
}

  这个类主要就是一些事件的声明和装载,所有继承它的子类都可以使用里面的事件机制,根据内容看来应该是一些与发送射线然后碰撞目标的逻辑。
腾讯GAD游戏程序交流群:484290331Gad游戏开发核心用户群

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引