我正在做一个益智游戏,我有一个由多个网格碰撞器组成的球体作为插槽,玩家应该移动拼图块(也是网格碰撞器)与球体接触,在那里它们将粘在网格碰撞器的“插槽”上。然而,我的脚本行为很奇怪。它有时会粘在一起,有时会自己飘到游戏世界中。我该如何让它工作呢?
这是拼图块应该粘在的球体,以及其中一个拼图块:
球体由几个网格组成,每个网格都有自己的网格碰撞器。左边的不规则形状的物体是拼图中的一个。当玩家将它移向球体时,它会粘在它接触到的球体上的第一个网格碰撞器上。
这是我的剧本:
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;
}
}
3条答案
按热度按时间1wnzp6jl1#
如果它们漂浮到空间中,你可能想在碎片被“卡住”后尝试禁用对象的刚体。你可以设置它的约束,使它不能在任何方向移动或旋转。
vd8tlhqk2#
网格碰撞器从实际的网格中产生碰撞数据,所以基本上把两个网格合并成一个就能产生你需要的合适的碰撞器。
您可以使用内置的CombineMeshes方法来完成此操作,也可以手动完成此操作。
论坛中有一个旧脚本可以做到这一点-link。
如果你自己做的话,你需要把所有的顶点数据从一个网格移动到另一个网格,然后你需要从新的顶点数据生成新的三角形。此外,如果网格使用两个不同的纹理,你需要合并它们并重新Map其中一个的纹理坐标。
x3naxklr3#
首先,你创建一个空的GameObject,其中包含网格过滤器,网格碰撞器,网格渲染器,(如果你需要的话,可以使用刚体)。然后你需要把Unity提供的代码放在脚本的start方法中。
https://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html
但您在组合网格(combine)
transform.GetComponent<MeshCollider>().sharedMesh = transform.GetComponent<MeshFilter>().mesh;
之后添加在那之后你的组合网格也有碰撞器