将方法分配给实例化的sprite

时间:2015-08-07 13:28:39

标签: c# unity3d

我正在用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();
}

感谢您的帮助!

5 个答案:

答案 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();
    }
}