【问题标题】:How to move GameObjects using the world position in unity? [closed]如何使用统一的世界位置移动游戏对象? [关闭]
【发布时间】:2016-10-24 21:08:25
【问题描述】:

所以,我正在尝试弄清楚如何编写一个脚本,该脚本能够检测游戏对象何时处于某个世界位置,从而转换这些游戏对象并将它们向上移动 1。

希望这是有道理的,如果没有,请询​​问,我会尽力更详细地解释。真的很感激任何帮助。

【问题讨论】:

  • 这太宽泛了——通常希望您先尝试编写自己的代码,并且只有在遇到无法解决的问题时才在 Stack Overflow 上提出问题;这个网站并不意味着提供从头开始编写的代码。首先,请查看Transform.Translate() 并考虑使用触发对撞机(或Physics.OverlapSphere())来检测进入特定区域的物体。

标签: c# unity3d gameobject


【解决方案1】:
void updateGameObjectsMatchingPosition(float x, float y, float z)
{
    // Please try to use something more specific like GameObject.FindGameObjectWithTag("CoolTag");
    var gameObjects : GameObject[] = GameObject .FindObjectsOfType(GameObject) as GameObject[];

    for(var i = 0; i < gameObjects.length; i++) {
       var position = gameObjects[i].transform.position;
       if(position.x == x && position.y == y && position.z == z) {
           //Do something with the position of this object.
           gameObjects[i].transform.position = new Vector3(x + 1, y + 1, z + 1);
       }
    }
}

【讨论】:

  • 是的,这行得通,但除非您执行离散化世界,否则您可能应该检查该位置是否在您正在查看的位置的一小段距离内,而不是硬相等。
  • 另外,Kd-trees 可用于有效搜索您的对象。如果您有太多对象,您应该考虑这一点。
  • 同意code11和lucasdavid,仅用于测试目的,尝试使用性能更高的东西,只要求GameObjects太懒且太贵。
  • 基于 collider/physics 的方法是针对此处所需检测的最简单的 Unity 特定解决方案,但由于 OP 没有对他们的问题进行任何澄清编辑/cmets,因此不清楚是否(或任何现有答案)符合 OP 的要求。
【解决方案2】:

将此脚本附加到您的游戏对象。

[SerializedField] Vector3 _designatePosition;
IEnumerator MoveUp() {
    var speed = 5 * Time.deltaTime;
    var targetPosition = transform.position + new Vector3(0, 1, 0);
    while (Vector3.Distance(transform.position, targetPosition) > 0.01f) {
        transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed);
    }
}

void Update() {
    if (Vector3.Distance(transform.position, _designatePosition) < 0.01f) {
        StartCoroutine(MoveUp());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多