Esempio n. 1
0
        public override void OnInspectorGUI()
        {
            if (newThang)
            {
                newThang = false;
            }
            Physix PHYSIX = (Physix)target;

            if (PHYSIX.Collisions == null)
            {
                PHYSIX.Collisions = new Physix.PHYSIXCOLLISION[0];
            }
            if (PHYSIX.Movements == null)
            {
                PHYSIX.Movements = new Physix.PHYSIXMOVE[0];
            }

            if (!PHYSIX.UseDefualtInspector)
            {
                GUILayout.BeginHorizontal();
                EditorGUILayout.HelpBox("Collision", MessageType.None);
                PHYSIX.HideCollision = GUILayout.Toggle(PHYSIX.HideCollision, "Hide", "Button", GUILayout.MaxWidth(50));
                GUILayout.EndHorizontal();
                bool deleteOrDuplicate = false;
                if (!PHYSIX.HideCollision)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Space(25);
                    GUILayout.BeginVertical();

                    //DisplayCollisions
                    for (int i = 0; i < PHYSIX.Collisions.Length; i++)
                    {
                        GUILayout.BeginHorizontal();
                        PHYSIX.Collisions[i].Display = GUILayout.Toggle(PHYSIX.Collisions[i].Display, PHYSIX.Collisions[i].Name, "Button");
                        if (GUILayout.Button("■|■", GUILayout.MaxWidth(35)))
                        {
                            deleteCollision = -1; duplicateCollision = i; PHYSIX.Collisions[i].Display = false;
                        }
                        if (GUILayout.Button("X", GUILayout.MaxWidth(25)))
                        {
                            deleteCollision = i; duplicateCollision = -1; PHYSIX.Collisions[i].Display = false;
                        }
                        GUILayout.EndHorizontal();
                        if (deleteCollision == i || duplicateCollision == i)
                        {
                            bool WC = (deleteCollision == i);
                            GUILayout.BeginHorizontal();
                            if (GUILayout.Button("yes", GUILayout.MaxWidth(50)))
                            {
                                if (WC)
                                {
                                    RemoveAt(ref PHYSIX.Collisions, deleteCollision);
                                }
                                if (!WC)
                                {
                                    DuplicateAtC(ref PHYSIX.Collisions, duplicateCollision);
                                }
                                deleteCollision = -1; duplicateCollision = -1; deleteOrDuplicate = true;
                            }
                            if (!deleteOrDuplicate)
                            {
                                EditorGUILayout.HelpBox("" + (WC ? "Delete" :  "Duplicate") + " " + PHYSIX.Collisions[i].Name + "?", MessageType.None);
                            }
                            if (GUILayout.Button("no", GUILayout.MaxWidth(50)))
                            {
                                deleteCollision = -1; duplicateCollision = -1;
                            }
                            GUILayout.EndHorizontal();
                        }
                        if (deleteOrDuplicate)
                        {
                            break;
                        }
                        if (PHYSIX.Collisions[i].Display)
                        {
                            GUILayout.BeginHorizontal();
                            GUILayout.Space(25);
                            GUILayout.BeginVertical();
                            PHYSIX.Collisions[i].Name = EditorGUILayout.DelayedTextField("Name: ", PHYSIX.Collisions[i].Name);
                            EditorGUILayout.HelpBox("Ranges", MessageType.None);
                            GUILayout.BeginHorizontal();
                            GUILayout.Space(25);
                            GUILayout.BeginVertical();
                            for (int ii = 0; ii < PHYSIX.Collisions[i].Ranges.Length; ii++)
                            {
                                if (ii > 0)
                                {
                                    EditorGUILayout.HelpBox("-and-", MessageType.None);
                                }
                                GUILayout.BeginHorizontal();
                                //EditorGUILayout.LabelField("Range #"+(i+1), GUILayout.MaxWidth(75));
                                EditorGUILayout.HelpBox("Axis", MessageType.None, true);
                                CollisionXYZEnum tempCollision = CollisionXYZEnum.X;
                                if (PHYSIX.Collisions[i].Ranges[ii].x)
                                {
                                    tempCollision = CollisionXYZEnum.X;
                                }
                                if (PHYSIX.Collisions[i].Ranges[ii].y)
                                {
                                    tempCollision = CollisionXYZEnum.Y;
                                }
                                if (PHYSIX.Collisions[i].Ranges[ii].z)
                                {
                                    tempCollision = CollisionXYZEnum.Z;
                                }
                                tempCollision = (CollisionXYZEnum)EditorGUILayout.EnumPopup(tempCollision);
                                PHYSIX.Collisions[i].Ranges[ii].x = (tempCollision == CollisionXYZEnum.X);
                                PHYSIX.Collisions[i].Ranges[ii].y = (tempCollision == CollisionXYZEnum.Y);
                                PHYSIX.Collisions[i].Ranges[ii].z = (tempCollision == CollisionXYZEnum.Z);
                                EditorGUILayout.HelpBox("is", MessageType.None, true);
                                CollisionLogicEnum tempCollisionLogic;
                                tempCollisionLogic = (PHYSIX.Collisions[i].Ranges[ii].less ? CollisionLogicEnum.Less : 0) |
                                                     (PHYSIX.Collisions[i].Ranges[ii].greater ? CollisionLogicEnum.Greater : 0) |
                                                     (PHYSIX.Collisions[i].Ranges[ii].equals ? CollisionLogicEnum.Equal : 0);
                                if (PHYSIX.Collisions[i].Ranges[ii].less && PHYSIX.Collisions[i].Ranges[ii].greater && PHYSIX.Collisions[i].Ranges[ii].equals)
                                {
                                    tempCollisionLogic = CollisionLogicEnum.Everything;
                                }
                                tempCollisionLogic = (CollisionLogicEnum)EditorGUILayout.EnumFlagsField(tempCollisionLogic);
                                PHYSIX.Collisions[i].Ranges[ii].less    = ((tempCollisionLogic & CollisionLogicEnum.Less) != 0);
                                PHYSIX.Collisions[i].Ranges[ii].greater = ((tempCollisionLogic & CollisionLogicEnum.Greater) != 0);
                                PHYSIX.Collisions[i].Ranges[ii].equals  = ((tempCollisionLogic & CollisionLogicEnum.Equal) != 0);
                                EditorGUILayout.HelpBox((PHYSIX.Collisions[i].Ranges[ii].equals ? "to" : "than"), MessageType.None, true);
                                PHYSIX.Collisions[i].Ranges[ii].value = Mathf.Clamp(EditorGUILayout.DelayedFloatField(PHYSIX.Collisions[i].Ranges[ii].value), -90, 90);
                                if (GUILayout.Button("X", GUILayout.MaxWidth(25)))
                                {
                                    RemoveAt(ref PHYSIX.Collisions[i].Ranges, ii); ii--;
                                }
                                GUILayout.EndHorizontal();
                            }
                            if (GUILayout.Button("+", GUILayout.MaxWidth(25)))
                            {
                                ResizeArray(ref PHYSIX.Collisions[i].Ranges, PHYSIX.Collisions[i].Ranges.Length + 1); newThang = true;
                            }
                            GUILayout.EndVertical();
                            GUILayout.EndHorizontal();
                            PHYSIX.Collisions[i].localTransform = (Transform)EditorGUILayout.ObjectField("Local Transform", (Transform)PHYSIX.Collisions[i].localTransform, typeof(Transform), true);
                            PHYSIX.Collisions[i].Snap           = GUILayout.Toggle(PHYSIX.Collisions[i].Snap, new GUIContent("Snap", "Snaps Physix onto a surface if this collision throws true."));
                            if (PHYSIX.Collisions[i].Snap)
                            {
                                GUILayout.BeginHorizontal();
                                GUILayout.Space(25);
                                GUILayout.BeginVertical();
                                PHYSIX.Collisions[i].SnapOffset                 = EditorGUILayout.FloatField(new GUIContent("Snap Offset: ", "Minimum distance ground has to be to snap onto it. Scales with speed."), PHYSIX.Collisions[i].SnapOffset);
                                PHYSIX.Collisions[i].SnapBreakVelocity          = EditorGUILayout.FloatField(new GUIContent("Snap Break Velocity", "Tangential force needed to Un-snap Physix from the surface."), PHYSIX.Collisions[i].SnapBreakVelocity);
                                PHYSIX.Collisions[i].ApplyMovementBreakVelocity = EditorGUILayout.FloatField(new GUIContent("ApplyMovement() Break Velocity", "Tangential force needed to Un-snap Physix from the surface, if the force is applied through ApplyMovement()."), PHYSIX.Collisions[i].ApplyMovementBreakVelocity);
                                PHYSIX.Collisions[i].SnapAngle = EditorGUILayout.FloatField(new GUIContent("Snap Angle", "Max surface angle change allowed."), PHYSIX.Collisions[i].SnapAngle);                                                         GUILayout.EndVertical();
                                GUILayout.EndHorizontal();
                            }
                            PHYSIX.Collisions[i].IgnoreMask = LayerMaskField("IgnoreLayers", PHYSIX.Collisions[i].IgnoreMask);
                            GUILayout.EndVertical();
                            GUILayout.EndHorizontal();
                        }
                    }
                    if (GUILayout.Button("-New Collision-", GUILayout.MaxWidth(100)))
                    {
                        ResizeArray(ref PHYSIX.Collisions, PHYSIX.Collisions.Length + 1); newThang = true;
                    }
                    EditorGUILayout.HelpBox("Collision Options", MessageType.None);
                    GUILayout.BeginHorizontal();
                    GUILayout.Space(25);
                    GUILayout.BeginVertical();

                    PHYSIX.FixMovingPlatforms = GUILayout.Toggle(PHYSIX.FixMovingPlatforms, new GUIContent("Automatic Moving Platforms", "Physix will automatically move with any collider it is colliding with."));
                    if (PHYSIX.FixMovingPlatforms)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Space(25);
                        GUILayout.BeginVertical();
                        PHYSIX.PlatformLayerMask       = LayerMaskField("Ignore platforms", PHYSIX.PlatformLayerMask);
                        PHYSIX.PlatformsRetainVelocity = GUILayout.Toggle(PHYSIX.PlatformsRetainVelocity, new GUIContent("Retain Platform Velocity", "When exiting a collider, retains any collider velocity."));
                        if (PHYSIX.PlatformsRetainVelocity)
                        {
                            PHYSIX.PlatformsVelocityMultiplier = EditorGUILayout.FloatField(new GUIContent("Platform Velocity Multiplier: ", "Multiplier to decide how much velocity is retained after exiting a moving platform."), PHYSIX.PlatformsVelocityMultiplier);
                        }
                        GUILayout.EndVertical();
                        GUILayout.EndHorizontal();
                    }
                    PHYSIX.IgnoreCollision = LayerMaskField("Ignore Layers", PHYSIX.IgnoreCollision);

                    GUILayout.EndVertical();
                    GUILayout.EndHorizontal();
                    GUILayout.EndVertical();
                    GUILayout.EndHorizontal();
                }

                //Display Movement//////////////////////////////////////////////////////////////////////////////////////////////
                GUILayout.BeginHorizontal();
                EditorGUILayout.HelpBox("Movement", MessageType.None);
                PHYSIX.HideMovement = GUILayout.Toggle(PHYSIX.HideMovement, "Hide", "Button", GUILayout.MaxWidth(50));
                GUILayout.EndHorizontal();
                if (!PHYSIX.HideMovement)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Space(25);
                    GUILayout.BeginVertical();
                    for (int i = 0; i < PHYSIX.Movements.Length; i++)
                    {
                        GUILayout.BeginHorizontal();
                        PHYSIX.Movements[i].Display = GUILayout.Toggle(PHYSIX.Movements[i].Display, PHYSIX.Movements[i].Name, "Button");
                        if (GUILayout.Button("■|■", GUILayout.MaxWidth(35)))
                        {
                            deleteMovement = -1; duplicateMovement = i; PHYSIX.Movements[i].Display = false;
                        }
                        if (GUILayout.Button("X", GUILayout.MaxWidth(25)))
                        {
                            deleteMovement = i; duplicateMovement = -1; PHYSIX.Movements[i].Display = false;
                        }
                        GUILayout.EndHorizontal();
                        if (deleteMovement == i || duplicateMovement == i)
                        {
                            bool WC = (deleteMovement == i);
                            GUILayout.BeginHorizontal();
                            if (GUILayout.Button("yes", GUILayout.MaxWidth(50)))
                            {
                                if (WC)
                                {
                                    RemoveAt(ref PHYSIX.Movements, deleteMovement);
                                }
                                if (!WC)
                                {
                                    DuplicateAtM(ref PHYSIX.Movements, duplicateMovement);
                                }
                                deleteMovement = -1; duplicateMovement = -1; deleteOrDuplicate = true;
                            }
                            if (!deleteOrDuplicate)
                            {
                                EditorGUILayout.HelpBox("" + (WC ? "Delete" :  "Duplicate") + " " + PHYSIX.Movements[i].Name + "?", MessageType.None);
                            }
                            if (GUILayout.Button("no", GUILayout.MaxWidth(50)))
                            {
                                deleteMovement = -1; duplicateMovement = -1;
                            }
                            GUILayout.EndHorizontal();
                        }
                        if (deleteOrDuplicate)
                        {
                            break;
                        }

                        if (PHYSIX.Movements[i].Display)
                        {
                            GUILayout.BeginHorizontal();
                            GUILayout.Space(25);
                            GUILayout.BeginVertical();
                            PHYSIX.Movements[i].Name = EditorGUILayout.DelayedTextField("Name: ", PHYSIX.Movements[i].Name);

                            PHYSIX.Movements[i].x.Display = EditorGUILayout.Foldout(PHYSIX.Movements[i].x.Display, "X Axis", true);
                            if (PHYSIX.Movements[i].x.Display)
                            {
                                displayMovementAxis(ref PHYSIX.Movements[i].x);
                            }
                            PHYSIX.Movements[i].y.Display = EditorGUILayout.Foldout(PHYSIX.Movements[i].y.Display, "Y Axis", true);
                            if (PHYSIX.Movements[i].y.Display)
                            {
                                displayMovementAxis(ref PHYSIX.Movements[i].y);
                            }
                            PHYSIX.Movements[i].z.Display = EditorGUILayout.Foldout(PHYSIX.Movements[i].z.Display, "Z Axis", true);
                            if (PHYSIX.Movements[i].z.Display)
                            {
                                displayMovementAxis(ref PHYSIX.Movements[i].z);
                            }

                            PHYSIX.Movements[i].localTransform = (Transform)EditorGUILayout.ObjectField("Local Transform", (Transform)PHYSIX.Movements[i].localTransform, typeof(Transform), true);
                            GUILayout.EndVertical();
                            GUILayout.EndHorizontal();
                        }
                    }
                    if (GUILayout.Button("-New Movement-", GUILayout.MaxWidth(110)))
                    {
                        ResizeArray(ref PHYSIX.Movements, PHYSIX.Movements.Length + 1); newThang = true;
                    }
                    GUILayout.EndVertical();
                    GUILayout.EndHorizontal();
                }
            }
            if (PHYSIX.UseDefualtInspector)
            {
                //EditorGUILayout.HelpBox("Defualt Inspector", MessageType.None);
                DrawDefaultInspector();
            }
            //PHYSIX.PhysicsRotation = EditorGUILayout.Vector3Field(new GUIContent("Physics Rotation: ", "Rotates the direction in which Physix calculates data. Great for changing gravitational pull."), PHYSIX.PhysicsRotation);
            GUILayout.BeginHorizontal(); GUILayout.Space(10); PHYSIX.DisplayVisualSettings = EditorGUILayout.Foldout(PHYSIX.DisplayVisualSettings, "Settings", true); GUILayout.EndHorizontal();
            if (PHYSIX.DisplayVisualSettings)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Space(30);
                GUILayout.BeginVertical();
                PHYSIX.HitboxScale         = EditorGUILayout.DelayedFloatField("Hitbox Scale: ", PHYSIX.HitboxScale);
                PHYSIX.HitBoxColor         = EditorGUILayout.ColorField("Hitbox Color: ", PHYSIX.HitBoxColor);
                PHYSIX.UseDefualtInspector = EditorGUILayout.Toggle("Use Default Inspector: ", PHYSIX.UseDefualtInspector);
                GUILayout.BeginHorizontal();
                EditorGUILayout.HelpBox("Physix Version 1.6", MessageType.None);
                EditorGUILayout.HelpBox("© Matt \"Melonhead\" Sellers 2018", MessageType.None);
                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
                GUILayout.EndHorizontal();
            }
            if (!newThang)
            {
                SceneView.RepaintAll();
            }
        }
Esempio n. 2
0
        //SceneView
        void OnSceneGUI()
        {
            Physix PHYSIX = (Physix)target;

            if (PHYSIX.Collisions == null)
            {
                PHYSIX.Collisions = new Physix.PHYSIXCOLLISION[0];
            }
            if (PHYSIX.Movements == null)
            {
                PHYSIX.Movements = new Physix.PHYSIXMOVE[0];
            }
            if (!newThang && !PHYSIX.HideCollision)
            {
                Event e = Event.current;
                float CCPH = (Camera.current != null ? Camera.current.pixelRect.height : Screen.height);
                float CCPHX = (Camera.current != null ? Camera.current.pixelRect.width : Screen.width);
                bool  mouseoutside = e.mousePosition.y > CCPH || e.mousePosition.y <0 || e.mousePosition.x> CCPHX || e.mousePosition.x < 0;
                if (e.button == 0 && e.isMouse && PHYSIX.SelectCollision != -1)
                {
                    int       controlID = GUIUtility.GetControlID(FocusType.Passive);
                    EventType eventType = e.GetTypeForControl(controlID);
                    if (eventType == EventType.MouseUp)
                    {
                        PHYSIX.HOLD           = false;
                        GUIUtility.hotControl = controlID;
                    }
                    else if (eventType == EventType.MouseDown)
                    {
                        PHYSIX.HOLD           = true;
                        GUIUtility.hotControl = 0;
                    }
                }
                if (!PHYSIX.HOLD)
                {
                    PHYSIX.SelectCollision = -1; PHYSIX.SelectRange = -1;
                }
                for (int i = 0; i < PHYSIX.Collisions.Length; i++)
                {
                    if (PHYSIX.Collisions[i].Display)
                    {
                        Transform trans = (PHYSIX.Collisions[i].localTransform != null ? PHYSIX.Collisions[i].localTransform : PHYSIX.transform);
                        for (int ii = 0; ii < PHYSIX.Collisions[i].Ranges.Length; ii++)
                        {
                            float      iiirot    = 0.0f;
                            Vector3    iiivect   = new Vector3(0, 0, 0);
                            Vector3    iiivect2  = new Vector3(0, 0, 0);
                            Vector3    iiipos    = new Vector3(0, 0, 0);
                            Quaternion quateuler = Quaternion.Euler(trans.eulerAngles);
                            if (Camera.current != null)
                            {
                                iiipos   = Camera.current.transform.position;
                                iiivect  = Camera.current.transform.eulerAngles;
                                iiivect2 = (Quaternion.Inverse(trans.rotation) * Camera.current.transform.rotation).eulerAngles;
                                if (PHYSIX.Collisions[i].Ranges[ii].x)
                                {
                                    iiirot = (trans.InverseTransformPoint(Camera.current.transform.position).z < 0 ? iiivect2.x : 180 - iiivect2.x);
                                }
                                if (PHYSIX.Collisions[i].Ranges[ii].y)
                                {
                                    iiirot = iiivect2.y;
                                }
                                if (PHYSIX.Collisions[i].Ranges[ii].z)
                                {
                                    iiirot = (trans.InverseTransformPoint(Camera.current.transform.position).x < 0 ? iiivect2.x : 180 - iiivect2.x);
                                }
                            }
                            Quaternion rot    = quateuler * Quaternion.Euler(new Vector3(0, 0, PHYSIX.Collisions[i].Ranges[ii].value * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * (PHYSIX.Collisions[i].Ranges[ii].less ? -1 : 1)) + (PHYSIX.Collisions[i].Ranges[ii].less ? 180 : 0)) + (PHYSIX.Collisions[i].Ranges[ii].x ? new Vector3(0, 0, -90) : new Vector3(0, 0, 0)) + new Vector3((PHYSIX.Collisions[i].Ranges[ii].x ? iiirot : 0), (PHYSIX.Collisions[i].Ranges[ii].y ? iiirot : 0), 0) + (PHYSIX.Collisions[i].Ranges[ii].z ? new Vector3(iiirot, 90, 90) : new Vector3(0, 0, 0)));
                            Quaternion rotTip = quateuler * Quaternion.Euler(new Vector3(0, 0, 90 * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * (PHYSIX.Collisions[i].Ranges[ii].less ? -1 : 1)) + (PHYSIX.Collisions[i].Ranges[ii].less ? 180 : 0)) + (PHYSIX.Collisions[i].Ranges[ii].x ? new Vector3(0, 0, -90) : new Vector3(0, 0, 0)) + new Vector3((PHYSIX.Collisions[i].Ranges[ii].x ? iiirot : 0), (PHYSIX.Collisions[i].Ranges[ii].y ? iiirot : 0), 0) + (PHYSIX.Collisions[i].Ranges[ii].z ? new Vector3(iiirot, 90, 90) : new Vector3(0, 0, 0)));
                            Handles.color = new Color(PHYSIX.HitBoxColor.r, PHYSIX.HitBoxColor.g, PHYSIX.HitBoxColor.b, 0.25f);
                            float   size      = PHYSIX.HitboxScale * 0.5f * ((PHYSIX.transform.lossyScale.x + PHYSIX.transform.lossyScale.y + PHYSIX.transform.lossyScale.z) / 3f);
                            float   ArcLength = (PHYSIX.Collisions[i].Ranges[ii].less && PHYSIX.Collisions[i].Ranges[ii].greater ? 360 : (180 - (PHYSIX.Collisions[i].Ranges[ii].value * 2) * (PHYSIX.Collisions[i].Ranges[ii].less ? -1 : 1)) * (!PHYSIX.Collisions[i].Ranges[ii].less && !PHYSIX.Collisions[i].Ranges[ii].greater ? 0 : 1));
                            Vector3 point1    = trans.position + (rot * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * Vector3.right)) * size;
                            Vector3 point2    = trans.position + (rot * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * (Quaternion.Euler(0, 0, (PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * ArcLength) * Vector3.right))) * size;
                            Vector3 pointT    = trans.position + (rotTip * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * Vector3.right)) * size;
                            Handles.DrawSolidArc(trans.position,
                                                 rot * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * Vector3.forward),
                                                 rot * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * Vector3.right),
                                                 ArcLength,
                                                 size);
                            Handles.color = new Color(PHYSIX.HitBoxColor.r, PHYSIX.HitBoxColor.g, PHYSIX.HitBoxColor.b, 1);
                            if (!(PHYSIX.Collisions[i].Ranges[ii].less && PHYSIX.Collisions[i].Ranges[ii].greater))
                            {
                                if (PHYSIX.Collisions[i].Ranges[ii].equals)
                                {
                                    Handles.DrawLine(point1, trans.position);
                                    Handles.DrawLine(point2, trans.position);
                                }
                                if (!PHYSIX.Collisions[i].Ranges[ii].equals)
                                {
                                    Handles.DrawDottedLine(point1, trans.position, 10);
                                    Handles.DrawDottedLine(point2, trans.position, 10);
                                }
                            }
                            float dist1       = Vector3.Distance(new Vector3(e.mousePosition.x, CCPH - e.mousePosition.y, 0), Vector3.Scale(Camera.current.WorldToScreenPoint(point1), new Vector3(1, 1, 0)));
                            float dist2       = Vector3.Distance(new Vector3(e.mousePosition.x, CCPH - e.mousePosition.y, 0), Vector3.Scale(Camera.current.WorldToScreenPoint(point2), new Vector3(1, 1, 0)));
                            float neededDist1 = Mathf.Clamp((size / Vector3.Distance(iiipos, point1)) * 100, 20, 1000);
                            float neededDist2 = Mathf.Clamp((size / Vector3.Distance(iiipos, point2)) * 100, 20, 1000);
                            if ((dist1 < neededDist1 || dist2 < neededDist2) && !PHYSIX.HOLD)
                            {
                                PHYSIX.SelectCollision = i; PHYSIX.SelectRange = ii;
                            }
                            Vector3 facenormal = Quaternion.Euler(iiivect) * Vector3.forward;
                            if (PHYSIX.SelectCollision == i && PHYSIX.SelectRange == ii)
                            {
                                if (!PHYSIX.HOLD)
                                {
                                    Handles.DrawWireDisc(point1, facenormal, size * 0.1f);
                                    Handles.DrawWireDisc(point2, facenormal, size * 0.1f);
                                }
                                if (PHYSIX.HOLD)
                                {
                                    if (mouseoutside)
                                    {
                                        PHYSIX.HOLD = false;
                                    }
                                    Handles.color = new Color(PHYSIX.HitBoxColor.r, PHYSIX.HitBoxColor.g, PHYSIX.HitBoxColor.b, 0.5f);
                                    Handles.DrawSolidDisc(point1, facenormal, size * 0.1f);
                                    Handles.DrawSolidDisc(point2, facenormal, size * 0.1f);
                                    Vector3 transScreen = Camera.current.WorldToScreenPoint(trans.position);
                                    float   rotvalue    = (PHYSIX.Collisions[i].Ranges[ii].y ? rotTip.eulerAngles.z - 90 : (PHYSIX.Collisions[i].Ranges[ii].z ? rotTip.eulerAngles.z - rotTip.eulerAngles.x : rotTip.eulerAngles.z - rotTip.eulerAngles.y + trans.eulerAngles.y));
                                    float   valangle    = (iiivect.z > 90 ? -1 : 1) * (PHYSIX.Collisions[i].Ranges[ii].x && iiivect2.y > 90 && iiivect2.y < 270 ? 1 : -1) * (!PHYSIX.Collisions[i].Ranges[ii].x ? -1 : 1) * (90 - Vector3.Angle(Quaternion.Inverse(Quaternion.Euler(0, 0, rotvalue)) * (new Vector3(e.mousePosition.x, CCPH - e.mousePosition.y, 0) - Vector3.Scale(transScreen, new Vector3(1, 1, 0))), (PHYSIX.Collisions[i].Ranges[ii].y ? Vector3.up : -Vector3.right)));
                                    float   rounded10   = PHYSIX.RoundToPower(valangle, -1);
                                    float   diff10      = valangle - rounded10;
                                    float   control10   = rounded10 + (diff10 > 0 ? (Mathf.Abs(diff10) > 2.5 ? 5 : 0) : (Mathf.Abs(diff10) > 2.5 ? -5 : 0));
                                    PHYSIX.Collisions[i].Ranges[ii].value = (e.control ? control10 : PHYSIX.RoundToPower(valangle, 0));
                                    GUIStyle labelstyle = new GUIStyle();
                                    labelstyle.normal.textColor = new Color(PHYSIX.HitBoxColor.r, PHYSIX.HitBoxColor.g, PHYSIX.HitBoxColor.b, 1);
                                    if (dist1 < dist2)
                                    {
                                        Handles.Label(point1 + Quaternion.LookRotation(point1 - trans.position) * new Vector3(0, 0, size * 0.2f), "" + PHYSIX.Collisions[i].Ranges[ii].value + "º", labelstyle);
                                    }
                                    if (dist2 <= dist1)
                                    {
                                        Handles.Label(point2 + Quaternion.LookRotation(point2 - trans.position) * new Vector3(0, 0, size * 0.2f), "" + PHYSIX.Collisions[i].Ranges[ii].value + "º", labelstyle);
                                    }
                                }
                            }
                            Handles.color = new Color(PHYSIX.HitBoxColor.r, PHYSIX.HitBoxColor.g, PHYSIX.HitBoxColor.b, 1);
                            Handles.DrawWireArc(trans.position,
                                                rot * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * Vector3.forward),
                                                rot * ((PHYSIX.Collisions[i].Ranges[ii].z ? -1 : 1) * Vector3.right),
                                                ArcLength,
                                                size);
                        }
                    }
                }
            }
            if (PHYSIX.SelectCollision != -1)
            {
                SceneView.RepaintAll();
            }
        }
Esempio n. 3
0
    private void Awake()
    {
        _bodyCollider = GetComponent <Collider>();

        // Config Rigidbody
        _rigidbody                        = gameObject.AddComponent <Rigidbody>();
        _rigidbody.useGravity             = false;
        _rigidbody.mass                   = mass;
        _rigidbody.drag                   = 0f;
        _rigidbody.angularDrag            = 0f;
        _rigidbody.collisionDetectionMode = collisionDetectionMode;
        _rigidbody.constraints            = (int)RigidbodyConstraints.FreezePositionZ + (int)RigidbodyConstraints.FreezeRotationX + (int)RigidbodyConstraints.FreezeRotationY + RigidbodyConstraints.FreezeRotationZ;
        _rigidbody.interpolation          = interpolation;
        _rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;

        // Config Physix
        _physix               = gameObject.AddComponent <Physix>();
        _physix.Collisions    = new Physix.PHYSIXCOLLISION[4];
        _physix.Collisions[0] = new Physix.PHYSIXCOLLISION {
            Name   = TOP_COLLISION,
            Active = true,
            Ranges = new [] { new Physix.PHYSIXBOUNDS {
                                  y = true, greater = true, equals = false, value = 45f
                              } }
        };

        _physix.Collisions[1] = new Physix.PHYSIXCOLLISION {
            Name   = BOTTOM_COLLISION,
            Active = true,
            Ranges = new[] { new Physix.PHYSIXBOUNDS {
                                 y = true, less = true, equals = false, value = -45f
                             } },
            Snap = true
        };

        _physix.Collisions[2] = new Physix.PHYSIXCOLLISION {
            Name   = RIGHT_COLLISION,
            Active = true,
            Ranges = new[] { new Physix.PHYSIXBOUNDS {
                                 x = true, greater = true, equals = false, value = 45f
                             } }
        };

        _physix.Collisions[3] = new Physix.PHYSIXCOLLISION {
            Name   = LEFT_COLLISION,
            Active = true,
            Ranges = new[] { new Physix.PHYSIXBOUNDS {
                                 x = true, less = true, equals = false, value = -45f
                             } }
        };

        _physix.Movements = new[] { new Physix.PHYSIXMOVE {
                                        Name = GLOBAL_MOVEMENT
                                    } };
        _physix.Movements[0].x.equals = true;
        _physix.Movements[0].y.equals = true;
        _physix.Movements[0].z.equals = true;

        _physix.PlatformsRetainVelocity     = true;
        _physix.PlatformsVelocityMultiplier = 25f;
    }