我可以从非单行为脚本中访问单行为脚本吗?

时间:2019-05-01 12:06:42

标签: c# unity3d

我正在尝试从非单行为脚本中访问单行为脚本,但还没有任何运气。这两个类需要保持原样,因为更改它们会破坏很多功能,因此我无法创建实例,也无法将其附加到游戏对象上进行拖放。

有什么想法吗?

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, 
     shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

  <title>GET OWNER DETAILS</title>
  </head>
  <body>
    <div class="container">
        <div class="row">
            <div class="col-lg-2"></div>
            <div class="col-lg-8">
<form id="form">
<div class="form-group" id="formID" >
<label for="regn_no">REGN_NO</label>
<input type="text" class="form-control" id="UserInput" placeholder="Enter 
regn_no here" name="regn_no"><br>
<input type="button" 
onclick="location.href='http://localhost:3000/details" id="submitButton"  
value="Submit" />
</div>
</form>      
</div>
</body>
</html>


```jquery
$(document).ready(function(){
     $("#form").submit(function (event) {
          $.post('/details', $("#form").serialize(), function (data) {
            console.log(data) //data is the response from the backend
          });
          event.preventDefault();
        });
 })

3 个答案:

答案 0 :(得分:0)

是,但是...

由于需要附加到游戏对象上,因此无法在从new继承的任何脚本上调用MonoBehaviour。因此,您不能创建引用,但可以绝对传递它们:

public class myClass1 : monoBehaviour
{
  public String text = "hello";
}

public class myClass2
{
  private void Start(myClass1 mc1)
  {
    Debug.Log(mc1.text);
  }
}

现在,myClass2#Start在此示例中将很难调用,但可以编译。

我一直在我的项目中做这样的事情。我通常有一个类,它是一个MonoBehaviour组件,该类通过static instance field附加到主摄像头,我可以从其他任何地方引用它,尽管大多数非MB脚本大多数时候都不会处理Unity对象(它们仅保存数据,并且其中一个管理类通过维护它们之间的字典来处理用该数据更新游戏对象)。

尽管sometimes对象拥有自己的GO引用(尝试不同的方法以查看可行的结果或希望避免字典查找的结果-不管它是否有效)。

答案 1 :(得分:0)

哇,我不知道您可以将它们作为参数传递。很高兴知道这一点,但是在我的项目中,这是行不通的,因为我是从另一个非MB脚本调用该方法的,该脚本没有在任何地方引用该MB脚本以将其传递给我。

我所做的是创建一个空的游戏对象,并将脚本作为组件附加,然后从那里跨non_MB脚本使用该类。

3行代码:

GameObject obj = new GameObject();
obj.AddComponent<MyScript1>();
MyScript1 myscript1 = obj.GetComponent<MyScript1>();

非常有用,因为游戏对象不限于MB。

希望这可以帮助其他人

答案 2 :(得分:0)

作为@Zaine的GetComponent方法的替代方法,我想将单例模式放入可能的答案池中:

public class SomeClass : MonoBehaviour {
    private static SomeClass _instance;
    public String text = "singleton text";

    public static SomeClass Instance { get { return _instance; } }
    private void Awake()
    {
        if (_instance != null && _instance != this)
        {
            Destroy(this.gameObject);
        } else {
            _instance = this;
        }
    }
}

仅当您完全拥有一个脚本时,此命令才有效。但是从所有其他脚本中,您都可以轻松访问它:

public class SomeOtherClass : MonoBehaviour {
     private void Start(myClass1 mc1)
     {
         Debug.Log(SomeClass.Instance.text);
     }
}