【Unity】(探讨)一个预制体对象GO存放入一个脚本A中,再使用另外一个脚本B来调用A脚本的预制体对象GO。
发布日期:2021-05-09 11:45:43 浏览次数:2 分类:技术文章

本文共 2915 字,大约阅读时间需要 9 分钟。

如果你gameManager是某个对象上的脚本,你可以先Find这个游戏对象然后用gameManager=gameObject.GetComponent
()来获取在一个脚本内访问其他组件:  脚本等组件都是类,对应的实例一般是依托于游戏对象的。因此访问特定的组件实例必须先得到其依附的游戏对象,可以通过上述说的函数或者在脚本中定义外部变量两种方式得到某个游戏对象(外部变量传入对象方式时,传入类型设置为GameObject,才好找组件)。得到了对象后,很多组件就可以直接访问,比如Transform。  //在已经获取游戏对象BB实例情况下,A脚本访问BB对象上的脚本B的成员函数bb与变量bbb  B b=(B)BB.Getcomponent("B脚本的名字");  b.bb();或b.bbb; 注意!!!为了防错,所有找GO对象,传入G0对象的代码都要做防空报错处理。 class A调用class B里面的变量,如果只是直接调用。会显示没有实例化class B这是因为class B这个类(或者说是.cs文件)不存在该场景中,而class B这个类通常要挂靠一个GameObject(或者空物体)才能够运行作为演示,创建两个空物体New Sprite和New Sprite(2)分别挂了脚本LTest1和LTest2using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ltest1 : MonoBehaviour{ static Ltest1 instance; public GameObject go; public int test = 10; private void Start() { print("LTEST1"); } public void show() { print("LTEST1.show"); }}using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ltest2 : MonoBehaviour { public Ltest1 LT1; void Start () { LT1.show(); }}然后使得LTest2.cs文件实行,发现这样直接调用,是不行滴。显示错误目标没有实例化。意思是,LTest2.cs文件找不到LTest1.cs文件的函数class LTest1首先要找到这个GameObject对象NewSprite(2),然后找到其下挂的脚本LTest 2,然后对其进行调用下图显示调用结果,显示成功LTest1.cs文件代码没有改变LTest2.cs文件代码如下所示using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ltest2 : MonoBehaviour {    private GameObject LT1;    void Start () {        LT1 = GameObject.Find("New Sprite");        LT1.GetComponent
().show();    }}--------------------如果想把一个预制体对象GO存放入一个脚本A中,再使用另外一个脚本B来调用A脚本的预制体对象GO。那么该如何实现呢创建一个物体如下所示把新建的物体放入LTest1脚本所在的物体,拖入到GO这个公共物体中(之前已经定义过了)  Ltest2的脚本改动如下所示 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ltest2 : MonoBehaviour {
    private GameObject LT1;     void Start () {
        LT1 = GameObject.Find("New Sprite");         LT1.GO.GetComponent
().material.color = new Color(0, 0, 1, (float)0.5);         LT1.GetComponent
().show();     } } Assets/Scripts/Ltest2.cs(14,13): error CS1061: Type `UnityEngine.GameObject' does not contain a definition for `GO' and no extension method `GO' of type `UnityEngine.GameObject' could be found.  Are you missing an assembly reference? 谷歌一下,
Assets / Scripts / Ltest2.cs(14,13): error CS1061:类型`UnityEngine.GameObject'不包含`GO'的定义, 并且没有找到类型为`UnityEngine.GameObject'的扩展方法`GO'。 你缺少一个程序集引用?
很显然,脚本A中存放一个公共对象GameObject名字为GO,在脚本B中获得脚本A中的物体GO,是不切实际的,如果有谁能解决这个问题, 麻烦请留言并附上详细信息,感激不尽 实际创建一个全局脚本,把所有新建物体极其父物体的对象,收集起来 但是最好是创建一个文件夹专门存放预制体,意思是所有物体对象都创建预制体 使用GameObject right_hand = Resources.Load("123/Armature_Right_Hand") as GameObject; 来调用物体对象,比GameObject.Find()效率更高
第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名()。很不实用……
第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数
第三种,GameObject.Find("脚本所在物体名").GetComponent
<脚本名>
().函数名();此种方法只可以调用public类型函数

转载地址:https://blog.csdn.net/BuladeMian/article/details/53861342 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:研发 | Unity资源商店里的免费资源,你一定要知道!
下一篇:Shader资料总结

发表评论

最新留言

不错!
[***.144.177.141]2023年10月01日 02时26分02秒