Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Unity中的网格位置添加游戏对象_C#_Unity3d - Fatal编程技术网

C# 在Unity中的网格位置添加游戏对象

C# 在Unity中的网格位置添加游戏对象,c#,unity3d,C#,Unity3d,我使用的是一个FBX 3d模型,大约有100个网格。我想选择其中一个网格,并将游戏对象(立方体)放置在同一位置,以便稍后在代码中使用它来将相机聚焦在其上。立方体已添加,但位置不正确-它在视口外,而不是在视口中。不知道如何确定网格的正确坐标 Object prefab = Resources.Load("my_prefab"); // Assets/Resources/Prefabs/prefab1.FBX var obj = (GameObject)Instantiate(prefab, new

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

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;
}
objectprefab=Resources.Load(“我的预设”);//资产/资源/预制件/预制件1.FBX
var obj=(游戏对象)实例化(预置,新向量3(370105100),四元数.identity);
obj.transform.localScale=新矢量3(150150150);
GameObject cube=GameObject.CreatePrimitive(PrimitiveType.cube);
cube.name=“my_cube”;
cube.GetComponent().material.SetColor(“\u Color”,Color.red);
cube.transform.localScale=新矢量3(100100100);
cube.transform.parent=obj.transform;
var meshFilter=FindMesh(obj.GetComponentsInChildren(),“head”);
列表向量3list=新列表();
对于(int i=0;i
知道我的代码有什么问题吗?我认为这与预制件的缩放有关。 谢谢你的帮助

编辑:

更新了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);
objectprefab=Resources.Load(“铁人”);//资产/资源/预制件/预制件1.FBX
var obj=(游戏对象)实例化(预置,新向量3(370105100),四元数.identity);
obj.transform.localScale=新矢量3(150150150);
GameObject cube=GameObject.CreatePrimitive(PrimitiveType.cube);
cube.name=“my_cube”;
cube.GetComponent().material.SetColor(“\u Color”,Color.red);
cube.transform.localScale=新向量3(10,10,10);
var components=obj.GetComponentsInChildren();
foreach(组件中的组件c)
{
如果(c.name==“head”)
{
cube.transform.parent=c.transform;
打破
}
}
cube.GetComponent().isTrigger=true;
Camera.main.transform.LookAt(cube.transform);
这是我正在使用的fbx:


我是新来的。因此,我不知道最好的方法是将相机聚焦到游戏对象的子组件上。也许有更好的方法来做这件事…

无疑问的评论,这段代码

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.GetComponent().isTrigger=true
以防止多维数据集对碰撞作出反应,并最终将
localPosition
更改为
position

编辑

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

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);
if(head==null)
var components=obj.GetComponentsInChildren();
foreach(组件中的组件c)
{
如果(c.name==“head”)
{
头=c.变换;
打破
}
}
}
摄影机。主。变换。注视(头部);

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

我添加的游戏对象位置错误。我将立方体的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);
var head=GameObject.Find(“head”);
var vertex=head.GetComponent().mesh.vertex[0];
GameObject cube=GameObject.CreatePrimitive(PrimitiveType.cube);
cube.transform.localScale=新向量3(10,10,10);
cube.transform.parent=GameObject.Find(“我的父项”).transform;
cube.GetComponent().isTrigger=true;
cube.transform.localPosition=顶点;
Camera.main.transform.LookAt(cube.transform);

为什么您有一个具有100个单独网格的FBX?谢谢您的帮助!我使用顶点是因为我是Unity的新手。因此,我已经实现了您的建议,将多维数据集放在head对象中(请参阅我帖子中的编辑说明)。不幸的是,它没有按预期工作
        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);