Вот один из способов сделать это, используя 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 есть собственный скрипт для перемещения к слову,и как только он существует и ему передана цель, он будет двигаться к активному слову.
Где-то еще в сцене у вас есть игровой объект, который существует для хранения второго сценария.Давайте назовем это «контроллером игрового объекта».Он проверяет, являются ли слова «активными» в соответствии с более ранним дизайном.Когда слово активно, этот сценарий создает ровно один лазер и говорит ему, чтобы он был нацелен на активное слово.
У вас есть другой игровой объект (это может быть тот же объект, что и у игрового объекта контроллера), который отмечает источниклазер.Вы можете сделать это другими способами, но я подумал, что использование игрового объекта для обозначения начальной точки будет простым способом для начинающих.