Почему вы должны ставить (GameObject) перед созданием экземпляра?

#c# #unity3d

#c# #unity3d

Вопрос:

Итак, у меня есть этот скрипт, который создает экземпляр пушечного ядра, а затем добавляет к нему силу при нажатии левой кнопки мыши.

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

public class CannonControl : MonoBehaviour {

    public GameObject cannonBall;
    public GameObject cannonBallSpawn;

    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            GameObject cannonBallClone = Instantiate(cannonBall, cannonBallSpawn.transform.position, Quaternion.identity);
            cannonBallClone.GetComponent<Rigidbody>().AddForce(cannonBallSpawn.transform.forward * 2000); 
        }
    }
}
  

Во многих руководствах люди использовали бы (GameObject) создание экземпляра:

 GameObject cannonBallClone = (GameObject)Instantiate(cannonBall, cannonBallSpawn.transform.position, Quaternion.identity);
  

Я пробовал оба способа и не вижу разницы. Я также не смог найти, что (GameObject) действительно делает.

Какой из них я должен использовать и почему?

Комментарии:

1. Это инструкция приведения, используемая, когда программист знает больше о типе объекта, чем компилятор ( learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types /… )

Ответ №1:

вам не нужно

возможно, ваш пример взят из более старой версии Unity, где Instantiate возвращался всегда Object , и вам пришлось явно (GameObject) вводить cast через или кого-то, кто просто не знал лучше 😉

Instantiate также доступен как универсальный (см. Нижнюю часть страницы)

 public static T Instantiate<T>(T original);
  

и возвращает тот же тип, что и данный сборный файл… в вашем случае это уже является GameObject .

Обратите внимание, что даже в их собственном примере (внизу) дополнительный <Missile> является избыточным, поскольку параметр уже является Missile и определяет T для этого вызова

Вы можете просто вызвать

 GameObject cannonBallClone = Instantiate(cannonBall, cannonBallSpawn.transform.position, Quaternion.identity);
  

Это сказано в качестве дополнительной подсказки: вы могли бы избавиться от GetComponent вызова, если сразу создадите поле prefab правильного типа

 public Rigidbody cannonBall;
public Transform cannonBallSpawn;
  

это также гарантирует, что вы можете ссылаться только на объект / сборку, к которому на самом деле прикреплен требуемый компонент. И тогда вы можете немного короче вызвать

 // will now return a Rigidbody instead
var cannonBallClone = Instantiate(cannonBall, cannonBallSpawn.position, Quaternion.identity);
cannonBallClone.AddForce(cannonBallSpawn.forward * 2000);