Unity C# 中的泛型
Generics in Unity C#
我在使用泛型的语法和规则方面遇到了很多麻烦。我正在尝试创建一个结构,其中不同的 classes 可以使用 WaitAction class 在协程 运行 时禁用输入,并在协程完成后重新启用它。
这个例子是一个简化版本,实际上我不会使用计数浮点数来定义协程的长度,而是根据动画和翻译来确定长度。
我想做的事情完全可行吗?
"Somehow use "T _ready" 将 "Main Class" 中的 "bool ready" 改回 "true""
public class Main : Monobehaviour {
WaitAction _waitAction = new WaitAction();
public bool ready;
float delay = 5f;
void Update()
{
if(Input.GetMouseButton(0) && ready)
{
ready = false;
StartCoroutine(_waitAction.SomeCoroutine((delay, this));
}
}
public class WaitAction {
public IEnumerator SomeCoroutine<T>(float count, T _ready)
{
float time = Time.time;
while(Time.time < time + count)
{
yield return null;
}
// Somehow use "T _ready" to change the "bool ready" in "Main Class" back to "true"
}
}
解决方案是约束泛型类型,这样泛型方法就知道如何设置 ready
标志。使用界面很容易做到这一点:
public interface IReady
{
bool ready { get; set; }
}
public class Main : Monobehaviour, IReady {
...
public bool bool ready { get; set; }
...
}
public class WaitAction {
public IEnumerator SomeCoroutine<T>(float count, T _ready) where T : IReady
{
...
_ready.Ready = true;
}
}
我在使用泛型的语法和规则方面遇到了很多麻烦。我正在尝试创建一个结构,其中不同的 classes 可以使用 WaitAction class 在协程 运行 时禁用输入,并在协程完成后重新启用它。
这个例子是一个简化版本,实际上我不会使用计数浮点数来定义协程的长度,而是根据动画和翻译来确定长度。
我想做的事情完全可行吗?
"Somehow use "T _ready" 将 "Main Class" 中的 "bool ready" 改回 "true""
public class Main : Monobehaviour {
WaitAction _waitAction = new WaitAction();
public bool ready;
float delay = 5f;
void Update()
{
if(Input.GetMouseButton(0) && ready)
{
ready = false;
StartCoroutine(_waitAction.SomeCoroutine((delay, this));
}
}
public class WaitAction {
public IEnumerator SomeCoroutine<T>(float count, T _ready)
{
float time = Time.time;
while(Time.time < time + count)
{
yield return null;
}
// Somehow use "T _ready" to change the "bool ready" in "Main Class" back to "true"
}
}
解决方案是约束泛型类型,这样泛型方法就知道如何设置 ready
标志。使用界面很容易做到这一点:
public interface IReady
{
bool ready { get; set; }
}
public class Main : Monobehaviour, IReady {
...
public bool bool ready { get; set; }
...
}
public class WaitAction {
public IEnumerator SomeCoroutine<T>(float count, T _ready) where T : IReady
{
...
_ready.Ready = true;
}
}