Unity3d: 通过GetComponent访问另一个脚本的类出现错误

3

问题已解决 我正在尝试访问包含在另一个脚本中的类,但我收到了这个错误消息:“Internal_Create仅可从主线程调用”。 .init函数只是更改类内部的一些值。

我已经尝试通过搜索答案来解决它,但我找不到任何有用的信息。

这是出现错误的主循环:

public class MainLoop : MonoBehaviour {

public float jagginess;


void Start () {
    jagginess = 0.6f;
    CMesh cmesh = GameObject.Find("GameObject").GetComponent<CMesh>();
    cmesh.init(32);

}


void Update () {

    //if (Input.GetKeyDown(KeyCode.Space)) {

}

和网格类mesh:

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshCollider))]

public class CMesh : MonoBehaviour {

        Mesh mesh = new Mesh();

        Texture2D heightMap;

        int segments;
        Vector3 scaleSegments;

        Vector3[] vertices;
        Vector3[] normals;
        Vector2[] uv;
        int[] triangles;

        Vector3 camera_position = GameObject.Find ("Main Camera").GetComponent<cameraMovement>().camera_pos;

        public void init(int mesh_segments) {

            scaleSegments = new Vector3(200, 100, 200);

            segments = mesh_segments;

            initHeightMap();
        }

在评论中发布大量代码并不是一个好主意。您可以随时编辑您的帖子。话虽如此,您的类很好。请看下面我的答案,它应该解决您的问题。 - user2085599
`using UnityEngine; using System.Collections;[RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshCollider))]public class CMesh : MonoBehaviour { Mesh mesh = new Mesh(); Texture2D heightMap; int segments; Vector3 scaleSegments = new Vector3(200, 100, 200); Vector3 camera_position = GameObject.Find ("Main Camera").GetComponent<cameraMovement>().camera_pos; public void init(int mesh_segments) { segments = mesh_segments; initHeightMap(); } ` - whoadrian
我已经将代码添加到问题中。 - whoadrian
第一个错误是因为在start函数之前初始化变量。已修复。现在只剩下Internal_Create问题了。 - whoadrian
我已经注释掉了一些代码行,以便查看错误发生的确切位置。我什么也没找到,当我删除所有的//时,它就可以工作了。不知道为什么,别问我。谢谢大家,没有你们我做不到。 - whoadrian
显示剩余6条评论
2个回答

1

每次在使用 GetComponent() 前,您需要问自己这个问题:包含您要查找的脚本的 GameObject 是什么?

一旦您知道 GameObject 的名称,如果脚本附加在不同的 GameObject 上,您可以执行以下操作:

CMesh cmesh = GameObject.Find("NameOfGameObject").GetComponent<CMesh>();

如果脚本附加在相同的 GameObject 上,您可以执行以下操作:

CMesh cmesh = GetComponent<CMesh>();


请注意,这个问题已经得到解决,它与引用this.gameObject无关。 - Burdock
你一直在错误地解决这个问题。事实上,说this.gameObject是多余的。我的代码肯定会起作用。 - user2085599

-2

你忘了对组件进行转换。尝试使用以下代码: CMesh cmesh = (CMesh) gameObject.GetComponent< CMesh >();

在此之前,请确保你要访问的脚本位于同一对象上。否则,你需要先获取该对象,然后再获取组件:

CMesh cmesh = (CMesh) GameObject.Find("这里是对象名称").GetComponent< CMesh >();

第二种方法对我总是有效。

希望这可以帮到你。

祝好!


在Unity中,GetComponent<T>()不需要强制转换,因为它是一个泛型。 - Burdock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接