Как стрелять частицами, как снаряд?
Я сделал танк, который стреляет сферическими шариками по щелчку мыши.
мой C# скрипт:
GameObject prefab;
// Use this for initialization
void Start () {
prefab = Resources.Load("projectile") as GameObject;
}
// Update is called once per frame
void Update() {
if (Input.GetMouseButtonDown(0))
{
GameObject projectile = Instantiate(prefab) as GameObject;
projectile.transform.position = transform.position + Camera.main.transform.forward * 2;
Rigidbody rb = projectile.GetComponent<Rigidbody>();
rb.velocity = Camera.main.transform.forward * 40;
}
}
В этом сценарии я снимаю сетку с именем projectile
, Но я хочу стрелять из частиц, а не из сетки. Я уже пытался изменить particle
в Orbparticle
по сценарию, но объект не был создан. Что я делаю не так?
1 ответ
Ни один объект не был создан, потому что у вас, вероятно, нет ресурса с именем Orbparticle
, Проверьте, есть ли у вас ошибки при запуске скрипта. Если Resources.Load не найдет нужный объект по указанному вами пути, он выдаст null
что, вероятно, почему ни один объект не порождается.
Если вы хотите снимать частицу вместо сетки, то вам нужно установить prefab
к GameObject, который вы подготовили заранее, у вас есть ParticleSystem, которую вы хотите. Я бы посоветовал не использовать Resources.Load для этого.
1. Использование ресурсов. Загрузка.
Измените свой код так, чтобы он предупреждал вас, если не найдет ресурс:
GameObject prefab;
// Use this for initialization
void Start () {
string name = "OrbParticle";
prefab = Resources.Load<GameObject>(name);
if (prefab == null) {
Debug.Error("Resource with name " + name + " could not be found!");
}
}
// Update is called once per frame
void Update() {
if (Input.GetMouseButtonDown(0))
{
GameObject projectile = Instantiate(prefab) as GameObject;
projectile.transform.position = transform.position + Camera.main.transform.forward * 2;
Rigidbody rb = projectile.GetComponent<Rigidbody>();
rb.velocity = Camera.main.transform.forward * 40;
}
}
Теперь, чтобы это работало, вам нужен префаб под названием "OrbParticle" или любая строка, в которую вы устанавливаете переменную name
к. Resources.Load ищет элементы в таких путях, как Assets/Resources
, Таким образом, вы ДОЛЖНЫ иметь свой префаб "OrbParticle", расположенный в этой папке ресурсов. Если у вас нет конкретной причины для использования Resources.Load, я настоятельно рекомендую вам перейти к решению 2.
2. Отключение ресурсов. Загрузите и используйте префаб напрямую.
Измените свой код на это:
public GameObject prefab;
// Update is called once per frame
void Update() {
if (Input.GetMouseButtonDown(0))
{
GameObject projectile = Instantiate(prefab) as GameObject;
projectile.transform.position = transform.position + Camera.main.transform.forward * 2;
Rigidbody rb = projectile.GetComponent<Rigidbody>();
rb.velocity = Camera.main.transform.forward * 40;
}
}
Затем сделайте это:
- Создайте новый пустой GameObject.
- Присоедините ParticleSystem к GameObject.
- Сделайте новый сборный актив.
- Перетащите только что созданный GameObject в актив Prefab.
- Перетащите сборник в
prefab
поле в вашем монобахе (объект, выполняющий съемку. Он будет иметь заранее подготовленное поле в Инспекторе. Поэтому мы устанавливаемprefab
быть публичным полем).
Если у вас продолжают возникать проблемы, загляните в Иерархию Unity и посмотрите, не создается ли вообще какой-либо объект. Может случиться так, что он создает экземпляр GameObject, но GameObject по какой-то причине невидим или не создается в ожидаемом вами месте.