一个战斗过程思路,用协程

using UnityEngine;
using System.Collections;


/// <summary>
/// 实现的功能:就是战斗按钮被按下,随后主角攻击怪物,怪物攻击主角,如果整个
/// 战斗都没结束,这里用isFightEnd判断,则战斗继续执行,否则停止
/// </summary>
public class zTest : MonoBehaviour 
{
    private int i = 0;
    //判断是否整个战斗停止
    private bool isFightEnd = false;
    //判断战斗按钮是否被按下
    private bool isFighting = false;
    void Update()
    {
        if (isFightEnd != true)
        {
            StartCoroutine(test());
        }
        
    }


    IEnumerator test()
    {
        
        //没有按下战斗按钮
        if (isFighting == false)
        {
            yield return 0;
        }
        else
        {
            //主角攻击
            Debug.Log("role have attacked!!!!!!");
            //怪物攻击
            Debug.Log("monster have attacked!!!!");
            init();
            yield return 0;
        }
        
    }


    void OnGUI()
    {
        if (GUILayout.Button("START"))
        {
            isFightEnd = false;
            isFighting = false;
        }


        if (GUILayout.Button("STOP"))
        {
            isFightEnd = true;
        }


        if (GUILayout.Button("FIGHT"))
        {
            isFighting = true;
        }
    }


    void init()
    {
        isFighting = false;
    }
}
### 在 Gin 框架中启动新的 Goroutine 为了在 Gin 框架中安全地启动一个新的协程,应当注意将来自 `*gin.Context` 的数据提前提取到协程外部。这是因为 `Context` 对象可能在其生命周期内被销毁或更改,而这些变化会影响到协程内部对该对象的操作[^3]。 下面是一个具体的例子展示如何在一个 HTTP 请求处理器中启动一个协程: ```go package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func handleRequestWithGoroutine(c *gin.Context) { // 提前获取并保存需要使用的参数 param := c.Query("param") // 启动一个新的 goroutine 来处理耗时的任务 go func(p string) { // 这里放置异步任务逻辑 fmt.Println("Handling request with parameter:", p) // 假设这里有一些长时间运行的工作... }() // 返回即时响应给客户端 c.JSON(http.StatusOK, gin.H{ "message": "Task started", }) } func main() { r := gin.Default() r.GET("/start-task", handleRequestWithGoroutine) r.Run(":8080") } ``` 在这个例子中,在调用 `go func()` 之前先从 `c.Query()` 获取查询字符串参数,并将其作为参数传递给匿名函数。这样做可以防止由于访问已经释放的 `*gin.Context` 实例而导致潜在的竞争条件或其他并发问题。 #### 使用 WaitGroup 控制协程同步 如果希望等待所有子协程完成后才返回最终结果,则可以在父进程中引入 `sync.WaitGroup` 来管理多个工作线程的状态: ```go var wg sync.WaitGroup func handleSyncTasks(c *gin.Context) { wg.Add(1) defer wg.Done() param := c.Query("param") go func(p string) { defer wg.Done() // 执行具体业务逻辑 }() // 等待所有子进程完成后再继续下一步操作 wg.Wait() // 发送HTTP响应 c.JSON(http.StatusOK, gin.H{"status": "all tasks done"}) } ``` 需要注意的是上述代码片段仅用于说明目的,在实际应用中应根据具体情况调整设计模式以满足性能需求和资源管理的要求[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值