我正在制作一个游戏,玩家首先必须选择在玩之前使用的控件类型。三个选项是:键盘,控制器,触摸
玩家必须单击与其选择对应的按钮。单击时,每个按钮都会运行此脚本:
public class KeyboardButton : MonoBehaviour {
public static int controller;
public void buttonClick () {
controller = 1;
}
}
实际上,每个按钮都是自己的脚本,其中控制器的值根据脚本运行而不同。这个想法是这个整数的值将被发送到负责控制播放器的脚本,因此它将使用所需的输入类型。即:如果选择了键盘按钮,它将运行相应的脚本,将整数值设置为1.在PlayerController脚本收到此值后,它将知道只接受来自键盘的输入。
我已经查阅了很多文档,但是很多文档包含了我不理解的特定于上下文的C#,并且与我想要做的事情无关。
另外,我不喜欢这样的答案:“你不必让玩家选择一种控制类型,这就是你如何让你的游戏同时接受所有类型的控制。”我已经知道所有这些东西,我有理由希望玩家做出选择。此外,我仍然想知道一种转换整数的方法,以便能够更有条理,而不是只有一个脚本可以完成游戏中90%的事情。
答案 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;它会发生什么变化),以避免不必要的代码倍增