Стрельба лазером непрерывно в Unity - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать игру с падающими словами, как z-type.После запуска игры на экране отображается несколько слов.Когда пользователь вводит букву и совпадает с первой буквой любого из отображаемых слов, к слову добавляется тег activeWord.Я также создал лазерный скрипт, который проверяет, активен ли тег, и когда это происходит, он стреляет лазером.

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

Это лазерный скрипт:

using UnityEngine;
using UnityEngine.UI;

public class Laser : MonoBehaviour {
    public float speed = 10.0f;  
    private Vector3 laserTarget;

    private void Update () {
        GameObject activeWord = GameObject.FindGameObjectWithTag("activeWord");

        if (activeWord && activeWord.GetComponent<Text>().text.Length > 0) {
            laserTarget = activeWord.transform.position; // find position of word
            transform.Translate(laserTarget * speed * Time.deltaTime); // shoot the laser
        } 
    }
}

Я также добавляю код, который я использую в поле дисплея / пользовательского интерфейса.

public void RemoveLetter() {
/* remove the first letter if its correct and so 
on for the remaining letters. change the color of the word to red and add 
the "activeddWord" tag.*/
    text.text = text.text.Remove(0, 1);    
    text.color = Color.red;
    text.gameObject.tag = "activeWord";        
}

public void RemoveWord() { // destroy the word once all the letters match 
    Destroy(gameObject);
}

Может кто-нибудь пожалуйставзгляните на код и скажите, где я ошибаюсь.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вот один из способов сделать это, используя Instantiate() и префабы.Преимущество этого метода в том, что он масштабируемый.Вы можете создать несколько лазеров с минимальной настройкой.Обратите внимание, что для использования нескольких лазеров вам придется удалить WaitForThisLaserDestroyed;.

Чтобы это сработало, вам нужно начать с превращения вашего лазерного игрового объекта в префаб и добавления в него скрипта:

https://docs.unity3d.com/Manual/Prefabs.html

public class Laser : MonoBehaviour 
{
    public float speed = 10.0f;  
    public Vector3 laserTarget;
    public float destroyLaserAfterTime = 3f;

    private void Update () 
    {    
         transform.Translate(laserTarget * speed * Time.deltaTime);  
    }               
}

Изатем на некотором произвольном другом объекте.Например, пустой игровой объект в той же сцене:

public class LaserInitializer : MonoBehaviour 
{
    public GameObject laserPrefab;
    public GameObject laserOrigin;
    private GameObject WaitForThisLaserDestroyed;

    private void Update () 
    {    
         GameObject activeWord = GameObject.FindGameObjectWithTag("activeWord");            
         if (WaitForThisLaserDestroyed == null && activeWord && activeWord.GetComponent<Text>().text.Length > 0)
         {        
             CreateLaser(activeWord);
         }     
    }        

    private void CreateLaser(GameObject activeWord)
    {
         GameObject activeLaser = Instantiate(laserPrefab, laserOrigin.Transform.Position, Quaternion.identity) as GameObject;
         Laser laserScript = activeLaser.GetComponent<Laser>();
         laserScript.laserTarget = activeWord.transform.position;
         WaitForLaserDestroyed = activeLaser;
         Destroy(activeLaser, destroyLaserAfterTime);
    }
}

Чтобы объяснить код:

В префабе Laser есть собственный скрипт для перемещения к слову,и как только он существует и ему передана цель, он будет двигаться к активному слову.

Где-то еще в сцене у вас есть игровой объект, который существует для хранения второго сценария.Давайте назовем это «контроллером игрового объекта».Он проверяет, являются ли слова «активными» в соответствии с более ранним дизайном.Когда слово активно, этот сценарий создает ровно один лазер и говорит ему, чтобы он был нацелен на активное слово.

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

0 голосов
/ 08 июня 2018

Я думаю, вам нужно сбросить положение вашего лазера, если он достигнет цели:

public float speed = 10.0f;  
private Vector3 laserTarget;
private Vector3 laserOrigin;

private void Start () {
    // save laser's origin position
    laserOrigin = transform.position;
}


private void Update () { 
    GameObject activeWord = GameObject.FindGameObjectWithTag("activeWord");

    if (activeWord && activeWord.GetComponent<Text>().text.Length > 0)
    {        
        laserTarget = activeWord.transform.position; // find position of word
        transform.Translate(laserTarget * speed * Time.deltaTime); // shoot the laser

        float distance = Vector3.Distance(laserTarget , transform.position);
        if(distance < 0.05f){ // I don't know your scaling, perhaps change the limit here!
            transform.position = laserOrigin;
        }
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...