Unity通过物理带动实现传输带运输物品
创作时间:
作者:
@小白创作中心
Unity通过物理带动实现传输带运输物品
引用
CSDN
1.
https://blog.csdn.net/ysn11111/article/details/135974289
在Unity开发中,实现传输带运输物品是一个常见的需求。本文将介绍如何使用Unity的物理引擎实现这一功能,重点讲解Rigidbody.MovePosition API的使用,并通过循环滚动背景的思路实现无限传输效果。
前言
遇到个听起来挺简单的需求,就是实现一个传输带,传输物品。但细想发现如果是直接设置物品的速度,或者通过设置父物体的方式带动物品,都挺不好,关联性太强。最后选择用到一个很实用的API, Rigidbody.MovePosition。
public void MovePosition (Vector3 position);
移动刚体并遵守插值设置。启用刚体插值时,Rigidbody.MovePosition可在帧之间创建平滑过渡。Unity在每个FixedUpdate调用中移动一个刚体。
我发现这个API可以实现放置一个物品在平台上,平台移动,物品也可以跟着移动,非常的实用。
接着就是思考无限运输物品的传输带怎么去做,这个可以参考循环滚动背景的思路,直接看视频。
这里是有效传输的部分
我们看一下传输效果:
我们在Scene窗口隐藏平台的Mesh,看一下核心的运作原理,
我们在移动平台的过程中,要动态更改两个BoxCollider的大小,这样就能保证传输平台一直有效。
场景布局:
代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
[Header("速度")]
public float speed;
private int currDir=1;
private Transform[] beltsTrans;
private BoxCollider[] beltsCollis;
private Rigidbody[] beltsRbs;
private Vector3 forwardRunBehindPos;
private Vector3 behindPos;
private float length;
private float length2;
protected bool init = false;
protected void Awake()
{
beltsTrans = new Transform[2];
beltsCollis = new BoxCollider[2];
beltsRbs = new Rigidbody[2];
//实例化新传送带
beltsTrans[0] = transform.Find("传送带");
beltsTrans[1] = Instantiate(beltsTrans[0].gameObject, transform).transform;
//获取组件
for (int i = 0; i < beltsTrans.Length; i++)
{
beltsCollis[i] = beltsTrans[i].GetComponent<BoxCollider>();
beltsRbs[i] = beltsTrans[i].GetComponent<Rigidbody>();
}
//计算长度
length = beltsCollis[0].size.z * beltsTrans[0].localScale.z * transform.localScale.z;
length2 = length * 2;
//偏移第二个传送带
beltsTrans[1].position = beltsTrans[1].position - beltsTrans[1].forward * length;
//起点位置
forwardRunBehindPos = beltsTrans[1].position;
behindPos = forwardRunBehindPos;
init = true;
}
protected void FixedUpdate()
{
if (!init) return;
Move();
}
float dis;
public void Move()
{
for (int i = 0; i < beltsTrans.Length; i++)
{
//移动
beltsRbs[i].MovePosition(beltsTrans[i].position + beltsTrans[i].forward * speed * currDir * Time.fixedDeltaTime);
//计算距离起始点距离
dis = Vector3.Distance(beltsTrans[i].position, behindPos);
//Collider中心点
beltsCollis[i].center = new Vector3(0, 0, Mathf.Lerp(0.5f * currDir, -0.5f * currDir, (dis / length2)));
//Collider缩放
if (dis<=length)
{
beltsCollis[i].size = new Vector3(1, 1, Mathf.Lerp(0 , 1 , (dis / length)));
}
else if (dis > length && dis < length2)
{
beltsCollis[i].size = new Vector3(1, 1, Mathf.Lerp(1 , 0 , ((dis - length )/ length)));
}
//返回起点
else if(dis >= length2)
{
beltsTrans[i].position = behindPos;
}
}
}
}
热门推荐
从“贱人就是矫情”到“佛口蛇心”:《甄嬛传》台词揭秘宫廷权谋
中行手机银行限额降至5万,强化账户安全措施
水蛭素:最强天然凝血酶抑制剂,革新心血管疾病治疗
吴淞炮台纪念广场:重温峥嵘岁月
温婉皇太后如何变成权力女王?解读甄嬛的艺术塑造
南疆自驾游攻略:九日探秘丝路南线
探秘楼兰与米兰:南疆丝路的文化瑰宝
从663亿播放量看《甄嬛传》:经典台词二创热潮背后的文创新路径
《甄嬛传》借AI二创再掀海外热,经典台词引发全球共鸣
七年级学习困难?从家庭到学校全方位解决方案
七年级期末课堂管理指南:从心理特点到实用技巧
大理古城住宿攻略:80元至千元任选,白族风情民宿推荐
《永夜星河》席卷海外:游戏化叙事与传统文化的完美融合
三部古装剧展现传统文化魅力,制作水准创新高
庆余年第二季登顶Disney+热度榜,中国古装剧扬帆出海正当时
从剧情到“甄学”:《甄嬛传》13年热度不减的四大原因
探访钟山文学馆:一座山的诗情画意与文化传承
南京钟山风景区一日游完美攻略
无锡济民可信推荐:益寿强身膏选购指南
全球首款45倍高吸收槲皮素产品上市,慢阻肺患者迎来新选择
世界慢阻肺日:两种科学呼吸法助力患者改善肺功能
2025年KPI如何重塑企业文化?
用“觉知、替换和强化”改变不良饮食习惯
KPI助力企业管理,提升团队表现
低钠盐真的能防高血压吗?专家解读来了
2024版高血压指南:这样吃更健康
吃苦瓜真的能降压?科学解读来了!
胡玫版红楼梦聚焦宝黛爱情,林黛玉选角引争议
贾宝玉的恋爱观:反封建先声与现代爱情启示
温皓然续写红楼梦,诗词暗藏命运玄机获专家盛赞