Exemplo n.º 1
0
    public void BuildCollision()
    {
        if (this == null)
        {
            path.OnPathChanged -= Path_OnPathChanged;
        }

        if (path != null)
        {
            Transform capsuleRoot = transform.Find("CapsuleRoot");
            if (capsuleRoot != null)
            {
                if (Application.IsPlaying(this))
                {
                    Destroy(capsuleRoot.gameObject);
                }
                else
                {
                    DestroyImmediate(capsuleRoot.gameObject);
                }
            }

            if (useCapsules)
            {
                MeshCollider mc = GetComponent <MeshCollider>();
                if (mc != null)
                {
                    if (Application.IsPlaying(this))
                    {
                        Destroy(mc);
                    }
                    else
                    {
                        DestroyImmediate(mc);
                    }
                }

                capsuleRoot = new GameObject("CapsuleRoot").transform;
                capsuleRoot.SetParent(transform);
                capsuleRoot.ResetLocals();

                colliders.Clear();

                int numCapsules = Mathf.CeilToInt(path.GetLength() * capsulesPerUnit);
                for (int i = 1; i <= numCapsules; i++)
                {
                    float prevAlpha = (i - 1) / (float)numCapsules;
                    float alpha     = i / (float)numCapsules;

                    Vector3 prevPos = path.GetPoint(prevAlpha);
                    Vector3 pos     = path.GetPoint(alpha);

                    GameObject capsuleGo = new GameObject("CapsuleCollider", typeof(CapsuleCollider));

                    CapsuleCollider capsule = capsuleGo.GetComponent <CapsuleCollider>();
                    capsule.transform.SetParent(capsuleRoot);
                    capsule.transform.position = (prevPos + pos) / 2f;

                    Vector3 lookDir = pos - prevPos;
                    if (lookDir != Vector3.zero)
                    {
                        capsule.transform.forward = lookDir.normalized;
                    }

                    capsule.direction = 2;                     // Z

                    float prevThickness = thicknessCurve.Evaluate(prevAlpha);
                    float thickness     = thicknessCurve.Evaluate(alpha);

                    capsule.radius           = path.Radius * (prevThickness + thickness) / 2f;
                    capsule.height           = (pos - prevPos).magnitude + capsule.radius;
                    capsule.isTrigger        = false;
                    capsule.gameObject.layer = colliderLayer.layer;

                    colliders.Add(capsule);
                }

                RefreshActiveColliders();
            }
            else
            {
                MeshFilter mf = GetComponent <MeshFilter>();
                if (mf == null)
                {
                    mf = path.GetComponent <MeshFilter>();
                }

                if (mf != null)
                {
                    MeshCollider mc = mf.gameObject.GetComponent <MeshCollider>();
                    if (mc == null)
                    {
                        mc = mf.gameObject.AddComponent <MeshCollider>();
                    }

                    mc.sharedMesh = mf.sharedMesh;
                }
            }

#if UNITY_EDITOR
            EditorUtility.SetDirty(this);
#endif
            OnCollisionChanged(this);
        }
    }