许多VR项目中都会有推拉门这样的需求,最近遇到了需求是在推拉门关闭状态时,当人拿住把手时,需要先让推拉门产生一个外推向走廊的动画,然后再变成可以推拉的门。由于项目原因不方便放上视频,有同样需求的可以参考代码。
using UnityEngine;
using System.Collections;
using DG.Tweening;
public class XXXDoor : MonoBehaviour {
/// <summary>
/// 是否门可以使用
/// </summary>
public bool canUse = false;
public enum DoorState
{
/// <summary>
/// 门处于开着
/// </summary>
DoorOpen,
/// <summary>
/// 门处于关闭
/// </summary>
DoorClose
}
public DoorState doorState;
/// <summary>
/// 门是否正在播放动画
/// </summary>
public bool isAniming = false;
/// <summary>
/// 关门动画触发位置
/// </summary>
public Vector3 correctPos;
/// <summary>
/// 门完全关闭位置
/// </summary>
public Vector3 closePos;
private void Start()
{
}
private void Update()
{
if (canUse)
if (doorState == DoorState.DoorOpen&&!isAniming&&transform.localPosition.z<correctPos.z)
{
OpenToCloseAnim();
}
}
/// <summary>
/// 关闭到打开的动画,由玩家操作调用
/// </summary>
public void CloseToOpenAnim()
{
if (canUse)
{
isAniming = true;
transform.DOLocalMoveX(correctPos.x, .5f);
transform.DOLocalMoveZ(correctPos.z + .1f, 1.0f);
StartCoroutine(CloseAnimState(0));
}
}
/// <summary>
/// 打开到关闭的动画,由门自己判定
/// </summary>
void OpenToCloseAnim()
{
isAniming = true;
transform.DOLocalMoveZ(closePos.z, .5f);
transform.DOLocalMoveX(closePos.x, 1.0f);
StartCoroutine(CloseAnimState(1));
}
IEnumerator CloseAnimState(int i)
{
yield return new WaitForSeconds(1.1f);
switch (i)
{
case 0:
doorState = DoorState.DoorOpen;
break;
case 1:
doorState = DoorState.DoorClose;
break;
default:
break;
}
isAniming = false;
}
}
using UnityEngine;
using System.Collections;
public class XXXDoorHandle : UseableObject {
RoomDoor roomDoor;
protected override void Start()
{
roomDoor = GetComponentInParent<XXXDoor>();
base.Start();
}
/// <summary>
/// 由手柄扳机键按住时, 持续调用
/// </summary>
/// <param name="controller"></param>
public override void HoldIt(GameObject controller)
{
if(!roomDoor.isAniming)
switch (roomDoor.doorState)
{
case XXXDoor.DoorState.DoorOpen:
base.HoldIt(controller);
break;
case XXXDoor.DoorState.DoorClose:
roomDoor.CloseToOpenAnim();
break;
default:
break;
}
}
}
在VR项目中,推拉门的交互设计至关重要。这篇内容分享了一种实现方式,即当门处于关闭状态且用户持握把手时,先播放外推开动画,随后转化为可推拉状态。感兴趣的开发者可以参考提供的代码进行实现。

4371

被折叠的 条评论
为什么被折叠?



