unity实现开关门操作

1,695 阅读1分钟

1.导入开关门资料包

2.给01_low门添加动画组件

image.png

3.窗口-动画-添加动画

将设置动画小窗口拖入到控制台一栏平级,更好的观察

创建新剪辑-添加动画,将动画命名为open

z轴控制门的开关

image.png

4.设置动画的roration值

image.png

5.创建新剪辑-添加动画,动画命名为close

close动画模拟关门的效果

注意:设置度数的时候首先要选择时间轴上的,然后进行设值

image.png

6.01_low门新建盒状碰撞器

并且在动画组件里面也可以看到开关门两个元素open close

image.png

7.01——low设置标签名

设置标签名为myDoor,方便我们在脚本文件里面获取它

8.编写door脚本文件

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

public class door : MonoBehaviour
{
    //先获取动画组件
    private Animation ani;
    //创建一个字段来存储射线
    private Ray ray;
    //存储门的状态 --一开始门是关的
    private bool isOpen = false;
    //存储摄像机
    private Camera camera;
    void Start()
    {
        //获取动画组件
        ani = GetComponent<Animation>();
        //拿到摄像机身上的camera组件
        camera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update()
    {
        //创建一条射线 0表示鼠标左键
        //当鼠标左键点击了
        if (Input.GetMouseButtonDown(0))
        {
            //Debug.Log($"camera{camera}");

            //创建一条射线 从摄像机发出射线 --传入鼠标点击的位置
            ray = camera.ScreenPointToRay(Input.mousePosition);

            //自己画一条射线 origin起始点画起 direction--方向 颜色
            Debug.DrawRay(ray.origin, ray.direction, Color.red);

            //创建一个收集器
            RaycastHit hit;

            //发射一条射线
            Physics.Raycast(ray, out hit);

            if (hit.collider.tag == "myDoor" && !ani.isPlaying)
            {
                Debug.Log("碰撞到了门");
                //判断当前是不是关门状态,同时当前动画没有在播放中
                if (!isOpen)
                {
                    //播放动画,开门操作
                    ani.Play("open");
                    isOpen = true;
                }
                else
                {
                    ani.Play("close");
                    isOpen = false;
                }

            }
        }
    }
}

效果如下:

动画8.gif