【问题标题】:How to change a JS GameObject using C#?如何使用 C# 更改 JS 游戏对象?
【发布时间】:2014-11-03 12:44:07
【问题描述】:

请帮忙!
我有一个引用 2 个游戏对象的 Javascript 组件。问题是,游戏对象在启动时不存在,只有在玩家加入网络房间时才会实例化。网络管理器脚本使用 C#。
播放器实例化时,我需要从 C# 脚本更新 JS 脚本。
到目前为止我的代码......

            SpawnSpot mySpawnSpot = spawnSpots [Random.Range (0, spawnSpots.Length)];
            GameObject myPlayerGO = (GameObject)PhotonNetwork.Instantiate ("PlayerSHIP", mySpawnSpot.transform.position, mySpawnSpot.transform.rotation, 0);
            standbyCamera.SetActive (false);

            ((MonoBehaviour)myPlayerGO.GetComponent ("PlayerControl")).enabled = true;
            ((MonoBehaviour)myPlayerGO.GetComponent ("PlayerShooting")).enabled = true;
            myPlayerGO.transform.FindChild ("CameraCP").gameObject.SetActive (true);
            myPlayerGO.transform.FindChild ("LocalShip").gameObject.SetActive (true);
            myPlayerGO.transform.FindChild ("RemoteShip").gameObject.SetActive (false);
            GameObject test = GameObject.Find ("RadarMgr");
            Component test2 = test.GetComponent("3DRadar");
            test2.Transforms[0] = "LocalShip";
            //test.GetComponent("Radar_Mgr").Transforms[0] = "LocalShip";

这是网络 C# 脚本。我想要访问的 JS 脚本是“3DRadar”组件,它是“RadarMgr”游戏对象的一部分。 “Transforms[0]”是 JS 脚本的一部分,它包含所需的游戏对象,“LocalShip”是我试图告诉 JS 脚本使用的游戏对象。最后两行是我将 LocalShip 分配给 JS 脚本的失败尝试。我确实有其他语法而不是那 2 行,但没有任何效果,这就是它被留下的方式。
需要的另一个对象是“CameraCP”对象,但显然,如果我能弄清楚如何做 1,另一个对象将以相同的方式完成。
我在这里搜索了过去 3 天,统一的答案和一般的谷歌,但如果答案在某处,我找不到也无法理解。
我希望有人能对这个令人沮丧的障碍有所了解!
谢谢!

【问题讨论】:

  • 你得到什么错误?这将有助于追查你做错了什么。它找到游戏对象等了吗?还可以尝试 Component test2 = test.GetComponent("3DRadar") as component("3DRader");
  • 老实说,我不确定最后 4 行是否有效,因为最后几行没有任何语法错误。我现在再看看错误是什么,但我不记得我之前尝试过的一些语法
  • 主要错误与“Transforms[0]”有关,我得到“UnityEngine.Component 不包含 Transforms 的定义”。 “Transforms[0]”是我想要分配一个游戏对象的东西。 JS 脚本有这个..."Transforms[0] = GameObject.Find("_Player").transform;"但这是一种占位符。
  • 如果我打印 test 和 test2,我会得到“RadarMgr (UnityEngine.GameObject)”和“RadarMgr (3DRadar)”,所以我认为它可以正常完成这部分

标签: c# unity3d unityscript


【解决方案1】:

您将其声明为组件而非 3DRadar 类型。你必须更具体一点。

3DRadar test2 = test.GetComponent("3DRadar") as 3DRadar;

我不记得确切的语法,但我相信就是这样。

3DRadar test2 = test3D.GetComponent<3DRadar>();

【讨论】:

  • 我不明白这个答案。如果我使用您的示例语法,我会得到“意外符号'Radar'”。据我所知,我已经获得了游戏对象和组件,但无法将我的游戏对象分配给 Transforms[0]。我可能会用“最后两行失败”的说法误导你......我包含了被注释为 2 中的 1 的行。我确定我只需要知道分配“LocalShip”的正确语法游戏对象为“Transforms[0]”
  • @MajorParts:您的 UnityScript 和 C# 脚本可能在同一个 compilation group 中。这是行不通的,因为 C# 在编译之前不知道 UnityScript 文件中定义的类型。您将组件命名为“3DRadar”?这实际上是一个非法的类名,因为类名不能以数字开头。尝试将 UnityScript (JS) 文件放在第一个编译组(“/Standard Assets/”、“/Pro Standard Assets/”或“/Plugins/”)中
  • 不,它实际上并没有被称为“3DRadar”......它被称为一个更长的奇怪名称,所以为了清楚起见,我在这里缩短了它。如果我使用 C#,我已经被告知在哪里放置此资产的某些文件夹和文件,但由于涉及“Transforms[0]”的语法不正确,我无法进入编译阶段
  • 问题是您将脚本分配给 Unity 引擎组件。虽然所有脚本都是组件,但组件不知道您在脚本中声明的内容。它只是基类。该错误使这一点非常清楚。 “UnityEngine.Component 不包含 Transforms 的定义” 您需要将其分配给 3DRadar 类,而不是将其分配给组件基类。阅读文档:docs.unity3d.com/ScriptReference/GameObject.GetComponent.html 您会注意到他们没有将其分配给组件。
  • 好的,我可以理解,直到“将其分配给 3DRadar 类”。 3Dradar 脚本是 javascript,没有 ac# 脚本中的“类”(例如“公共类 NetworkManager:MonoBehaviour”。这就是你的意思吗?我很抱歉在这方面完全是个业余爱好者!我已经阅读并重新-阅读该文档,但在我看来,“HingeJoint”与脚本组件完全不同
【解决方案2】:

这是我所追求的语法......

GameObject temp = GameObject.Find ("player(Clone)/LocalSHIP");
GameObject.Find("gameMgr").GetComponent<radarScript>().Transforms[0] = temp.transform;

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多