unity3d Unity连接多个网格碰撞器

hec6srdp  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(246)

我正在做一个益智游戏,我有一个由多个网格碰撞器组成的球体作为插槽,玩家应该移动拼图块(也是网格碰撞器)与球体接触,在那里它们将粘在网格碰撞器的“插槽”上。然而,我的脚本行为很奇怪。它有时会粘在一起,有时会自己飘到游戏世界中。我该如何让它工作呢?
这是拼图块应该粘在的球体,以及其中一个拼图块:

球体由几个网格组成,每个网格都有自己的网格碰撞器。左边的不规则形状的物体是拼图中的一个。当玩家将它移向球体时,它会粘在它接触到的球体上的第一个网格碰撞器上。
这是我的剧本:

using UnityEngine;
using System.Collections;

public class StickyObject : MonoBehaviour {

    DragToMove1 otherScript;
    GameObject mainObj, jigsphere;
    bool stuck;
    public LayerMask layerMask;
    // Use this for initialization
    void Start () 
    {
        otherScript = this.GetComponent<DragToMove1>();
        mainObj = GameObject.Find("GameObject");
        stuck = false;
    }

    // Update is called once per frame
    void Update () 
    {
        if (stuck) 
        {
        }

    }

    void OnCollisionEnter(Collision c) 
    {
        if (!stuck) 
        {

            //By contact point
            ContactPoint touched = c.contacts[0];
            Debug.Log ("Collision with " + this.name);

            touched.otherCollider.gameObject.transform.parent = this.transform;

            Debug.Log ("Parented to " + touched.otherCollider);

            stuck = true;

            if (otherScript != null) 
            {
                otherScript.Stuck();
                otherScript.selected = false;
            }

            mainObj.SendMessage ("Wake");
        }
    }

    bool getStuck()
    {
        return stuck;
    }
}
1wnzp6jl

1wnzp6jl1#

如果它们漂浮到空间中,你可能想在碎片被“卡住”后尝试禁用对象的刚体。你可以设置它的约束,使它不能在任何方向移动或旋转。

vd8tlhqk

vd8tlhqk2#

网格碰撞器从实际的网格中产生碰撞数据,所以基本上把两个网格合并成一个就能产生你需要的合适的碰撞器。
您可以使用内置的CombineMeshes方法来完成此操作,也可以手动完成此操作。
论坛中有一个旧脚本可以做到这一点-link
如果你自己做的话,你需要把所有的顶点数据从一个网格移动到另一个网格,然后你需要从新的顶点数据生成新的三角形。此外,如果网格使用两个不同的纹理,你需要合并它们并重新Map其中一个的纹理坐标。

x3naxklr

x3naxklr3#

首先,你创建一个空的GameObject,其中包含网格过滤器,网格碰撞器,网格渲染器,(如果你需要的话,可以使用刚体)。然后你需要把Unity提供的代码放在脚本的start方法中。
https://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];

        int i = 0;
        while (i < meshFilters.Length)
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);

            i++;
        }
        transform.GetComponent<MeshFilter>().mesh = new Mesh();
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
        transform.gameObject.SetActive(true);
    }
}

但您在组合网格(combine)transform.GetComponent<MeshCollider>().sharedMesh = transform.GetComponent<MeshFilter>().mesh;之后添加
在那之后你的组合网格也有碰撞器

相关问题