我正在用C#创建一个2d Turret Defense游戏,我对炮塔更新的管理有疑问。 我想在炮塔精灵上创建菜单,有几个升级选项。
我的想法是从资源中加载菜单作为精灵,将其作为子项分配给炮塔游戏对象,然后管理按钮到炮塔之间的通信以开始升级过程。
有一种方法可以为新加载的资源分配方法/功能吗?
例如(在炮塔类中):
Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
myMenuButton.OnMouseDown(){
// do something with the current turret's class
};
或者我必须在资源文件夹中保存gameObject精灵,并在脚本内部管理OnMouseDown方法,搜索炮塔的父脚本并使用正确的方法?
例如(在菜单精灵类中):
void OnMouseDown(){
GameObject parent = gameObject.transform.parent.gameObject;
turretScript parentScript = (turretScript) go.GetComponent(typeof(turretScript));
parentScript.doUpgrade();
}
感谢您的帮助!
答案 0 :(得分:0)
我不知道Sprite本身(文档可能有关于它的信息,您是否已经在那里研究过?)
但我不明白为什么你不能使用Buttons而不是Sprite来处理你想要做的“菜单行为”。 Button类有一个onClick事件处理程序,您可以使用它在运行时分配列表器,如
myMenuButton.onClick.AddListener(() => {
//handle click here
});
你也可以通过lambda表达式设置方法,只需google关于它,你就会找到很多资源来学习如何使用它;)
答案 1 :(得分:0)
首先创建一个已经实现OnMouseDown
的类和一个函数指针列表,并将此类附加到您将要事先使用它的每个项目上。
public class MouseDownScript : MonoBehaviour
{
public List<Action> Actions = new List<Action>();
void OnMouseDown(){
foreach(Action action in Actions)
action();
}
}
然后你有能力:
{
Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
// Cache the script
MouseDownScript mouseScript = myMenuButton.GetComponent<MouseDownScript>();
// Add anonymous actions with a lambda as such:
mouseScript.Actions.Add(() => /*Any action here*/);
// Add existing functions as such:
mouseScript.Actions.Add(MouseDownAction));
}
public void MouseDownAction() {}
答案 2 :(得分:0)
我不了解Unity,但您可以从Sprite继承,为Action类型添加属性,并在使用Resources.Load创建它后指定它。
class Program
{
static void Main(string[] args)
{
var s = new Sprite();
s.Action = dostuff;
// outputs Hello
s.Action.Invoke();
Console.ReadLine();
}
public static void dostuff() { Console.WriteLine("Hello"); }
public class Sprite
{
public Action Action { get; set; }
}
}
答案 3 :(得分:0)
创建Sprite时可以向Sprite添加新类
Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
myMenuButton.AddComponent<ClassForSprite>();
In ClassForSprite
public class MouseDownScript : MonoBehaviour
{
void onAction1(){
//Code process for action 1
}
void onAction2(){
//Code process for action 2
}
}
答案 4 :(得分:0)
我想你会想要使用delegates。
基本上你定义一个方法签名,例如
public delegate void ClickHandler();
然后定义该签名的实例:
public ClickHandler OnClick;
您可以在运行时为OnClick分配方法并执行。 在炮塔中:
public void ExecuteOnTurrent()
{
// do stuff in turret
}
public void LoadSprite()
{
Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
myMenuButton.OnClick= ExecuteOnTurrent;
}
精灵中的
public delegate void ClickHandler();
public ClickHandler OnClick;
public void Update()
{
//- detect click or other action
if(click and OnClick!= null)
{
OnClick();
}
}