【问题标题】:Parent Transform changes each time I instantiate a new child每次实例化一个新孩子时,父变换都会发生变化
【发布时间】:2017-06-18 00:30:35
【问题描述】:

我有一个父游戏对象ZombieArmy,并附有脚本Zombie;每次将新的僵尸实例化为孩子时,它的 Transform 都会发生变化。如何防止zombieArmy变换发生变化并将其变换固定在Vector3(0,0,0),同时让僵尸从每个reSpawn()都有自己独特的变换?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Zombie : MonoBehaviour {

    public GameObject zombiePrefab;
    public Transform zombieArmy;
    public Transform zombieSpawnPoint;
    private Transform[] spawnPositions;
    public bool reSpawn = false;
    private bool lastToggle = false;
    private GameObject spawn;

    // Use this for initialization
    void Start () {
        spawnPositions = zombieSpawnPoint.GetComponentsInChildren<Transform>();
    }

    private void NewSpawn()   //spawn location of newZombie
    {
        if (reSpawn)
        {
            int i = Random.Range(1, spawnPositions.Length);
            transform.position = spawnPositions[i].transform.position;
            spawn = Instantiate(zombiePrefab, this.transform.position, this.transform.rotation, zombieArmy);
           // zombieArmy.transform.position = new Vector3(0, 0, 0);
        }
    }


    void Update () { //T-toggle
        if (reSpawn != lastToggle)
        {
            NewSpawn();
            reSpawn = false;
        }
        else
            lastToggle = reSpawn;
    }
}

【问题讨论】:

  • 来自您的代码 Transform zombieArmy 仅用于 Instantiate() 并且保证不会更改 Transform zombieArmy。这意味着Transform zombieArmy 已在此代码之外的其他地方更改,您应该查找或提供其他相关类来解决此问题
  • 我还阅读了您之前的帖子,看来您在基本设置方面遇到了问题。我建议您去查看 Unity 的教程以了解 Unity 中的一些最佳实践。如果您查找更多有关设计类及其角色的信息,这也会有所帮助。诸如“僵尸需要知道刷怪箱的位置吗?”之类的问题。是在编写代码之前应该考虑的问题。 Google SOLID 原则和其他著名的 OOP 设计概念,因为它们将帮助您开发出色的游戏。
  • 这段代码看起来不错。其他地方一定有问题。找出其他地方可以访问僵尸军队的变换。
  • 谢谢大家!从您的 cmets 意识到这不是编码错误后,zombieArmy 仅在此脚本中被调用。我将zombieArmy GameObject 放入另一个GameObject 并将该GameObject 设为Parent,它成功了! :D

标签: c# unity3d transform instantiation


【解决方案1】:

如果我的理解正确的话,Zombie 脚本是附加到父游戏对象的,对吗? 那么你的 NewSpawn() 方法有点不正确..这一行

    transform.position = spawnPositions[i].transform.position;

正如你所说,实际上是在改变父游戏对象的变换,因为这正是你告诉它要做的事情。 如果您想要将每个新生成的对象放置在随机选择的生成点的位置,请尝试以下操作:

    int i = Random.Range(0, spawnPositions.Length);    // Any reason the 0th index shouldn't be used?

    spawn = Instantiate(zombiePrefab, this.transform);
    spawn.transform.position = spawnPositions[i].transform.position;
    spawn.transform.rotation = spawnPositions[i].transform.rotation;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多