英文:
How to pass a type to a method, by finding the type by its name in Unity
问题
Here is the translated code portion you requested:
我有一个方法,它会检查当前的游戏状态,并返回一个布尔值,以确定传入的值是否等于当前状态:
public bool IsEqualToCurrentState<T>() where T : GameState
{
if (currentGameState is T)
return true;
return false;
}
我有多个游戏状态,其中一些是:`PointTutorialState, GrabTutorialState, MoveTruckState`...
通常情况下,我会这样调用该方法:
GameStateManager.Instance.IsEqualToCurrentState<PointTutorialState>()
现在,我正在编写一个脚本,该脚本将用于多个`gameObjects`,如果状态与`gameObject`负责的状态相同,则应突出显示该对象。因此,唯一的区别是该对象的状态类型。
我的想法是创建一个SerializeField字符串,其中存储了该对象的类型名称,并调用方法`IsEqualToCurrentState<>()`。
我尝试在Google中搜索,但没有找到我所需要的内容。ChatGPT也不能帮助我,但这是它写的内容:
```csharp
private bool MatchesTheGameState()
{
Type newType = Type.GetType(nameState);
MethodInfo method = typeof(GameStateManager).GetMethod("IsEqualToCurrentState");
MethodInfo genericMethod = method.MakeGenericMethod(newType);
return (bool)genericMethod.Invoke(GameStateManager.Instance, null);
}
接受nameState
是这行代码:
[SerializeField] string nameState;
带有值:PointTutorialState
有没有解决方案,可以通过只提供所需状态的名称并将其转换为该类型以便传递来调用IsEqualToCurrentState
方法?
Please note that the code has been translated, but it may not be executable in its current form as it contains HTML-encoded characters like `<` and `"`. You will need to replace these with the appropriate symbols ('<' and '"') in your code.
<details>
<summary>英文:</summary>
I have a method which checks the current game state and returns boolean if the passed value is equal to the current one:
public bool IsEqualToCurrentState<T>() where T : GameState
{
if (currentGameState is T)
return true;
return false;
}
I have multiple gamestates, a few of them being: `PointTutorialState, GrabTutorialState, MoveTruckState`...
Normally I would call the method this way:
GameStateManager.Instance.IsEqualToCurrentState<PointTutorialState>()
Now, I am writing a script which would be used on multiple `gameObjects` and should highlight the object if the state is the one that the `gameObject` is responsible for. So, the only difference is the type of the state for that object.
My ideas was to make a serializeField string, where the name of the type for that object would be stored and call the method `IsEqualToCurrentState<>()`
I tried searching in google but I had no luck in finding what I needed. ChatGPT also couldn't help me, but this is what it wrote:
private bool MatchesTheGameState()
{
Type newType = Type.GetType(nameState);
MethodInfo method = typeof(GameStateManager).GetMethod("IsEqualToCurrentState");
MethodInfo genericMethod = method.MakeGenericMethod(newType);
return (bool)genericMethod.Invoke(GameStateManager.Instance, null);
}
accepting that nameState is this line of code:
[SerializeField] string nameState;
with value: PointTutorialState
Any solutions how I can call the IsEqualToCurrentState method by just giving the name of the desired state and converting it to that type so I can pass it?
</details>
# 答案1
**得分**: 1
你可以简单比较类型名称,这基本就足够了。
```csharp
public bool IsEqualToCurrentState(string stateName)
=> currentGameState?.GetType().Name == stateName;
英文:
You can simply compare the type name, this is basically enough.
public bool IsEqualToCurrentState(string stateName)
=> currentGameState?.GetType().Name == stateName;
答案2
得分: 1
这似乎是在你的Update()方法中有许多if语句,可能会变得复杂和有错误。
事件将使此过程更加简单和清晰,可在此处找到一个可工作的示例:https://www.youtube.com/watch?v=k4JlFxPcqlg
在需要将状态更改为PointTutorialState的地方调用OnPointTutorialState,然后在任何需要为该事件进行更改的对象中,添加一个事件处理程序,以进行所需的更改。根据对象和您的状态需求,您可能还需要一个OnPointTutorialStateExit事件。
最后,当完成教程时,可以清除所有教程状态/事件侦听器,以使事情变得更加清晰。
英文:
This sounds like a bunch of if statements in your Update() methods that could get complicated and buggy.
Events would make this easier and cleaner, a working example at: https://www.youtube.com/watch?v=k4JlFxPcqlg
You call OnPointTutorialState in the place where you would set the state to PointTutorialState, and then in any object that needs to change for that state change, add an event handler that makes the changes you need for that event. Depending on the object and your state needs, you might also need an OnPointTutorialStateExit event.
Finally, this could clean things up a bit in that when you are done with tutorials, you could disable all the tutorial state/event listeners.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论