Unity3d 教会你做的电梯系统升降平台
博主第一次写博客,语言略俗,有不足之处还请指正!
由于自己还处在unity小白阶段,受2d升降平台的影响(后续我也会上传关于2d升降平台的文章),突发奇想如何用3d做一个电梯系统,查阅网上资料后,发现网上对这方面的讲解少之又少,或者说其他博主提供的并非自己想要的效果,博主也是不断地学习改进,最终才达到效果,所以想和大家分享一下我的学习成果,供大家学习参考。
如果你正在学习unity,会发现其实做一个简单的电梯系统很快就有思路,无非就是去触发Trigger,通过电梯移动实现到达目标楼层,之前也有疑惑和网友交流过到底用Collider碰撞器还是Trigger触发器去实现,这两种都是检测碰撞,个人觉得Trigger实现起来简单点,还有一个思路可能你会想到,在各个楼层安装Collider,当电梯到达某楼层通过检测碰撞,来置停电梯(本文不涉及,想实现的小伙伴可以自己尝试)。
第一步,设计小球的运动,包括前后左右跳跃,摄像机部分省略(资源丰富),给小球加上Character Controller组件,新建C#文件,命名为PlayerController,通过中文API搜CharacterController.Move(为GameObject的移动提供附加组件),将其代码复制给PlayController.cs文件,便可实现小球的运动(参数可自己修改)。
第二步,设计电梯的运动,无非就是给电梯贴代码,给Cube(可自由命名,以下均已Cube为例)加上Box Collider以及Rigidbody,勾选Is Kinematic,并锁定X轴和Z轴,新建C#文件,命名为LiftController,代码如下(MoveTowards函数可查阅中文API):
-
using System.Collections;
-
using System.Collections.Generic;
-
using UnityEngine;
-
-
public class LiftController : MonoBehaviour
-
{
-
public Collider coll;
-
public Rigidbody rigid;
-
public float speed;
-
-
Vector3 OneLayer = new Vector3(0f, 0.1f, 0f);//一楼,实际情况根据自己修改,以下同理
-
Vector3 TwoLayer = new Vector3(0f, 11.1f, 0f);//二楼
-
Vector3 ThreeLayer = new Vector3(0f, 21.1f, 0f);//三楼
-
-
void Start()
-
{
-
coll = gameObject.GetComponent<Collider>();
-
rigid = gameObject.GetComponent<Rigidbody>();
-
-
}
-
-
void Update()
-
{
-
-
}
-
-
public void One()
-
{
-
transform.position = Vector3.MoveTowards(transform.position, OneLayer, speed * Time.deltaTime);
-
}
-
public void Two()
-
{
-
transform.position = Vector3.MoveTowards(transform.position, TwoLayer, speed * Time.deltaTime);
-
}
-
-
public void Three()
-
{
-
transform.position = Vector3.MoveTowards(transform.position, ThreeLayer, speed * Time.deltaTime);
-
}
-
}
第三步,在Cube下新建三个空物体,加上Box Collider,并勾选Is Trigger,在(Inspector)检视面板Tag下新增三个标签,分别取名为One、Two、Three,并分别为其勾选上,其次可以分别改变三个空物体的Scale(X 0.2 ,Y 0.3 ,Z 0.5),并通过移动合理分配位置,为了便于角色判断楼层,博主分别为三个空物体加上了Text(TMP),添加文字,调节即可,这样我们三个触发器就完成了。
第四步,完善代码,实现触发器,在PlayController.cs中进行添加,PlayController.cs代码如下:
-
using JetBrains.Annotations;
-
using System.Collections;
-
using System.Collections.Generic;
-
using UnityEngine;
-
-
public class PlayerController : MonoBehaviour
-
{
-
private CharacterController controller;
-
private Vector3 playerVelocity;
-
private bool groundedPlayer;
-
public float playerSpeed;
-
public float jumpHeight;
-
public float gravityValue;
-
/*以上为角色运动定义*/
-
-
public GameObject Lift;
-
public bool isoneColl = false;
-
public bool istwoColl = false;
-
public bool isthreeColl = false;
-
/*以上定义便于判断是否触发*/
-
-
void Start()
-
{
-
controller = gameObject.GetComponent<CharacterController>();
-
Lift = GameObject.Find("Lift");//引号内容为Cube的命名,可根据自己的改动
-
}
-
-
void Update()
-
{
-
Movement();
-
LiftMove();
-
}
-
-
//角色移动
-
void Movement()
-
{
-
groundedPlayer = controller.isGrounded;
-
if (groundedPlayer && playerVelocity.y < 0)
-
{
-
playerVelocity.y = 0f;
-
}
-
-
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
-
controller.Move(move * Time.deltaTime * playerSpeed);
-
-
if (move != Vector3.zero)
-
{
-
gameObject.transform.forward = move;
-
}
-
-
// Changes the height position of the player..
-
if (Input.GetButton("Jump") && groundedPlayer)
-
{
-
playerVelocity.y = Mathf.Sqrt(jumpHeight * -3.0f * gravityValue);
-
}
-
-
playerVelocity.y = gravityValue * Time.deltaTime;
-
controller.Move(playerVelocity * Time.deltaTime);
-
}
-
-
//触发器
-
private void OnTriggerEnter(Collider collision)
-
{
-
if (collision.tag == "One")
-
{
-
isoneColl = true;
-
istwoColl = false;
-
isthreeColl = false;
-
Debug.Log("前往1楼");
-
}
-
if (collision.tag == "Two")
-
{
-
istwoColl = true;
-
isoneColl = false;
-
isthreeColl = false;
-
Debug.Log("前往2楼");
-
}
-
if (collision.tag == "Three")
-
{
-
isthreeColl = true;
-
istwoColl = false;
-
isoneColl = false;
-
Debug.Log("前往3楼");
-
}
-
-
}
-
-
//电梯移动
-
void LiftMove()
-
{
-
if (isoneColl == true)
-
{
-
Lift.GetComponent<LiftController>().One();//调用函数
-
Debug.Log("移动中...");
-
}
-
if (istwoColl == true)
-
{
-
Lift.GetComponent<LiftController>().Two();//调用函数
-
Debug.Log("移动中...");
-
}
-
if (isthreeColl == true)
-
{
-
Lift.GetComponent<LiftController>().Three();//调用函数
-
Debug.Log("移动中...");
-
}
-
}
-
-
}
运行之前,别忘了给电梯设置速度哦(博主设置为3),谢谢大家!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgffhik
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01