【问题标题】:Moving object to position of another object on button press按下按钮时将对象移动到另一个对象的位置
【发布时间】:2019-06-04 09:21:07
【问题描述】:

我正在尝试制作一个随机生成系统,随机化有效,但是对象永远不会移动到该位置。我已经把它分解成现在只有一个物体在按下空间时移动到生成点。但是,对象没有移动,我不确定接下来要尝试什么。

 public Transform spawn1;
public Transform spawn2;
public Transform spawn3;

public Transform obj1;
public Transform obj2;
public Transform obj3;

private Transform[] spawns = new Transform[3];
private Transform[] objects = new Transform[3];

private bool[] spawnUsed = new bool[3];
private bool[] objectUsed = new bool[3];

private int randomRun = 0;

void Start()
{ 

    spawns[0] = spawn1;
    spawns[1] = spawn2;
    spawns[2] = spawn3;

    objects[0] = obj1;
    objects[1] = obj2;
    objects[2] = obj3;
}

void Update()
{
    if (Input.GetKeyDown("space"))
    {
        // RandomChoice();

       // int ran = Random.Range(0, 2);

        obj1.transform.position = spawn1.transform.position;

        Debug.Log("Moved");
    }
}

我已经尝试过将对象和生成作为变换和游戏对象,但没有任何区别。当按下空格时,调试“已移动”确实显示在 lof 中,但没有其他反应。

【问题讨论】:

  • 您是否可能不小心为objspawn 引用了相同的游戏对象?
  • 不,我已经检查过了,它们被分配给了正确的。
  • 你确定你在为 obj1 和 spawn1 使用场景游戏对象吗?如果您引用预制件而不是场景对象,您发送的代码将不起作用。
  • 任何机会 obj1 上都有一个 navmesh 代理
  • @JackMariani 目前它们只是统一的形状,所以立方体、球体等

标签: c# unity3d 3d transform


【解决方案1】:

您的一个参考是指向预制件而不是场景对象。

首先你需要检查哪个是预制件,你可以通过检查它的scene.rootCount == 0来做到这一点。

然后你要么实例化它,要么从场景中选择它。

如果您计划实例化,您可以应用此代码:

void Update()
{
    if (Input.GetKeyDown("space"))
    {
        // int ran = Random.Range(0, 2);
        Debug.Log("Is obj1 a prefab" + (obj1.gameObject.scene.rootCount == 0));
        Debug.Log("Is spawn1 a prefab" + (spawn1.gameObject.scene.rootCount == 0));

        // --------------- Check the object --------------- //
        Transform yourObject;
        if (obj1.gameObject.scene.rootCount == 0) yourObject = Instantiate(obj1);
        else yourObject = obj1;

        // --------------- Check the spawn --------------- //
        Transform spawn;
        if (spawn1.gameObject.scene.rootCount == 0) spawn = Instantiate(spawn1);
        else spawn                                        = spawn1;

        yourObject.position = spawn.position;

        Debug.Log("Moved");
    }
}

当您找到哪个是预制件后,您可能会决定直接从场景中引用它(从场景层次结构中拖动一个对象,而不是从项目窗口中拖动它)。

否则你可以实例化它(这也许正是你想要做的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多