Как стрелять частицами, как снаряд? - PullRequest
0 голосов
/ 30 августа 2018

Я сделал танк, который стреляет сферическими шариками по щелчку мыши.

мой 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 Ответ

0 голосов
/ 30 августа 2018

Ни один объект не был создан, потому что у вас, вероятно, нет ресурса с именем Orbparticle. Проверьте, есть ли у вас ошибки при запуске вашего скрипта. Если Resources.Load не найдет нужный объект по указанному вами пути, он выдаст null, что, вероятно, объясняет, почему ни один объект не создается.

Если вы хотите стрелять в частицу вместо меша, вам нужно установить prefab для GameObject, который вы подготовили заранее, с необходимой вам ParticleSystem. Я бы рекомендовал не использовать Resources.Load для этого.

1. Использование Resources.Load.

Измените свой код на этот, чтобы он предупреждал вас, если не находит ресурс:

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;
    }   
}

Тогда сделайте это:

  1. Создайте новый пустой GameObject.
  2. Подключите ParticleSystem к GameObject.
  3. Создайте новый сборный актив.
  4. Перетащите только что созданный GameObject в актив Prefab.
  5. Перетащите префаб в поле prefab в Monobehaviour (объект, выполняющий съемку. Он будет иметь заранее подготовленное поле в Инспекторе. Вот почему мы устанавливаем prefab в качестве открытого поля).

Если у вас продолжают возникать проблемы, загляните в Иерархию Unity, чтобы увидеть, создается ли вообще никакой объект. Возможно, это тот случай, когда он создает экземпляр GameObject, но GameObject по какой-то причине невидим или не создается в ожидаемом вами месте.

...