Unity连接多个网格对撞机

时间:2014-02-12 21:14:42

标签: c# unity3d

我正在做一个益智游戏,我有一个由多个网格碰撞器组成的球体作为插槽,并且玩家应该将拼图块(也是网格碰撞器)移动到与球体接触的位置,在那里它们会粘在网格上他们碰撞的对撞机'槽'。但是,我的脚本表现得很奇怪。它有时会粘附,有时它会自动浮现在游戏世界中。我怎么能让它起作用?

这是拼图应该坚持的领域,以及其中一个拼图本身: Puzzle

球体由几个网格组成,每个网格都有自己的网格对撞机。左边的不规则形状的物体是其中一个拼图。当玩家将其移向球体时,它应该粘在它接触到的球体上的第一个网格对撞机上。

这是我的剧本:

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;
    }
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

网格对撞机从实际网格生成它的碰撞数据。因此,基本上将两个网格合并为一个网格会产生您需要的合适对撞机。

您可以使用内置CombineMeshes方法,这些方法可以正确执行,也可以手动执行。

论坛中有一个旧脚本可以做到这一点 - link

如果你自己动手,你必须将所有顶点数据从一个网格移动到另一个网格。比你需要从新的顶点数据生成新的三角形。此外,如果网格使用两种不同的纹理,您需要合并它们并重新映射其中一种纹理坐标。