使用Unity3d模拟电梯运动,首先是电梯轿厢的运动,当点击楼层按钮时,电梯轿厢即可到达相应楼层位置。
电梯模型如下:
电梯轿厢运行脚本代码,直接挂载在电梯轿厢上即可,运行速度可以随意设置:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class dtjxyidong : MonoBehaviour
{
public Transform Onelayer;
public Transform Twolayer;
public Transform Threelayer;//获取楼层
Vector3 targetLayer;//目标楼层
public float speed;
void Start()
{
targetLayer = Twolayer.position;
}
void Update()
{
LiftMove();
}
//鼠标点击按钮,控制电梯轿厢的目标楼层
public void OnFirstButtonClick()
{
targetLayer = Onelayer.position;
}
public void OnSecondButtonClick()
{
targetLayer = Twolayer.position;
}
public void OnThirdButtonClick()
{
targetLayer = Threelayer.position;
}
void LiftMove()
{
transform.position = Vector3.MoveTowards(transform.position, targetLayer, speed * Time.deltaTime);
}
}
这里电梯轿厢运行的原理主要是通过改变电梯轿厢坐标,因为电梯基本上是垂直运行的,所以保证x,z轴坐标不变,只改变y轴坐标,即可实现电梯的垂直运行。
所以这里我们要在电梯楼中的每个楼层设置一个空物体,以方便电梯轿厢定位。这里是我设置的一楼位置,二楼三楼同理。
全部设置完成之后就是电梯对重的运动了,这部分基本和电梯轿厢一样,只是在运行中楼层与电梯轿厢相反。
对重运行脚本代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class dzyidong : MonoBehaviour
{
public Transform Onelayer;
public Transform Twolayer;
public Transform Threelayer;//获取楼层
Vector3 targetLayer;//目标楼层
public float speed;
void Start()
{
targetLayer = Twolayer.position;
}
void Update()
{
LiftMove();
}
public void OnFirstButtonClick()
{
targetLayer = Onelayer.position;
}
public void OnSecondButtonClick()
{
targetLayer = Twolayer.position;
}
public void OnThirdButtonClick()
{
targetLayer = Threelayer.position;
}
void LiftMove()
{
transform.position = Vector3.MoveTowards(transform.position, targetLayer, speed * Time.deltaTime);
}
}
然后就是电梯轿厢门的开门与关门了,这里的思路是点击按钮之后,将开门信息传递给轿厢门,当到达目标楼层之后,进行开门操作,然后等待一段时间之后,自动关门。
轿厢门的运动也与电梯轿厢运动相似,保证两个坐标轴的坐标不变,只改变一个坐标,所以也需要通过设置空物体的方式来实现开关门。
电梯轿厢门运行脚本代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class dtjxmen : MonoBehaviour
{
//楼层开门位置
public Transform Open1;
public Transform Open2;
public Transform Open3;
//关门位置
public Transform Close;
//电梯轿厢及其到达楼层
public Transform Onelayer;
public Transform Twolayer;
public Transform Threelayer;
public Transform dt;
//目标楼层
Vector3 target;
//门运行速度,可在界面处调整
public float speed;
void Start()
{
//初始化,电梯轿厢门保持关门状态
target = Close.position;
}
void Update()
{
Move();
}
public void SetTargetLayer(int i)
{
switch (i)
{
case 1:
target = Open1.position;
Invoke("ClosetheDoor", 10);//开门之后10秒后关门,10可以修改
break;
case 2:
target = Open2.position;
Invoke("ClosetheDoor", 10);
break;
case 3:
target = Open3.position;
Invoke("ClosetheDoor", 10);
break;
default:
break;
}
}
void ClosetheDoor()
{
target = Close.position;
}
void Move()
{
//待电梯到达目标位置之后再进行轿厢门运动
if ((dt.position == Onelayer.position) || (dt.position == Twolayer.position) || (dt.position == Threelayer.position))
{
transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
}
}
}
挂载好脚本之后,进行设置:
最后在按钮上挂载相应的函数:
运行效果图: