语录:
愿你熬得过万丈孤独,藏得下星辰大海。
前言:
默认情况下,交互器只能将单个布尔操作传递给可交互对象,后者控制可交互对象上的抓取操作。在其他时候,交互器中的其他操作可能希望传递给可交互对象,例如另一个输入按钮按下,甚至是控制器的轴值,例如触发器挤压。
我们可以使用 Interactions.ActionPublisher和
Interactions.ActionReceiver
来促进这种机制。
正文:
步骤一:
首先,我们需要创建基本条件:CameraRigs.TrackedAlias(追踪器)、CameraRigs.UnityXR(头显)、Input.UnityInputManager.OpenVR.RightController(右手控制器)、Input.UnityInputManager.OpenVR.LeftController(左手控制器):
步骤二:
我们需要在CameraRigs.TrackedAlias->Aliases->LeftControllerAlias(RightControllerAlias)下面创建Interactions.Interactor:
步骤三:
我们需要给 Interactions.Interactor指定对应的Grad Action和Velocity Tracker:
步骤四:
我们需要在CameraRigs.TrackedAlias->Aliases->LeftControllerAlias(RightControllerAlias)下面创建Interactions.ActionPublisher:
步骤五:
我们需要给 Interactions.ActionPublisher指定对应的Source Action和Source Interactor:
步骤六:
创建一个Cube作为放置台,再创建一个可抓取的物体:
步骤七:
创建可移动模块然后进行对应属性配置:
步骤八:
创建 Interactions.ActionReceiver,然后将Interactions.Interactable拖放到它的属性上面:
步骤九:
将前面创建的两个Interactions.ActionPublisher拖放到Interactions.ActionReceiver中:
步骤十:
创建一个脚本,允许我们更改可交互游戏对象的不透明度,以测试触发器值是否从控制器传递到可交互对象。
using UnityEngine;
public class OpacityChanger : MonoBehaviour
{
public GameObject meshToChange;
protected MeshRenderer materialRenderer;
protected void OnEnable()
{
materialRenderer = meshToChange.GetComponentInChildren<MeshRenderer>();
}
public void ChangeOpacity(float value)
{
Color currentColor = materialRenderer.material.color;
currentColor.a = 1f - value;
materialRenderer.material.color = currentColor;
}
}
步骤十一:
然后将脚本挂到Interactions.Interactable上面,并把Interactions.Interactable下面的子物体Cube拖放到脚本中:
步骤十二:
找到 Interactions.ActionReceiver 下面的FloatAction物体 ,将Interactions.Interactable拖放到Value Changed下面:
步骤十三:
找到Interactions.Interactable下面的Cube,然后将Cube添加一个材质,并将材质的Rendering Mode 属性改为Transparent:
Play:
运行Unity 场景时,可以用 VR 控制器上的握把按钮抓取立方体,然后按下 VR 控制器上的触发按钮会慢慢改变可交互立方体游戏对象的不透明度。