コード例 #1
0
    public FPVector[] TestCollision(HurtBox[] hurtBoxes, HitConfirmType hitConfirmType)
    {
        if (isHit && hitConfirmType == HitConfirmType.Hit)
        {
            return(new FPVector[0]);
        }
        foreach (HitBox hitbox in this.hitBoxes)
        {
            if (hitbox.followXBounds || hitbox.followYBounds)
            {
                hitbox.rendererBounds = GetBounds();
            }
        }

        return(HitBoxesScript.TestCollision(worldTransform.position, this.hitBoxes, hurtBoxes, hitConfirmType, controlsScript.mirror));
    }
コード例 #2
0
    public Vector3[] TestCollision(HurtBox[] hurtBoxes, HitConfirmType hitConfirmType)
    {
        if (isHit && hitConfirmType == HitConfirmType.Hit)
        {
            return new Vector3[] { }
        }
        ;
        foreach (HitBox hitbox in this.hitBoxes)
        {
            if (hitbox.followXBounds || hitbox.followYBounds)
            {
                hitbox.rendererBounds = GetBounds();
            }
        }

        return(HitBoxesScript.TestCollision(this.hitBoxes, hurtBoxes, hitConfirmType, controlsScript.mirror));
    }
コード例 #3
0
    public Vector3 TestCollision(HurtBox[] hurtBoxes, HitConfirmType hitConfirmType)
    {
        if (isHit && hitConfirmType == HitConfirmType.Hit)
        {
            return(Vector3.zero);
        }
        foreach (HitBox hitbox in this.hitBoxes)
        {
            if (hitbox.followXBounds || hitbox.followYBounds)
            {
                hitbox.rendererBounds = GetBounds();
            }
        }

        /*Vector3 result = HitBoxesScript.TestCollision(this.hitBoxes, hurtBoxes, hitConfirmType, controlsScript.mirror);
         * if (result == Vector3.zero) {
         *      foreach (HitBox hitBox in hitBoxes) {
         *              if (hitBox.state == 1) hitBox.state = 0;
         *      }
         * }*/

        return(HitBoxesScript.TestCollision(this.hitBoxes, hurtBoxes, hitConfirmType, controlsScript.mirror));
    }
コード例 #4
0
    public static Vector3 TestCollision(HitBox[] hitBoxes, HurtBox[] hurtBoxes, HitConfirmType hitConfirmType, int mirror)
    {
        foreach (HitBox hitBox in hitBoxes)
        {
            if (hitBox.hide)
            {
                continue;
            }
            if (hitBox.collisionType == CollisionType.noCollider)
            {
                continue;
            }
            if (hitConfirmType == HitConfirmType.Throw && hitBox.collisionType != CollisionType.throwCollider)
            {
                continue;
            }
            if (hitConfirmType == HitConfirmType.Hit && hitBox.collisionType == CollisionType.throwCollider)
            {
                continue;
            }

            hitBox.state = 0;
            foreach (HurtBox hurtBox in hurtBoxes)
            {
                Vector3 hurtBoxPosition  = hurtBox.position;
                Vector3 hitBoxPosition   = hitBox.position.position;
                float   dist             = 0;
                bool    collisionConfirm = false;

                if (!UFE.config.detect3D_Hits)
                {
                    hurtBoxPosition.z = -1;
                    hitBoxPosition.z  = -1;
                }

                if (hurtBox.shape == HitBoxShape.circle)
                {
                    if (hitBox.shape == HitBoxShape.circle)
                    {
                        dist = Vector3.Distance(hurtBoxPosition, hitBoxPosition);
                        if (dist <= hurtBox.radius + hitBox.radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                    else if (hitBox.shape == HitBoxShape.rectangle)
                    {
                        float mirrorDiff = mirror > 0 ? hitBox.rect.width : 0f;
                        Rect  hitBoxRectanglePosition = new Rect(((hitBox.rect.x + mirrorDiff) * mirror) + hitBoxPosition.x,
                                                                 hitBox.rect.y + hitBoxPosition.y,
                                                                 hitBox.rect.width, hitBox.rect.height);
                        if (hitBox.followXBounds)
                        {
                            hitBoxRectanglePosition.x     = hitBox.rendererBounds.x - (hitBox.rect.width / 2);
                            hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds)
                        {
                            hitBoxRectanglePosition.y      = hitBox.rendererBounds.y - (hitBox.rect.height / 2);
                            hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        dist = distancePointToRectangle(hurtBoxPosition, hitBoxRectanglePosition);
                        if (dist <= hurtBox.radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                }
                else if (hurtBox.shape == HitBoxShape.rectangle)
                {
                    Rect hurtBoxRectanglePosition;
                    if (hitBox.shape == HitBoxShape.circle)
                    {
                        float mirrorDiff = mirror < 0 ? hurtBox.rect.width : 0f;
                        hurtBoxRectanglePosition = new Rect(((hurtBox.rect.x + mirrorDiff) * mirror) + hurtBoxPosition.x,
                                                            hurtBox.rect.y + hurtBoxPosition.y,
                                                            hurtBox.rect.width, hurtBox.rect.height);
                        if (hurtBox.followXBounds)
                        {
                            hurtBoxRectanglePosition.x     = hurtBox.rendererBounds.x - (hurtBox.rect.width / 2);
                            hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds)
                        {
                            hurtBoxRectanglePosition.y      = hurtBox.rendererBounds.y - (hurtBox.rect.height / 2);
                            hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        dist = distancePointToRectangle(hitBoxPosition, hurtBoxRectanglePosition);
                        if (dist <= hitBox.radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                    else if (hitBox.shape == HitBoxShape.rectangle)
                    {
                        float mirrorDiff = mirror < 0 ? hurtBox.rect.width : 0f;
                        hurtBoxRectanglePosition = new Rect(((hurtBox.rect.x + mirrorDiff) * mirror) + hurtBoxPosition.x,
                                                            hurtBox.rect.y + hurtBoxPosition.y,
                                                            hurtBox.rect.width, hurtBox.rect.height);

                        mirrorDiff = mirror > 0 ? hitBox.rect.width : 0f;
                        Rect hitBoxRectanglePosition = new Rect(((hitBox.rect.x + mirrorDiff) * -mirror) + hitBoxPosition.x,
                                                                hitBox.rect.y + hitBoxPosition.y,
                                                                hitBox.rect.width, hitBox.rect.height);
                        if (hitBox.followXBounds)
                        {
                            hitBoxRectanglePosition.x     = hitBox.rendererBounds.x - (hitBox.rect.width / 2);
                            hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds)
                        {
                            hitBoxRectanglePosition.y      = hitBox.rendererBounds.y - (hitBox.rect.height / 2);
                            hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        if (hurtBox.followXBounds)
                        {
                            hurtBoxRectanglePosition.x     = hurtBox.rendererBounds.x - (hurtBox.rect.width / 2);
                            hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds)
                        {
                            hurtBoxRectanglePosition.y      = hurtBox.rendererBounds.y - (hurtBox.rect.height / 2);
                            hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        if (hurtBoxRectanglePosition.Overlaps(hitBoxRectanglePosition))
                        {
                            collisionConfirm = true;
                        }
                    }
                }

                if (collisionConfirm)
                {
                    if (hitConfirmType == HitConfirmType.Hit)
                    {
                        hitBox.state = 1;
                    }
                    return((hurtBoxPosition + hitBoxPosition) / 2);
                }
            }
        }

        foreach (HitBox hitBox in hitBoxes)
        {
            if (hitBox.state == 1)
            {
                hitBox.state = 0;
            }
        }
        return(Vector3.zero);
    }
コード例 #5
0
    public static FPVector[] TestCollision(FPVector rootPosition, HitBox[] hitBoxes, HurtBox[] hurtBoxes, HitConfirmType hitConfirmType, int mirror)
    {
        foreach (HitBox hitBox in hitBoxes)
        {
            if (hitBox.hide)
            {
                continue;
            }
            if (hitBox.collisionType == CollisionType.noCollider)
            {
                continue;
            }
            if (hitConfirmType == HitConfirmType.Throw && hitBox.collisionType != CollisionType.throwCollider)
            {
                continue;
            }
            if (hitConfirmType == HitConfirmType.Hit && hitBox.collisionType == CollisionType.throwCollider)
            {
                continue;
            }

            hitBox.state = 0;
            //drawRect.Clear();
            foreach (HurtBox hurtBox in hurtBoxes)
            {
                FPVector hurtBoxPosition = hurtBox.position;
                FPVector hitBoxPosition  = hitBox.mappedPosition + rootPosition;

                Fix64 dist             = 0;
                bool  collisionConfirm = false;

                if (!UFE.config.detect3D_Hits)
                {
                    hurtBoxPosition.z = 0;
                    hitBoxPosition.z  = 0;
                }

                if (hurtBox.shape == HitBoxShape.circle)
                {
                    if (hitBox.shape == HitBoxShape.circle)
                    {
                        dist = FPVector.Distance(hurtBoxPosition, hitBoxPosition);
                        if (dist <= hurtBox._radius + hitBox._radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                    else if (hitBox.shape == HitBoxShape.rectangle)
                    {
                        FPRect hitBoxRectanglePosition = hitBox._rect;
                        hitBoxRectanglePosition.x += hitBoxPosition.x;
                        hitBoxRectanglePosition.y += hitBoxPosition.y;
                        hitBoxRectanglePosition.RefreshPoints();

                        if (hitBox.followXBounds)
                        {
                            //hitBoxRectanglePosition.x = hitBox.rendererBounds.x - (hitBox.rect.width / 2);
                            //hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds)
                        {
                            //hitBoxRectanglePosition.y = hitBox.rendererBounds.y - (hitBox.rect.height / 2);
                            //hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        dist = hitBoxRectanglePosition.DistanceToPoint(hurtBoxPosition);
                        if (hurtBox._radius >= dist)
                        {
                            collisionConfirm = true;
                        }

                        /*if (collisionConfirm && !hurtBox.isBlock) {
                         *  Debug.Log("------------------");
                         *  Debug.Log(hurtBoxPosition);
                         *  Debug.Log(hitBox.bodyPart + " - " + hitBoxRectanglePosition);
                         *  Debug.Log("xMin/xMax,yMin/yMax : " + hitBoxRectanglePosition.xMin + "/" + hitBoxRectanglePosition.xMax + ", " + hitBoxRectanglePosition.yMin + "/" + hitBoxRectanglePosition.yMax);
                         *  Debug.Log(hurtBox.radius + " >= " + dist + " = " + collisionConfirm);
                         * }*/
                    }
                }
                else if (hurtBox.shape == HitBoxShape.rectangle)
                {
                    FPRect hurtBoxRectanglePosition = hurtBox._rect;
                    if (mirror < 0)
                    {
                        hurtBoxRectanglePosition.x += hurtBoxRectanglePosition.width;
                    }
                    hurtBoxRectanglePosition.x *= mirror;
                    hurtBoxRectanglePosition.x += hurtBoxPosition.x;
                    hurtBoxRectanglePosition.y += hurtBoxPosition.y;
                    hurtBoxRectanglePosition.RefreshPoints();

                    if (hitBox.shape == HitBoxShape.circle)
                    {
                        if (hurtBox.followXBounds)
                        {
                            //hurtBoxRectanglePosition.x = hurtBox.rendererBounds.x - (hurtBox.rect.width/2);
                            //hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds)
                        {
                            //hurtBoxRectanglePosition.y = hurtBox.rendererBounds.y - (hurtBox.rect.height/2);
                            //hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        dist = hurtBoxRectanglePosition.DistanceToPoint(hitBoxPosition);
                        if (dist <= hitBox._radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                    else if (hitBox.shape == HitBoxShape.rectangle)
                    {
                        FPRect hitBoxRectanglePosition = hitBox._rect;
                        //if (mirror > 0) hitBoxRectanglePosition.x += hitBoxRectanglePosition.width;
                        //hitBoxRectanglePosition.x *= -mirror;
                        hitBoxRectanglePosition.x += hitBoxPosition.x;
                        hitBoxRectanglePosition.y += hitBoxPosition.y;
                        hitBoxRectanglePosition.RefreshPoints();


                        if (hitBox.followXBounds)
                        {
                            //hitBoxRectanglePosition.x = hitBox.rendererBounds.x - (hitBox.rect.width/2);
                            //hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds)
                        {
                            //hitBoxRectanglePosition.y = hitBox.rendererBounds.y - (hitBox.rect.height/2);
                            //hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        if (hurtBox.followXBounds)
                        {
                            //hurtBoxRectanglePosition.x = hurtBox.rendererBounds.x - (hurtBox.rect.width/2);
                            //hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds)
                        {
                            //hurtBoxRectanglePosition.y = hurtBox.rendererBounds.y - (hurtBox.rect.height/2);
                            //hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        if (hurtBoxRectanglePosition.Intersects(hitBoxRectanglePosition))
                        {
                            collisionConfirm = true;
                        }
                    }
                }

                if (collisionConfirm)
                {
                    if (hitConfirmType == HitConfirmType.Hit)
                    {
                        hitBox.state = 1;
                    }
                    return(new FPVector[] { hurtBoxPosition, hitBoxPosition, (hurtBoxPosition + hitBoxPosition) / 2 });
                }
            }
        }

        foreach (HitBox hitBox in hitBoxes)
        {
            if (hitBox.state == 1)
            {
                hitBox.state = 0;
            }
        }
        return(new FPVector[0]);
    }
コード例 #6
0
    public static Vector3[] TestCollision(HitBox[] hitBoxes, HurtBox[] hurtBoxes, HitConfirmType hitConfirmType, int mirror)
    {
        foreach (HitBox hitBox in hitBoxes)
        {
            if (hitBox.hide)
            {
                continue;
            }
            if (hitBox.collisionType == CollisionType.noCollider)
            {
                continue;
            }
            if (hitConfirmType == HitConfirmType.Throw && hitBox.collisionType != CollisionType.throwCollider)
            {
                continue;
            }
            if (hitConfirmType == HitConfirmType.Hit && hitBox.collisionType == CollisionType.throwCollider)
            {
                continue;
            }

            hitBox.state = 0;
            //drawRect.Clear();
            foreach (HurtBox hurtBox in hurtBoxes)
            {
                Vector3 hurtBoxPosition  = hurtBox.position;
                Vector3 hitBoxPosition   = hitBox.position.position;
                float   dist             = 0;
                bool    collisionConfirm = false;

                if (!UFE.config.detect3D_Hits)
                {
                    hurtBoxPosition.z = -1;
                    hitBoxPosition.z  = -1;
                }

                if (hurtBox.shape == HitBoxShape.circle)
                {
                    if (hitBox.shape == HitBoxShape.circle)
                    {
                        dist = Vector3.Distance(hurtBoxPosition, hitBoxPosition);
                        if (dist <= hurtBox.radius + hitBox.radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                    else if (hitBox.shape == HitBoxShape.rectangle)
                    {
                        Rect hitBoxRectanglePosition = new Rect(hitBox.rect);
                        hitBoxRectanglePosition.x     *= -mirror;
                        hitBoxRectanglePosition.width *= -mirror;
                        hitBoxRectanglePosition.x     += hitBoxPosition.x;
                        hitBoxRectanglePosition.y     += hitBoxPosition.y;

                        if (hitBox.followXBounds)
                        {
                            hitBoxRectanglePosition.x     = hitBox.rendererBounds.x - (hitBox.rect.width / 2);
                            hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds)
                        {
                            hitBoxRectanglePosition.y      = hitBox.rendererBounds.y - (hitBox.rect.height / 2);
                            hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        dist = distancePointToRectangle(hurtBoxPosition, hitBoxRectanglePosition);
                        if (hurtBox.radius >= dist)
                        {
                            collisionConfirm = true;
                        }


                        /*if (collisionConfirm && !hurtBox.isBlock) {
                         *  Debug.Log("------------------");
                         *  Debug.Log(hurtBoxPosition);
                         *  Debug.Log(hitBox.bodyPart + " - " + hitBoxRectanglePosition);
                         *  Debug.Log("xMin/xMax,yMin/yMax : " + hitBoxRectanglePosition.xMin + "/" + hitBoxRectanglePosition.xMax + ", " + hitBoxRectanglePosition.yMin + "/" + hitBoxRectanglePosition.yMax);
                         *  Debug.Log(hurtBox.radius + " >= " + dist + " = " + collisionConfirm);
                         * }*/
                    }
                }
                else if (hurtBox.shape == HitBoxShape.rectangle)
                {
                    /* Overlap doesn't work with negative width
                     * Rect hurtBoxRectanglePosition = new Rect(hurtBox.rect);
                     * hurtBoxRectanglePosition.x *= -mirror;
                     * hurtBoxRectanglePosition.width *= -mirror;
                     * hurtBoxRectanglePosition.x += hurtBoxPosition.x;
                     * hurtBoxRectanglePosition.y += hurtBoxPosition.y;*/

                    float mirrorDiff = mirror < 0 ? hurtBox.rect.width : 0f;
                    Rect  hurtBoxRectanglePosition = new Rect(((hurtBox.rect.x + mirrorDiff) * mirror) + hurtBoxPosition.x,
                                                              hurtBox.rect.y + hurtBoxPosition.y,
                                                              hurtBox.rect.width, hurtBox.rect.height);

                    if (hitBox.shape == HitBoxShape.circle)
                    {
                        if (hurtBox.followXBounds)
                        {
                            hurtBoxRectanglePosition.x     = hurtBox.rendererBounds.x - (hurtBox.rect.width / 2);
                            hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds)
                        {
                            hurtBoxRectanglePosition.y      = hurtBox.rendererBounds.y - (hurtBox.rect.height / 2);
                            hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        dist = distancePointToRectangle(hitBoxPosition, hurtBoxRectanglePosition);
                        if (dist <= hitBox.radius)
                        {
                            collisionConfirm = true;
                        }
                    }
                    else if (hitBox.shape == HitBoxShape.rectangle)
                    {
                        /* Overlap doesn't work with negative width
                         * Rect hitBoxRectanglePosition = new Rect(hitBox.rect);
                         * hitBoxRectanglePosition.x *= -mirror;
                         * hitBoxRectanglePosition.width *= -mirror;
                         * hitBoxRectanglePosition.x += hitBoxPosition.x;
                         * hitBoxRectanglePosition.y += hitBoxPosition.y;*/

                        mirrorDiff = mirror > 0 ? hitBox.rect.width : 0f;
                        Rect hitBoxRectanglePosition = new Rect(((hitBox.rect.x + mirrorDiff) * -mirror) + hitBoxPosition.x,
                                                                hitBox.rect.y + hitBoxPosition.y,
                                                                hitBox.rect.width, hitBox.rect.height);

                        if (hitBox.followXBounds)
                        {
                            hitBoxRectanglePosition.x     = hitBox.rendererBounds.x - (hitBox.rect.width / 2);
                            hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds)
                        {
                            hitBoxRectanglePosition.y      = hitBox.rendererBounds.y - (hitBox.rect.height / 2);
                            hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        if (hurtBox.followXBounds)
                        {
                            hurtBoxRectanglePosition.x     = hurtBox.rendererBounds.x - (hurtBox.rect.width / 2);
                            hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds)
                        {
                            hurtBoxRectanglePosition.y      = hurtBox.rendererBounds.y - (hurtBox.rect.height / 2);
                            hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        if (hurtBoxRectanglePosition.Overlaps(hitBoxRectanglePosition))
                        {
                            collisionConfirm = true;
                        }
                    }
                }

                if (collisionConfirm)
                {
                    if (hitConfirmType == HitConfirmType.Hit)
                    {
                        hitBox.state = 1;
                    }
                    return(new Vector3[] { hurtBoxPosition, hitBoxPosition, (hurtBoxPosition + hitBoxPosition) / 2 });
                }
            }
        }

        foreach (HitBox hitBox in hitBoxes)
        {
            if (hitBox.state == 1)
            {
                hitBox.state = 0;
            }
        }
        return(new Vector3[] { });
    }
コード例 #7
0
    public Vector3 TestCollision(HurtBox[] hurtBoxes, HitConfirmType hitConfirmType)
    {
        if (isHit && hitConfirmType == HitConfirmType.Hit) return Vector3.zero;
        foreach(HitBox hitbox in this.hitBoxes) if (hitbox.followXBounds || hitbox.followYBounds) hitbox.rendererBounds = GetBounds();
        /*Vector3 result = HitBoxesScript.TestCollision(this.hitBoxes, hurtBoxes, hitConfirmType, controlsScript.mirror);
        if (result == Vector3.zero) {
            foreach (HitBox hitBox in hitBoxes) {
                if (hitBox.state == 1) hitBox.state = 0;
            }
        }*/

        return HitBoxesScript.TestCollision(this.hitBoxes, hurtBoxes, hitConfirmType, controlsScript.mirror);
    }
コード例 #8
0
    public static Vector3 TestCollision(HitBox[] hitBoxes, HurtBox[] hurtBoxes, HitConfirmType hitConfirmType, int mirror)
    {
        foreach (HitBox hitBox in hitBoxes) {
            if (hitBox.hide) continue;
            if (hitBox.collisionType == CollisionType.noCollider) continue;
            if (hitConfirmType == HitConfirmType.Throw && hitBox.collisionType != CollisionType.throwCollider) continue;
            if (hitConfirmType == HitConfirmType.Hit && hitBox.collisionType == CollisionType.throwCollider) continue;

            hitBox.state = 0;
            foreach (HurtBox hurtBox in hurtBoxes) {
                Vector3 hurtBoxPosition = hurtBox.position;
                Vector3 hitBoxPosition = hitBox.position.position;
                float dist = 0;
                bool collisionConfirm = false;

                if (!UFE.config.detect3D_Hits){
                    hurtBoxPosition.z = -1;
                    hitBoxPosition.z = -1;
                }

                if (hurtBox.shape == HitBoxShape.circle){
                    if (hitBox.shape == HitBoxShape.circle){
                        dist = Vector3.Distance(hurtBoxPosition, hitBoxPosition);
                        if (dist <= hurtBox.radius + hitBox.radius) collisionConfirm = true;

                    }else if (hitBox.shape == HitBoxShape.rectangle){
                        float mirrorDiff = mirror > 0 ? hitBox.rect.width : 0f;
                        Rect hitBoxRectanglePosition = new Rect(((hitBox.rect.x + mirrorDiff) * mirror) + hitBoxPosition.x,
                                                                hitBox.rect.y + hitBoxPosition.y,
                                                                hitBox.rect.width, hitBox.rect.height);
                        if (hitBox.followXBounds){
                            hitBoxRectanglePosition.x = hitBox.rendererBounds.x - (hitBox.rect.width/2);
                            hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds){
                            hitBoxRectanglePosition.y = hitBox.rendererBounds.y - (hitBox.rect.height/2);
                            hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        dist = distancePointToRectangle(hurtBoxPosition, hitBoxRectanglePosition);
                        if (dist <= hurtBox.radius) collisionConfirm = true;
                    }
                }else if (hurtBox.shape == HitBoxShape.rectangle){
                    Rect hurtBoxRectanglePosition;
                    if (hitBox.shape == HitBoxShape.circle){
                        float mirrorDiff = mirror < 0 ? hurtBox.rect.width : 0f;
                        hurtBoxRectanglePosition = new Rect(((hurtBox.rect.x + mirrorDiff) * mirror) + hurtBoxPosition.x,
                                                            hurtBox.rect.y + hurtBoxPosition.y,
                                                            hurtBox.rect.width, hurtBox.rect.height);
                        if (hurtBox.followXBounds){
                            hurtBoxRectanglePosition.x = hurtBox.rendererBounds.x - (hurtBox.rect.width/2);
                            hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds){
                            hurtBoxRectanglePosition.y = hurtBox.rendererBounds.y - (hurtBox.rect.height/2);
                            hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        dist = distancePointToRectangle(hitBoxPosition, hurtBoxRectanglePosition);
                        if (dist <= hitBox.radius) collisionConfirm = true;

                    }else if (hitBox.shape == HitBoxShape.rectangle){
                        float mirrorDiff = mirror < 0 ? hurtBox.rect.width : 0f;
                        hurtBoxRectanglePosition = new Rect(((hurtBox.rect.x + mirrorDiff) * mirror) + hurtBoxPosition.x,
                                                            hurtBox.rect.y + hurtBoxPosition.y,
                                                            hurtBox.rect.width, hurtBox.rect.height);

                        mirrorDiff = mirror > 0 ? hitBox.rect.width : 0f;
                        Rect hitBoxRectanglePosition = new Rect(((hitBox.rect.x + mirrorDiff) * - mirror) + hitBoxPosition.x,
                                                           hitBox.rect.y + hitBoxPosition.y,
                                                           hitBox.rect.width, hitBox.rect.height);
                        if (hitBox.followXBounds){
                            hitBoxRectanglePosition.x = hitBox.rendererBounds.x - (hitBox.rect.width/2);
                            hitBoxRectanglePosition.width = (hitBox.rendererBounds.width + hitBox.rect.width) - hitBox.rendererBounds.x;
                        }
                        if (hitBox.followYBounds){
                            hitBoxRectanglePosition.y = hitBox.rendererBounds.y - (hitBox.rect.height/2);
                            hitBoxRectanglePosition.height = (hitBox.rendererBounds.height + hitBox.rect.height) - hitBox.rendererBounds.y;
                        }

                        if (hurtBox.followXBounds){
                            hurtBoxRectanglePosition.x = hurtBox.rendererBounds.x - (hurtBox.rect.width/2);
                            hurtBoxRectanglePosition.width = (hurtBox.rendererBounds.width + hurtBox.rect.width) - hurtBox.rendererBounds.x;
                        }
                        if (hurtBox.followYBounds){
                            hurtBoxRectanglePosition.y = hurtBox.rendererBounds.y - (hurtBox.rect.height/2);
                            hurtBoxRectanglePosition.height = (hurtBox.rendererBounds.height + hurtBox.rect.height) - hurtBox.rendererBounds.y;
                        }

                        if (hurtBoxRectanglePosition.Overlaps(hitBoxRectanglePosition)) collisionConfirm = true;
                    }
                }

                if (collisionConfirm) {
                    if (hitConfirmType == HitConfirmType.Hit) {
                        hitBox.state = 1;
                    }
                    return (hurtBoxPosition + hitBoxPosition)/2;
                }
            }
        }

        foreach (HitBox hitBox in hitBoxes) {
            if (hitBox.state == 1) hitBox.state = 0;
        }
        return Vector3.zero;
    }