[Unity] 战斗系统学习 14:Switchable 3

家电修理 2023-07-16 19:17www.caominkang.com电器维修

1. Bug协程阻塞游戏主线程

我在测试 Sitchable 的时候发现我的过渡并没有达到应有的效果,几乎是瞬间就从起点值到达了终点值,没有平滑
我把平滑时间延长了之后发现游戏有明显的阻塞,这和我对协程的第一印象相悖

原代码

使用 IEnumerator 函数用于协程

  /// 
  /// 模式过渡使变量在不同预设值之间切换
  /// 
  /// 预设模式
  /// 
  private IEnumerator ModeTransition(T mode)
  {
   float time = ModeTransitionTime;
   hile(time > 0)
   {
    time -= Time.deltaTime;
    Debug.Log(time);
    foreach (ISitchable sitchable in sitchableList)
    {
     sitchable.SitchValue(mode);
    }
   }
   yield return null;
  }

协程启动方式

  /// 
  /// 行动模式
  /// 
  [ShoInInspector]
  [Tooltip("行动模式")]
  private T mode;

  /// 
  /// 行动模式
  /// 
  public T Mode
  {
   get => mode;
   set
   {
    if (oner != null)
    {
     if (sitchValueCoroutine != null)
      oner.SCoroutine(sitchValueCoroutine);
     sitchValueCoroutine = oner.StartCoroutine(ModeTransition(value));
     mode = value;
    }
   }
  }

后来我悟了……原来是还是需要 yield return

2. SitcherEnum v3

Assets/MeoFrameork/Core/Sitchable/SitcherEnum.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 22/04/2022 18:45
// 一次修改于: 26/04/2022 23:05
// 版权所有: CheapMeoStudio
// 描述:
// ----------------------------------------------

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;

namespace MeoFrameork.Core.Sitchable
{
 public class SitcherEnum : ISitcher here T: Enum
 {
  /// 
  /// 主人
  /// 
  private SerializedMonoBehaviour oner;

  /// 
  /// 主人
  /// 
  public SerializedMonoBehaviour Oner
  {
   set => oner = value;
  }

  /// 
  /// 行动模式
  /// 
  [ShoInInspector]
  [Tooltip("行动模式")]
  private T mode;

  /// 
  /// 行动模式
  /// 
  public T Mode
  {
   get => mode;
   set
   {
    if (oner != null)
    {
     if (sitchValueCoroutine != null)
      oner.SCoroutine(sitchValueCoroutine);
     sitchValueCoroutine = oner.StartCoroutine(ModeTransition(value));
     mode = value;
    }
   }
  }
  
  /// 
  /// 切换模式的过渡时间
  /// 
  [Tooltip("切换模式的过渡时间")]
  public float ModeTransitionTime = 1f;
  
  /// 
  /// 可切换变量列表
  /// 
  private List sitchableList;

  /// 
  /// 可切换变量列表
  /// 
  public List SitchableList
  {
   get
   {
    if(sitchableList == null)
     sitchableList = ne List();
    return sitchableList;
   }
  }
  
  // 缓存

  /// 
  /// 切换变量的协程
  /// 
  private Coroutine sitchValueCoroutine;
  
  /// 
  /// 模式过渡使变量在不同预设值之间切换
  /// 
  /// 预设模式
  /// 
  private IEnumerator ModeTransition(T mode)
  {
   float time = ModeTransitionTime;
   hile(time > 0)
   {
    time -= Time.deltaTime;
    foreach (ISitchable sitchable in sitchableList)
    {
     sitchable.SitchValue(mode);
    }

    yield return ne WaitForSeconds(Time.deltaTime);
   }
   yield return null;
  }
 }
}

这下就对了

Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by