Назначьте случайный текст врагам - PullRequest
0 голосов
/ 21 января 2019

screen shot

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

public class Enemy : MonoBehaviour {

public float fallSpeed = 1.0f;    

void Update () {
    transform.Translate(0, -fallSpeed * Time.deltaTime, 0);
    }
}

Вот слово spawner:

public class WordSpawner : MonoBehaviour {

public GameObject wordPrefab;
public GameObject enemy;
public Transform wordCanvas;

public WordDisplay SpawnWord()
{

    Vector3 randomPosition = new Vector3(UnityEngine.Random.Range(-2.0f, 2.0f), 7.0f, 0);
    GameObject wordObj = Instantiate(wordPrefab, randomPosition, Quaternion.identity, wordCanvas);
    WordDisplay wordDisplay = wordObj.GetComponent<WordDisplay>();
    return wordDisplay;
  }     
}

Это слово таймер:

public class Wordimer : MonoBehaviour {

public WordManager wordManager;
public float delay = 1.5f;
private float nextWord = 0f;

void Update()
{
    if (Time.time >= nextWord)
    {
        wordManager.AddWord();
        nextWord = Time.time + delay;
        delay *= 0.95f;
       }
    }
}

Метод AddWord ()в приведенном выше сценарии то, что генерирует слово случайным образом из списка слов.Вот метод добавления слова (этот метод находится в отдельном файле):

public void AddWord()
{
    WordDisplay wordDisplay = wordSpawner1.SpawnWord();

    Word word = new Word(WordGenerator.GetRandomWord(), wordDisplay);

    words.Add(word); 
}

Так что я хотел бы, чтобы слова появлялись вместе с объектами игры противника.Прямо сейчас они появляются самостоятельно.Как мне добиться этой функциональности?

Редактировать

Это сценарий, который порождает врага:

public GameObject enemy;
public float spawnTime = 3.0f;
public Transform[] spawnPoints;    

void Start () {
    InvokeRepeating("Spawn", spawnTime, spawnTime);
}

void Spawn()
{               
    int spawnPointIndex = Random.Range(0, spawnPoints.Length);        
    Instantiate(enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
}

1 Ответ

0 голосов
/ 21 января 2019

Если я правильно понимаю ваш вопрос, то, что вы пытаетесь достичь, - это создание WordDisplay и сохранение его «рядом» с соответствующим enemy объектом, ссылка на который у вас уже есть в WordSpawner.

Вы можете присвоить его определенному Enemy и позволить противнику обновить позицию, например

public class Enemy : MonoBehaviour 
{
    public float fallSpeed = 1.0f;    

    public WordDisplay assosiatedDisplay;

    // optional for always showing the text e.g. 10 cm above enemies
    public Vector3 offset = new Vector3(0, 0.1f, 0);

    void Update () 
    {
        transform.Translate(0, -fallSpeed * Time.deltaTime, 0);

        if(assosiatedDisplay)
        {
            // keep the referenced wordDisplay positioned relative to this object
            assosiatedDisplay.transform.position = transform.position + offset;
        }
    }
}

И затем установить это значение associatedDisplay при появлении WordDisplay

public class WordSpawner : MonoBehaviour 
{
    public GameObject wordPrefab;
    public GameObject enemy;
    public Transform wordCanvas;

    public WordDisplay SpawnWord()
    {
        GameObject wordObj = Instantiate(wordPrefab, enemy.transform.position * new Vector3(1, 1, 0), Quaternion.identity, wordCanvas);
        WordDisplay wordDisplay = wordObj.GetComponent<WordDisplay>();

        // assign it to the enemy
        enemy.GetComponent<Enemy>().assosiatedDisplay = wordDisplay;

        return wordDisplay;
   }     
}

Обновление

Я не вижу в вашем вопросе и понятия не имею, где вызываются все ваши методы.Но вы должны хранить соответствующую ссылку enemy таким же образом, когда создаете экземпляры своих вражеских объектов:

var enemy = Instantiate(enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);

и позже передать эту enemy ссылку на public WordDisplay SpawnWord() например

public WordDisplay SpawnWord(Enemy enemy)
{
    // ...

    // assign it to the enemy
    enemy.assosiatedDisplay = wordDisplay;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...