Как правильно сделать переменную Public, чтобы к ней мог обращаться другой скрипт? - PullRequest
0 голосов
/ 31 мая 2019

В Unity у меня есть 2 GameObjects, сфера и капсула.

И у меня есть скрипт, прикрепленный к каждому.

Скрипт капсулы:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CapsuleMesh : MonoBehaviour
{

    public Mesh capsuleMesh;

    void Awake()
    {
        capsuleMesh = GetComponent<MeshFilter>().mesh;
        Debug.Log(capsuleMesh);
    }
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

Сфераскрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class ChangeMesh : MonoBehaviour
    {

        Mesh mesh;

        void Awake()
        {
            mesh = GetComponent<MeshFilter>().mesh;
            Debug.Log(mesh);
        }
        // Start is called before the first frame update
        void Start()
        {
            mesh = capsuleMesh;

        }

        // Update is called once per frame
        void Update()
        {

        }
    }

Сетка = капсулыMesh здесь дает мне ошибку о "имя капсулыMesh не существует в текущем контексте".

Я думал, что сделать капсулуMesh общедоступной в другомскрипт сделает ЭТОТ скрипт доступным к нему без проблем.

Что я делаю не так?

1 Ответ

2 голосов
/ 31 мая 2019

capsuleMesh - это переменная класса, определенная в классе CapsuleMesh. Это не глобальная переменная, которую вы можете использовать везде. Вам нужна ссылка на экземпляр класса CapsuleMesh, чтобы получить сетку, хранящуюся в переменной capsuleMesh.

Я переработал оба ваших скрипта, чтобы они работали. Я заметил ошибку в ваших сценариях. Я думаю, ChangeMesh предназначено для изменения сетки игрового объекта? Если это так, вам нужно присвоить новое значение meshFilter.mesh. Назначение новой ссылки на переменную класса mesh недостаточно (было бы довольно долго объяснять, почему)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CapsuleMesh : MonoBehaviour
{    
    public Mesh Mesh
    {
       get ; private set;
    }

    void Awake()
    {
        Mesh = GetComponent<MeshFilter>().mesh;
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeMesh : MonoBehaviour
{
    // Drag & drop in the inspector the gameObject holding the `CapsuleMesh` component
    public CapsuleMesh CapsuleMesh;

    private MeshFilter meshFilter;

    void Awake()
    {
        meshFilter = GetComponent<MeshFilter>();
    }

    void Start()
    {
        meshFilter.mesh = CapsuleMesh.Mesh;    
    }
}
...