#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);