Как объяснялось в предыдущих ответах, вы смешиваете экземплярную область и классовую (статическую) область.
Хотя было упомянуто несколько методов, которые могут привести к тому, что этот скрипт будет работать так, как вы его запустили (вы можете использовать статический класс Resources для поиска ресурсов по имени файла), я хотел бы предложить сделать это наоборот. и сделать ваш класс MonoBehaviour. Хотя это может показаться нелогичным для людей, которые закодировали в c и предпочитают иметь четкую точку входа в свой код, во многих случаях очень полезно привыкнуть к тому, что вам нужно добавить GameObject, который будет содержать ваш основной сценарий где-то.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class ShipInstanceCreator: MonoBehaviour
{
public GameObject ship;
void Start()
{
GameObject player = Object.Instantiate (ship, transform.position, transform.rotation) as GameObject;
}
Каковы преимущества?
Первое и главное преимущество заключается в том, что все, что унаследовано от MonoBehaviour, получает полную поддержку от UnityEditor - так что вы получаете бесплатные окна «Инспектор», где вы можете перетаскивать вещи, иметь ползунки и т. Д. Бесплатно, вы получаете флажок «включить / отключить» , вы получаете обратные вызовы при изменении состояния включения / выключения, вы получаете локальный компонент преобразования (который часто удивительно полезен), вы получаете коллизии и т. д.
Unity также сможет сериализовать свое состояние, не делая этого вручную, что означает, что вы получаете полностью определенный жизненный цикл объекта (который может быть очень забавным в редакторе, когда части сборки перезагружаются и некоторые т).
Такой сценарий может также создавать экземпляры вражеских кораблей и астероидов (в своей собственной позиции и ориентации трансформации), и поскольку функциональные различия между ними могут (и должны) быть реализованы как поведения, характерные для данного префаба, для вашего экземпляра нет необходимости класс, чтобы узнать что-либо еще о том, что он создает, кроме того, который должен быть GameObject
Наконец, в хорошо написанном проекте Unity редко встречается «основной» класс. Лучше всего, если вы разделите ответвления на отдельные компоненты, с минимально возможными зависимостями между ними (зависимость от UnityEngine - это нормально). Вместо «написания основного сценария» вы должны написать «InstantiatePlayerScript», и вполне возможно, что это почти сделано, и вы можете перейти к написанию другого сценария, который определит другое поведение. Вот почему их называют поведением. Инстанцирование игрока - это поведение, которое изменяет сцену, и оно должно жить на сцене как другие объекты, а не пытаться «сидеть на облаке» как божественный объект, контролируя все сверху и снизу. Хотя написать такую игру абсолютно возможно, этот путь становится все сложнее по мере роста сложности.
Есть некоторые части игры, которые можно сделать глобальными (например, MusicManager - есть только одна музыка, которую вы должны играть одновременно), но для таких вещей, как проигрыватель - что если однажды вы захотите сделать игровой мультиплеер? Хотя Singleton Pattern (он же где-то пишет основной класс) хорошо работает для многих вещей в Unity, его очень легко переусердствовать.