unity3d 制作开门动画以及收集钥匙实现开门

首先展示效果:

unity3d 制作开门动画以及收集钥匙实现开门

第一步,我们在Hirarchy面板上新建三个cube,再按照一定的比例调整,制作完成一个门框,然后制作一个空物体并命名为Doorframe,将三个cube合并成门框一个整体:

 然后再创建一个cube调整大小,在将合适的门移动至门框之前,创建一个空物体(doorcenter)并将此空物体的位置移动至门的右边缘中心位置,同时将门作为doorcenter的子物体,这里的操作是为后面的开门动画制作做铺垫。

开门是需要围绕门一边的轴来旋转,如果不设置空物体用来辅助旋转,那门将以自生中心为轴来旋转则达不到需要的效果。

 接下来制作开门动画:

点击Windows->Animation->Animation,出现Animation面板,在Hierarchy面板中选中doorcenter

点击Creat,命名之后会自动生成:

 左边可以理解为编辑动画,右边则用来设置动画状态等。并注意点击door,将Loop Time(循环播放)取消勾选:

在出现的Animation面板中输入帧率30:

 接下来点击上图Preview右边红点开始录制,接下来选中doorcenter,按快捷键E,点击绿轴进行旋转,旋转角度任意,点击播放键即可查看效果,开门速度太快则拖动

并将时间间隔为两秒,整体如下: 

 接下来打开动画机 

 面板中以及自动为你生成了先前编辑的动画door,首先我们点击将door删去,右键点击Creat State->empty,并且命名为Idle,因为门不能刚开始就打开,需要玩家找到钥匙才能打开,然后在家将做好的动画拖进面板,并且右键点击Idle->make transition链接至door。

 点击Parameters面板为动画播放设置条件,这里选中Trigger(触发),开门动画只需播放一次,并且将它命名为opening:

 接下来在点击idle与door之间的连线,在右侧inspector中,取消勾选

 同时点击conditions中点击+,设置Trigger:

 门这一板块结束,速度解决钥匙,创建cube,添加Sphere Collider组件,点击Edit Collider调整碰撞范围(尽量调大),然后勾选Is Trigger。

 编写钥匙代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class keyhold : MonoBehaviour
{
    // Start is called before the first frame update
    public Transform player;//获取玩家组件
    private void OnTriggerEnter(Collider other)//这里Other指的是与钥匙接触的物体(即玩家)
    {
        if(other.transform==player)
        {
            other.GetComponent<player>().IsKeyhold = true;//采用GetComponent方法获取玩家脚本中的bool值并且进行修改
            Destroy(gameObject);
        }
    }
}

对于门,选取空物体doorcenter,添加Box Collider组件,同样勾选Is Trigger,将碰撞范围调整至下图所示

 我们希望的是玩家在拿到钥匙的前提下,进去该碰撞区域,门将自动打开,未拿到钥匙则无反应

门的代码(添加到doorcenter上):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorOpen : MonoBehaviour
{
    Animator animator;
    // Start is called before the first frame update
    public Transform player;
    private void Start()
    {
        animator = GetComponent<Animator>();
    }
    private void OnTriggerEnter(Collider other)
    {
        if(other.transform==player&&other.GetComponent<player>().IsKeyhold)//玩家拿到钥匙,进入碰撞区,播放动画
        {
            animator.SetTrigger("opening");
        }
    }
}

 玩家代码中只需要加入以上代码即可。

 最后将我们的玩家拖放进doorcenter以及key的player位置就大功告成!

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>