【问题标题】:How would I go about getting a vector3 of a random position somewhere on top of another gameObject?我将如何在另一个游戏对象顶部的某个地方获得一个随机位置的 vector3?
【发布时间】:2019-08-25 23:22:19
【问题描述】:

所以我需要在另一个游戏对象上获得一个随机位置的 Vector3。此游戏对象将始终为矩形,但大小可能会有所不同(游戏中的其他对象也会有所不同,可能需要使用相同的功能)。

由于大小会有所不同,我不能依赖使用我事先输入的数字,需要编写一些代码来生成随机 Transform.Position 在游戏对象占用的空间内。

如果有人有任何建议,我将非常感激!

【问题讨论】:

  • 你怎么知道游戏对象的大小?是网格吗?
  • 是的,它有一个网格过滤器和网格渲染器
  • 该点应该在世界轴上还是局部轴上?
  • 世界轴为首选
  • 游戏对象是否总是直立的?

标签: unity3d


【解决方案1】:

您可以使用网格边界来限制随机生成器的范围。如果您想将点用于不是下面对象的子对象,您还需要将该点转换为世界空间。

using UnityEngine;

public class GetRandomPos : MonoBehaviour {
    private Mesh mesh;
    public float y_amount = 1;

    private void Awake()
    {
        mesh = GetComponent<MeshFilter>().mesh;
    }

    public Vector3 GetRandomPointAbove()
    {
        float minx = mesh.bounds.min.x;
        float minz = mesh.bounds.min.z;
        float maxx = mesh.bounds.max.x;
        float maxz = mesh.bounds.max.z;
        float x = Random.Range(minx, maxx);
        float y = y_amount;
        float z = Random.Range(minz, maxz);
        var localPos = new Vector3(x, y, z);
        return transform.TransformPoint(localPos);
    }
}

【讨论】:

  • 哇,这看起来正是我想要的!非常感谢!如果您不介意,您能否重新解释关于将点转换为世界空间的第二部分?我已经尝试过这段代码,它返回的位置与对象略有不同,这显然意味着我需要使用你所说的我只是不太明白你的意思
  • 以什么方式稍微关闭?转换到世界空间是因为你从网格边界生成的点在本地空间中,不包括父变换的偏移、缩放或旋转
  • 原来是因为我的一堆预制件没有设置为 0 哈哈!非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2017-09-07
  • 2015-04-18
  • 1970-01-01
相关资源
最近更新 更多