返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 1937|回复: 0

[原创] 【原创】协程的案例,一个物体按路径巡逻

[复制链接]
发表于 2023-3-10 16:05:33 | 显示全部楼层 |阅读模式
本帖最后由 da11 于 2023-3-11 22:09 编辑

协程的案例,一个物体按路径巡逻--重点实操案例
Coroutines_demo.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Coroutines_demo : MonoBehaviour
{
    //协程的案例,一个物体按路径巡逻
    public Transform[] ports;



    private Transform GameObjTF;

    private float MoveSpeed = 1;

    private void Start()
    {
        GameObjTF = this.transform;
    }

    private void OnGUI()
    {
        if (GUILayout.Button("开始巡逻"))
        {
            StartCoroutine(Objports(ports));
        }
        if (GUILayout.Button("停止行动"))
        {
            //停止本对象中开启的所有协程。
            StopAllCoroutines();
        }
    }

    private IEnumerator Objports(Transform[] TFs)
    {
        foreach (var port in ports)
        {
            //协程嵌套,等待ObjMoveFF方法执行完后再执行ObjMoveFF方法!!
            //通俗点就是移动点不能一下子全部移动过去
            //等待找到一个点结束后,再到下一个点,也就是等待MoveToTarget()执行结束后再调用
            //先执行了StartCoroutine(ObjMoveFF(port.position)),yield return等待这个方法执行完后,才执行之后的语句!!
            yield return (StartCoroutine(ObjMoveFF(port.position)));


            //到达目标点后等待两秒
            yield return new WaitForSeconds(2);
        }

    }

    private IEnumerator ObjMoveFF(Vector3 port)
    {
        while (GameObjTF.position != port)
        {
            //使用Vector3.MoveTowards移动路线,然后通过WaitForFixedUpdate等待控制
            gameObject.transform.position = Vector3.MoveTowards(GameObjTF.position, port, Time.deltaTime * MoveSpeed);

            //等待当前update帧后执行
            //实际作用:移动到某个位置,不是一次移动完成,而是分多次完成,这种场景就适宜用协程实现!
            yield return new WaitForFixedUpdate();  
        }

    }
}





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
 楼主| 发表于 2023-3-10 16:16:41 | 显示全部楼层
案例演示图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表