在unity3d里创建一个简易传送带模型

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);
                }
            }
        }
    }
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值