
在unity3d里创建一个简易传送带模型
也需添加box collider,同时创建在传送带上方,需添加刚体组件rigidbody。在传送带inspector界面创建新脚本(或者直接创建后拖入传送带模型)此处对传送带模型记得添加box collider组件。保存代码,在unity运行即可。修改传送带颜色与被传送物件区分。b、速度可控(利用键盘控制)c、启停可控(利用键盘控制)d、自动不断生成物件。
·
1、搭建传送带模型
此处对传送带模型记得添加box collider组件
创建小物件
也需添加box collider,同时创建在传送带上方,需添加刚体组件rigidbody
修改传送带颜色与被传送物件区分
2、创建脚本
在传送带inspector界面创建新脚本(或者直接创建后拖入传送带模型)
编写代码
public class carrierobj: MonoBehaviour
{
public float speed = 1.2f;//被传送物体移动速度
public void OnCollisionStay(Collision collision)
{ //一旦产生碰撞就执行
if (collision.gameObject != null)
{
MoveObj(collision.gameObject);
}
}
public void MoveObj(GameObject gameObject)
{
gameObject.transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World);
}
}
保存代码,在unity运行即可。
此模型目前较简单
后续考虑添加功能
a、传送带动态贴图
b、速度可控(利用键盘控制)
c、启停可控(利用键盘控制)
d、自动不断生成物件
更:
1、给传送带添加了贴图,并对贴图进行了动态处理,使效果更贴合实际
贴图动态处理代码:
public class carrier : MonoBehaviour
{
public float y = 0;
public float speed = 0.15f;
private void Update()
{
y=y+Time.deltaTime*speed;
GetComponent<Renderer>().material.mainTextureOffset = new Vector2(0, y);
//对贴图的便宜进行调整
}
}
2、在移动物体初始位置不断定时克隆
代码如下
public class CreatePCB : MonoBehaviour
{
public GameObject PCB; // 用来接收一个 prefab
private float timeInterval = 2f; // 时间间隔
private float timer; // 计时器
private Vector3 initialPosition; // 最初的位置
void Start()
{
timer = timeInterval; // 计时器初始设置为时间间隔
initialPosition = transform.position; // 记录最初的位置
}
void CreatePrefab()
{
Instantiate(PCB, initialPosition, Quaternion.identity); // 使用最初的位置生成 prefab
}
void Update()
{
timer -= Time.deltaTime; // 减去每一帧所消耗的时间
if (timer <= 0f)
{
CreatePrefab();
timer = timeInterval; // 重置计时器
enabled = false; // 关闭生成
}
}
}
继续对模型进行优化:
优化内容包括:
1、添加了按键控制传送带速度,分1、2、3档由按键1、2、3进行切换
2、添加了按键控制传送带的启停,由空格键进行控制
3、添加了启停时的加速度减速度效果(目前贴图部分还未实现此效果,代码有点问题)
4、优化了原本传送效果的代码(原本代码只朝一个方向传送,没有与传送带的旋转角度关联,此处进行了优化)
4、添加了警戒线、地板贴图
代码如下:
public class ConveyorBelt : MonoBehaviour
{
public float[] speeds = { 1.0f, 2.0f, 3.0f }; // 不同档位的速度
private int currentSpeedIndex = 0; // 当前速度索引
private float speed = 0f; // 当前速度
private float targetSpeed = 0f; // 目标速度
private bool isRunning = true; // 传送带是否运行
private float acceleration = 0.5f; // 加速度
private float deceleration = 1f; // 减速度
void Start()
{
SetSpeedIndex(0); // 开始运行时传送带初始速度为1档
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
SetSpeedIndex(0); // 设置传送带速度为1档
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
SetSpeedIndex(1); // 设置传送带速度为2档
}
else if (Input.GetKeyDown(KeyCode.Alpha3))
{
SetSpeedIndex(2); // 设置传送带速度为3档
}
if (Input.GetKeyDown(KeyCode.Space))
{
ToggleRunning(); // 切换传送带启动和停止状态
}
UpdateConveyorBelt();
}
void SetSpeedIndex(int index)
{
currentSpeedIndex = Mathf.Clamp(index, 0, speeds.Length - 1); // 限制索引在有效范围内
if (isRunning)
{
targetSpeed = speeds[currentSpeedIndex]; // 根据当前档位设置目标速度
}
}
void ToggleRunning()
{
isRunning = !isRunning;
if (!isRunning)
{
targetSpeed = 0f; // 停止时目标速度为0
}
else
{
targetSpeed = speeds[currentSpeedIndex]; // 启动时设置目标速度
}
}
void UpdateConveyorBelt()
{
if (speed != targetSpeed)
{
if (speed < targetSpeed)
{
speed += acceleration * Time.deltaTime; // 加速
if (speed > targetSpeed)
{
speed = targetSpeed; // 限制速度达到目标速度
}
}
else if (speed > targetSpeed)
{
speed -= deceleration * Time.deltaTime; // 减速
if (speed < targetSpeed)
{
speed = targetSpeed; // 限制速度达到目标速度0
}
}
}
if (speed != 0f)
{
Collider[] colliders = Physics.OverlapBox(transform.position, transform.localScale / 2, transform.rotation);
foreach (Collider collider in colliders)
{
if (!collider.transform.Equals(this.transform))
{
collider.transform.Translate(transform.forward * speed * Time.deltaTime);
}
}
}
}
}
更多推荐
所有评论(0)