[英]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.