Unity3D VR推拉门

在VR项目中,推拉门的交互设计至关重要。这篇内容分享了一种实现方式,即当门处于关闭状态且用户持握把手时,先播放外推开动画,随后转化为可推拉状态。感兴趣的开发者可以参考提供的代码进行实现。

许多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;
            }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值