簡體   English   中英

在 Unity 中的網格位置添加游戲對象

[英]Add GameObject on position of a mesh in Unity

我正在使用大約 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 的新手。 所以我不知道將相機聚焦到游戲對象的子組件的最佳方法。 也許有更好的方法來做到這一點......

題外評論,這段代碼

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 而不是將立方體放在 head 對象中,但無論如何,如果您的情況有必要,我建議您嘗試將立方體大小降低很多,添加一條線cube.GetComponent<Collider>().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);

並刪除所有不必要的多維數據集創建代碼。

我添加的 GameObject 的位置是錯誤的。 我將立方體的 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM