【问题标题】:Add GameObject on position of a mesh in Unity在 Unity 中的网格位置添加 GameObject
【发布时间】:2019-12-10 04:36:39
【问题描述】:

我正在使用大约 100 个网格的 FBX 3d 模型。我想选择其中一个网格并将游戏对象(立方体)放置在同一位置,以便稍后在代码中使用它来将相机聚焦在其上。立方体已添加但不在正确的位置 - 它不在视口之外而不是。不知道如何在 Unity 中确定网格的正确坐标。

Object prefab = Resources.Load("my_prefab"); // Assets/Resources/Prefabs/prefab1.FBX
var obj = (GameObject)Instantiate(prefab, new Vector3(370, 105, 100), Quaternion.identity);
obj.transform.localScale = new Vector3(150, 150, 150);

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.name = "my_cube";
cube.GetComponent<Renderer>().material.SetColor("_Color", Color.red);
cube.transform.localScale = new Vector3(100, 100, 100);
cube.transform.parent = obj.transform;

var meshFilter = FindMesh(obj.GetComponentsInChildren<MeshFilter>(), "head");

List<Vector3> vector3List = new List<Vector3>();

for (int i = 0; i < meshFilter.mesh.vertices.Length; ++i)
{
    vector3List.Add(obj.transform.TransformPoint(meshFilter.mesh.vertices[i]));
}

cube.transform.localPosition = vector3List[0];
Camera.main.transform.LookAt(obj.transform);

public MeshFilter FindMesh(MeshFilter[] mesh, string name)
{
    foreach (MeshFilter meshFilter in mesh)
    {
        if (meshFilter.name == name)
        {
            return meshFilter;
        }
    }
        return null;
}

知道我的代码有什么问题吗?我认为这与预制件的缩放比例有关。 谢谢你的帮助!!

编辑:

更新了 Anis Brachemi 建议的代码并实施了更改,但仍然无法正常工作。立方体现在是头部组件的子组件,但是当相机查看立方体时,头部在视口中不可见。

Object prefab = Resources.Load("ironman"); // Assets/Resources/Prefabs/prefab1.FBX
var obj = (GameObject)Instantiate(prefab, new Vector3(370, 105, 100), Quaternion.identity);
obj.transform.localScale = new Vector3(150, 150, 150);

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.name = "my_cube";
cube.GetComponent<Renderer>().material.SetColor("_Color", Color.red);
cube.transform.localScale = new Vector3(10, 10, 10);

var components = obj.GetComponentsInChildren<Component>();
foreach (Component c in components)
{
    if (c.name == "head")
    {
        cube.transform.parent = c.transform;
        break;
    }
}

cube.GetComponent<Collider>().isTrigger = true;
Camera.main.transform.LookAt(cube.transform);

这是我正在使用的 fbx:https://free3d.com/de/3d-model/iron-man-2-11174.html

我是 Unity 的新手。所以我不知道将相机聚焦到游戏对象的子组件的最佳方式。也许有更好的方法来做到这一点......

【问题讨论】:

  • 为什么你的 FBX 有 100 个独立的网格?

标签: c# unity3d


【解决方案1】:

题外评论,这段代码

List<Vector3> vector3List = new List<Vector3>();

for (int i = 0; i < meshFilter.mesh.vertices.Length; ++i)
{
    vector3List.Add(obj.transform.TransformPoint(meshFilter.mesh.vertices[i]));
}

cube.transform.localPosition = vector3List[0];

可以简化为

cube.transform.localPosition = obj.transform.TransformPoint(meshFilter.mesh.vertices[0]);

所以要回答您的问题,我不明白您为什么要使用 Vertices 而不是仅将立方体放在头部对象中,但无论如何,如果您的情况有必要,我建议您尝试将立方体大小降低一个很多,添加一行cube.GetComponent&lt;Collider&gt;().isTrigger = true; 以防止立方体对碰撞做出反应,最后将localPosition 更改为position

编辑

如果我可以补充一点,如果你只是想让相机跟随头部,如果你根本不创建立方体会更简单,只需让相机看着 Head 对象。在你的代码之外,声明一个变量Transform head;

if(head == null)
    var components = obj.GetComponentsInChildren<Component>();
    foreach (Component c in components)
    {
        if (c.name == "head")
        {
            head = c.transform;
            break;
        }
    }
}
Camera.main.transform.LookAt(head);

并删除立方体创建的所有不必要的代码。

【讨论】:

  • 感谢您的帮助!我使用顶点是因为我是 Unity 新手。因此,我已经实施了您的建议,将立方体放在头部对象中(请参阅我的帖子中的编辑说明)。不幸的是,它没有按预期工作
【解决方案2】:

我添加的游戏对象的位置是错误的。我将立方体的 localPosition 更改为头部的向量,它可以工作

        var head = GameObject.Find("head");
        var vertex = head.GetComponent<MeshFilter>().mesh.vertices[0];

        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.localScale = new Vector3(10, 10, 10);
        cube.transform.parent = GameObject.Find("my_parent").transform;
        cube.GetComponent<Collider>().isTrigger = true;
        cube.transform.localPosition = vertex;

        Camera.main.transform.LookAt(cube.transform);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多