(Пример из Unity3d) Проблема с понимаем типов в C#, как оно работает?

f3f61c470f04428b89b1646c3035cf96.jpg

Не могу понять несколько строчек кода, вот на пример :
public GameObject moveObject; - Как я понимаю тут мы объявили переменную moveObject ссылочного типа (потому что GameObject это класс), но как она должна работать ? Ведь это же не Int или String, а оператор new мы не использовали что бы выделить память и получить обьект. Мне это не понятно как оно работает ! Помогите разобраться в этом ...

public class MoveObject : MonoBehaviour
{
    public GameObject moveObject;
    public Transform targetPosition;
    public float speed;
	// Use this for initialization
	void Start ()
    {
		
	}
	
	// Update is called once per frame
	void Update ()
    {
        moveObject.transform.position = Vector3.MoveTowards(moveObject.transform.position, targetPosition.position, Time.deltaTime*speed);
        moveObject.transform.LookAt(targetPosition);
	}
}
  • Вопрос задан
  • 571 просмотр
Решения вопроса 2
GavriKos
@GavriKos Куратор тега Unity
При старте скрипта юнити положит в ваш moveObject то, что вы перетащили туда в инспекторе. Скрытно и незаметно.
Ответ написан
ArXen42
@ArXen42
Если очень грубо, moveObject это указатель. Где-то там, в глубине, это IntPtr, обычно являющийся 64 или 32 битным числом. И изначально это число будет равно null (т.е. все нули или какое-нибудь другое условное обозначение "ничего").
Перед тем как "отдать" этот объект вам (т.е. начать вызывать Start, Update и прочие методы), Unity, как было указано выше, "скрытно и незаметно" присвоит этому полю значение, указывающее на объект, который вы поставили в инспекторе.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
а оператор new мы не использовали

Например, так:
using System;
using System.Reflection;

public class Program
{
	public static void Main()
	{
		MoveObject obj = UnityFactory.GetInstance<MoveObject>();
		
		obj.moveObject.SayHello();
	}
}


public class GameObject
{
	private string name;
	
	public GameObject()
	{
		name = "John";
	}
	
	public void SayHello() {
		Console.WriteLine("Hello! My name is " + name );
	}
}


public class MoveObject
{
    public GameObject moveObject;
}


public class UnityFactory {
    public static T GetInstance<T>() where T: new()
	{
		
		// Создадим экземпляр основного класса
        T instance = (T)Activator.CreateInstance(typeof(T));
		
		// Инициализируем его открытые поля
        FieldInfo[] fields = typeof(T).GetFields();
		
        foreach (FieldInfo field in fields)
        {
            object fieldValue = Activator.CreateInstance(field.FieldType);
            field.SetValue(instance, fieldValue);
        }
		
		return instance;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы