1. Snap zone:物体吸附
有时候想把某个物体能自动吸附到一个位置上时使用。导入Tilia Interactions SnapZone Unity这个包。
向场景里添加这个物体
SnapZone的配置:
2. Rule System
如果只是这么设置SnapZone的话,任何可交互物体都会被识别到,但有的时候我们只想snap特定物体。所以需要一个规则来判断哪些物体可以被Snap。这时就需要用到VRTK的Rule System。
一个Rule脚本只要实现IRule接口就可以用,观察IRule,发现只要实现一个方法就行。
namespace Zinnia.Rule
{
/// <summary>
/// Allows determining whether an object is accepted.
/// </summary>
public interface IRule
{
/// <summary>
/// Determines whether an object is accepted.
/// </summary>
/// <param name="target">The object to check.</param>
/// <returns><see langword="true"/> if <paramref name="target"/> is accepted, <see langword="false"/> otherwise.</returns>
bool Accepts(object target);
}
}
当然VRTK也准备了很多现成的Rule。比如当前这个需求可以用Tag来识别,就可以往场景里添加一个AnyTagRule物体。
选择AnyTagRule后生成。
4. 固定传送点式位移
当我们想让玩家只位移到固定位置时,可以使用这种传送方式。导入Tilia Locomotors TeleportTargets Unity。
向场景里添加要移动的点,并将点移动到想要传送的位置。
之后创建一个新的空物体,添加SpatialTargetDispatcher脚本。
之后在Pointer里将Enter,Exited和Select的回调加上即可。
但是这样的话变成即可任意移动,又可吸附到固定点移动。这时TeleportTargets只是一个吸附Pointer选择的作用了。如果只允许固定点瞬移的话,先把之前在pointer注册的Teleport方法给去掉。之后在TeleportTarget里的Activated里注册Teleport方法。
Teleport Target Setting:
- 我们可以通过设置Target override的位置来控制瞬移位置的偏移。
5. 一些Bug
i: 把头偏向桌子侧,人就会teleport到桌子上面
这是在偏头时由于Teleport自动传到桌子上了。解决方法之一是不然teleport传送到没打floor Tag的物体上。同snapZone做的一样。我们新建一个Tag和AllTagRule。
将Rule塞到Teleporter的Target Validity
我们发现虽然不能传送到没FloorTag的物体上,但选择还是绿色的。所以也要将规则应用到pointer里。
但这时发现传送点选择不了了,就需要给传送点的Collider加Floor Tag
2. 在Teleport时会莫名转向
是因为在设置了Apply Destination Rotation
把这勾去掉即可。