在Unity3d C#中访问动态添加的组件

2023-12-06

添加后Component to a GameObject通过GameObject.AddComponent方法,我怎样才能访问这个Component来自另一个脚本?


这是 myScript 代码(未附加到游戏对象):

using UnityEngine;
using System.Collections;

public class MyScript : MonoBehaviour {
    public string       myName = "myName";
    public Vector3      pos;
    public bool         visible;
}

这是附加到场景中游戏对象的主要代码:

using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour {
    public GameObject cube;

    void Update() {
        if(Input.GetKeyDown(KeyCode.Space)) {
            cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            cube.AddComponent<MyScript>();
        }

        if(Input.GetKeyDown(KeyCode.LeftShift)) {
            var a = GameObject.Find("Cube");

            print("cube name/visible: " + 
            /* here is the problem, how do i access the MyScript variables? */ 
            a.myName + "/" + a.visible);
        }
    }
}

要访问一个Component来自 Unity3dGameObject,你应该使用GameObject.GetComponent<T>()方法。有不止一种方法可以做到这一点。

MyScript m = gameObject.GetComponent<MyScript>();
MyScript m = gameObject.GetComponent("MyScript") as MyScript;
MyScript m = (MyScript) gameObject.GetComponent(typeof(MyScript));

从您的示例代码来看,有一些事情确实应该解决:

  • 如果您想在场景中动态创建组件,最好的做法是创建预制件,然后将其添加到场景中
  • 如果您计划在运行时将大量对象添加到场景中,则应该使用池化,而不是昂贵的创建和销毁对象
  • GameObject.Find("Cube");只会在层次结构中找到一个名为“Cube”的对象。你应该使用FindObjectsOfType<MyScript>()如果你想找到全部GameObjects那些有MyScript成分 (FindObjectOfType如果您只想找到 1)

在此基础上,您可以得到以下变量MyScript像这样:

MyScript a = FindObjectOfType<MyScript>();
print(a.myName + "/" + a.visible);

或者如果您想检查所有状态MyScript活性成分:

MyScript[] myScripts = FindObjectsOfType<MyScript>();
foreach (MyScript myScript in myScripts) {
    print(myScript.myName + "/" + myScript.visible);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Unity3d C#中访问动态添加的组件 的相关文章

随机推荐

  • Django 异常:django.core.exceptions.ImproperlyConfigured:

    当我在 django shell 中运行相同的代码时 它对我来说工作得很好 但是当我启动Python解释器 Python 2 来检查一些东西时 我在尝试导入时收到错误 from django contrib auth models impo
  • 无法在 Flutter 应用程序中加载当前位置

    我正在使用地理定位器插件并获取当前的纬度和经度 但我无法在 Flutter 应用程序的 initstate 中加载它 它显示渲染错误 void initState TODO implement initState super initSta
  • 如何在 Qt 中打印 QWidget?

    我需要知道如何将 QWidget 打印为 PDF 文件 Widget QDialog 包含很多标签 一些 QPlainTextEdit 和一个背景图像 该对话框显示一张收据 其所有字段均已填写 我已经尝试使用 QTextDocument 和
  • Flutter Firebase 通过 ID 数组获取文档

    如何使用 ID 列表从集合中获取文档查询 假设我有以下内容 List
  • 使用 jQuery 检测页面加载时鼠标悬停

    我想检测加载网页时鼠标是否位于某个元素上 看来这对于 jQuery 来说是不可能的 鼠标悬停 悬停等需要鼠标移动 与获取当前鼠标位置 与元素边界进行比较 一样 我还没有看到这个具体问题被问到 但看到人们说这是不可能的 我的解决方案 使用悬停
  • Python ftplib FTP传输文件上传中处理断开连接

    如何处理 ftplib 中的断开连接 我编写了一个 Python 脚本 用于使用 ftplib 将非常大的文件上传到 FTP 服务器 我的问题是 由于文件大小的原因 上传可能需要很长时间 如果中途断网 然后 1 分钟后重新连接怎么办 我该如
  • std::map 默认值

    有没有办法指定默认值std map s operator 当键不存在时返回 虽然这并不能完全回答问题 但我已经用这样的代码规避了这个问题 struct IntDefaultedToMinusOne int i 1 std map
  • 从渲染器接收消息超时:10.000

    运行我的场景时出现以下错误 org openqa selenium TimeoutException 超时 接收超时 来自渲染器的消息 10 000 会话信息 chrome 79 0 3945 79 构建信息 版本 3 14 0 修订版 a
  • 如何继承GWT项目中所需的模块?

    我想在我的 GWT 项目中使用 GWT FXv0 5 0MS 1 jar 我将 jar 文件添加到项目路径并使用语法上的代码 现在收到未继承的错误 错误信息是 11 28 48 829 ERROR uibuilder Line 80 No
  • 尽管 JavaFx 类存在于 JDK 中,但 Java 无法找到 JavaFx 类

    我目前正在开发一个使用 javafx 作为 UI 的应用程序 我使用的是java 9 当我从github上拉出来继续在我的新计算机上开发并编译时 所有javafx类的引用都存在编译错误 并且只有javafx类 我在外部资源中的jdk中搜索了
  • 如何在Python中单行输入n个数字[重复]

    这个问题在这里已经有答案了 就像在 C 中一样 我如何要求用户输入一个范围内的内容 下面是 C 中获取用户输入的代码 include
  • 将环境变量传递给 gradle.properties

    我有一个这样的属性设置 url localhost 3206 有没有办法像下面这样指定 url hostname 3206 我不认为 gradle properties 支持插值 但是 我建议采用另一种方法来实现此目的 在你的 gradle
  • Asp.net 表单身份验证和多个域

    我有两个域 domain1 com 和domain2 com 指向同一个asp net 网站 该网站使用asp net 内置表单身份验证 问题是 即使域指向同一网站 用户一次也只能针对一个域进行身份验证 因此 如果他首先使用 www dom
  • JSF 2.0 中的 WEB.XML 错误页面

    我正在使用 JSF2 和 Glassfish 3 0 我有一个非常简单的应用程序 我正在尝试设置一些默认错误页面404 and 500 error 这是WEB XML部分
  • 插入表单时如何删除 Word 标记垃圾?

    我正在用 PHP 构建一个 CMS 我担心的一个问题是用户必须从现有的 Word 和 Excel 但不用担心 文档中填写数据 现在 我已经看到了当他们不小心从 Word 复制并粘贴到文本区域时会发生什么 数据库充满了垃圾标记 现在 我当然可
  • Xamarin 链接器:未找到 Cirrious.CrossCore.IoC.MvxPropertyInjector 类型的默认构造函数

    使用 HotTuna 包中的 FirstView 的骨架项目 并将构建链接器行为设置为 链接所有程序集 我收到以下错误 System MissingMethodException 找不到 Cirrious CrossCore IoC Mvx
  • 如何设置 application/json 以外的 Content-Type

    我正在尝试通过 AFNetworking2 0 向我的服务器发送 REST API 我们的服务器只接受Content Type as application vnd mycom mycom csc json当我发送请求时 它确实是json格
  • 启动本地azure项目时调试器无法连接

    好的 首先 这就是我所做的 安装 AZURE 工具 Reboot 启动 Visual Studio 新的 Azure 项目 添加 Web 角色 asp net MVC 4 beta Web 角色 按 F5 调试 它启动存储模拟器和计算模拟器
  • 如何设置表适配器的连接字符串(动态设置的连接字符串)

    我刚刚从另一位不再在公司工作的开发人员那里继承了 数据库专家 的角色 所以如果我听起来特别菜鸟 请原谅我 该应用程序是一个 VB NET 4 应用程序 我们的表适配器的数据库连接字符串是 my settings My Settings DB
  • 在Unity3d C#中访问动态添加的组件

    添加后Component to a GameObject通过GameObject AddComponent方法 我怎样才能访问这个Component来自另一个脚本 这是 myScript 代码 未附加到游戏对象 using UnityEng