【发布时间】:2018-05-26 11:52:30
【问题描述】:
我有两个基于 Unity 的类,其中一个代表 Player 对象,另一个代表应该能够操纵玩家的 powerup。
我的想法是将播放器操作封装在一个可以传递给播放器对象的方法中,例如当玩家与通电发生碰撞时。
这些操作可以包括简单的字段和属性更改(健康点),还可能包括协程(自动射击或具有时间间隔的盾牌)。
目前,我的播放器类在其自身中包含所有与通电相关的操作,并根据碰撞时从通电对象传递的字符串调用它们:
PlayerController.cs
public class PlayerController : MonoBehaviour
{
private Dictionary<string, UnityAction> powerupMethods;
// ...
public void ActivatePowerUp(string name)
{
Invoke(powerUpMethods[name]);
}
}
Powerup.cs
public class Powerup : MonoBehaviour
{
private string _name;
// ...
private void OnCollision2D(Collision col)
{
PlayerController p = col.collider.GetComponent<PlayerController>();
if (p != null)
{
p.ActivatePowerup(_name);
}
}
}
我的愿望是从玩家对象中消除所有与通电相关的逻辑并将其保留在相应的通电中。
是否有技术上的可能性将此类操作包含在一个可以从 powerup 对象传递到 player 对象的方法中,像这样?最好的情况是玩家对象可以访问方法中的私有字段。
// Powerup.cs
public void Ability()
{
// Do stuff with Player object, even private fields
// e.g. player._health++;
// But also activate self-based Coroutines
// e.g. StartCoroutine(CoroutineMethod());
}
private IEnumerator CoroutineMethod()
{
// e.g. auto fire for 5 seconds
}
private void OnCollision2D(Collision2D col)
{
PlayerController p = col.collider.GetComponent<PlayerController>();
if (p != null) p.Invoke(Ability());
}
【问题讨论】:
-
您最后的示例代码令人困惑,您是否要将
Player对象传递给Powerup(作为参数 - 在这种情况下,这里有什么问题?)还是您想要将函数传递给另一个类(例如:作为回调)? -
我更新了我想要的代码。
-
如果你真的想传递一个函数,那么你可以使用
delegate,请参阅官方文档:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… - 至于“更好的建议”,这主要取决于你非常具体的场景,所以很难给出一般性建议(在许多情况下,将方法作为参数传递是一种可接受的选择) -
我不确定您为什么认为有问题 - 您是否有实际错误(如果有,请发布代码和确切的错误消息)?您可以将几乎任何东西作为参数传递,只需弄清楚参数类型需要是什么。
-
我只会让电源在碰撞时操纵玩家统计数据,然后自行摧毁。对于枪支之类的东西,我会将它们添加到清单之类的列表中,并让列表根据当前内部的内容影响玩家
标签: c# function unity3d parameter-passing