如何将整数值发送到另一个脚本?

时间:2018-03-20 01:10:19

标签: c# unity3d

我正在制作一个游戏,玩家首先必须选择在玩之前使用的控件类型。三个选项是:键盘,控制器,触摸

玩家必须单击与其选择对应的按钮。单击时,每个按钮都会运行此脚本:

public class KeyboardButton : MonoBehaviour {

    public static int controller;

    public void buttonClick () {
        controller = 1;
    }
}

实际上,每个按钮都是自己的脚本,其中控制器的值根据脚本运行而不同。这个想法是这个整数的值将被发送到负责控制播放器的脚本,因此它将使用所需的输入类型。即:如果选择了键盘按钮,它将运行相应的脚本,将整数值设置为1.在PlayerController脚本收到此值后,它将知道只接受来自键盘的输入。

我已经查阅了很多文档,但是很多文档包含了我不理解的特定于上下文的C#,并且与我想要做的事情无关。

另外,我不喜欢这样的答案:“你不必让玩家选择一种控制类型,这就是你如何让你的游戏同时接受所有类型的控制。”我已经知道所有这些东西,我有理由希望玩家做出选择。此外,我仍然想知道一种转换整数的方法,以便能够更有条理,而不是只有一个脚本可以完成游戏中90%的事情。

2 个答案:

答案 0 :(得分:1)

有三种方法可以将值传递给另一个脚本。

<强> GetComponent

您可以使用GetComponent方法获取其他脚本。

public class KeyboardButton : MonoBehaviour {

    public int controller;

    //this is anotherScript instance
    public AnotherScript anotherScript;

    Start()
    {
        anotherScript = GameObject.Find("Name of Object").GetComponent<AnotherScript>();
    }


    public void buttonClick () {
        controller = 1;

        anotherScript.sendValue(controller); //send your value to another script
    }
}

<强>的Singleton

让AnotherScript成为静态 Singleton ,你可以在另一边获取实例。

public class AnotherScript : MonoBehaviour 
{
    //need to be static
    public static AnotherScript Current; 

    Start()
    {
        if(Current == null)
        {
            Current = new AnotherScript();
        }
    }


    public void sendValue(int val) 
    {
        //todo
    }
}

public class KeyboardButton : MonoBehaviour 
{

    public int controller;

    public void buttonClick () {
        controller = 1;


        AnotherScript.Current.sendValue(controller);//send your value to another script
    }
}

<强>的SendMessage

如果您想向其他人发送值,SendMessage是一种您可以选择的简单方法。

ps:SendMessage方法只需发送一个参数。

public class KeyboardButton : MonoBehaviour 
{

    public void buttonClick () 
    {
        controller = 1;

        GameObject.Find("name of object").SendMessage("sendValue",controller);
    }
}

答案 1 :(得分:0)

正如其中一条评论所指出的,你已经暴露了这个价值,你可以参考是通过

Debug.Log(KeyboardButton.controller); 

没有提供实例。还有其他多种方式可以做到这一点,因为这种方式只对某种程度的复杂性有好处,之后它开始变得更加泥泞,但根据你需要知道它可能会让你通过。这是有效的方法之一,也许是最简单的方法。

您可能还想知道值何时发生了变化,例如您可以使用UntiyEvent并在值更改时触发它

public class KeyboardButton : MonoBehaviour {
    public UnityEvent OnValueChanged;
    public static int controller;

    public void buttonClick () {
        controller = 1;
        OnValueChanged.Invoke();
    }
}

这是你想在编辑器中连接事件。你也可以这样做:

 public class KeyboardButton : MonoBehaviour {
        public static UnityEvent OnValueChanged;
        public static int controller;

        public void buttonClick () {
            controller = 1;
            OnValueChanged.Invoke();
        }
    }

缺点是该事件不会出现在编辑器中,但好处是你可以设置一个触发器而无需引用刚刚点击的KeyboardButton实例。

public class ControllerChangeReactor : MonoBehaviour {
 void Start()
 {
   KeyboardButton.OnValueChanged.AddListener(React); // add event listener
 }

 void React()  // will get called when keyboard is clicked
 {
    Debug.Log(KeyboardButton.controller); 
 }


}

在您编写了十几个这样的脚本后,这种方法可能会受到限制,但升级涉及定制一个可能在您的级别上不值得的自定义系统(仅此而已)。您可以使用上述方法完成一个简单的游戏,即使它不是最优雅的。

您还可以参数化您的脚本(在编辑器中公开&#39;它会发生什么变化),以避免不必要的代码倍增