Пример #1
0
 private void Initialize()
 {
     if (!character)
     {
         character = GameObject.Find("Character");
     }
     if (!boxCollider)
     {
         boxCollider = GetComponent <BoxCollider2D>();
     }
     if (SettingsIsNull)
     {
         settings = CreateInstance <RaycastSettings>();
     }
     if (InitializePlatformerController)
     {
         platformerController = GetComponent <PlatformerController>();
     }
     if (InitializeLayerMaskController)
     {
         layerMaskController = GetComponent <LayerMaskController>();
     }
     if (InitializePhysicsController)
     {
         physicsController = GetComponent <PhysicsController>();
     }
     if (DataIsNull)
     {
         Data = CreateInstance <RaycastData>();
     }
     Data.OnInitialize(ref boxCollider, ref character, settings);
 }
Пример #2
0
    private bool DoRaycasts(Vector2 aDirection, RaycastSettings aRaycastSettings, EAxisIndex aAxisIndex)
    {
        int     axisIndex         = (int)aAxisIndex;
        float   distanceThisFrame = mVelocity[axisIndex] * Time.fixedDeltaTime;
        float   offset            = mBoxCollider.size[1 - axisIndex] * 0.5f - aRaycastSettings.raycastMargin;
        Vector3 offsetVector0     = Vector3.zero;
        Vector3 offsetVector1     = Vector3.zero;

        offsetVector0[1 - axisIndex] = -offset;
        offsetVector1[1 - axisIndex] = offset;
        Vector3 start = transform.position + offsetVector0;
        Vector3 end   = transform.position + offsetVector1;
        float   absDistanceThisFrame = Mathf.Abs(distanceThisFrame);
        float   distanceToMove       = absDistanceThisFrame;
        float   rayLength            = mBoxCollider.size[axisIndex] * 0.5f + absDistanceThisFrame;
        Vector3 rayDirection         = aDirection.ToVec3() * Mathf.Sign(distanceThisFrame);
        bool    hit = false;

        for (int i = 0; i < aRaycastSettings.numberOfRaycasts; ++i)
        {
            Vector3    rayOrigin = Vector3.Lerp(start, end, i / (aRaycastSettings.numberOfRaycasts - 1.0f));
            Ray        ray       = new Ray(rayOrigin, rayDirection);
            RaycastHit hitInfo;
            if (UnityEngine.Physics.Raycast(ray, out hitInfo, rayLength, mCollisionMask))
            {
                float distance = Mathf.Abs(start[axisIndex] - hitInfo.point[axisIndex]) - (mBoxCollider.size[axisIndex] * 0.5f);
                if (distance < distanceToMove)
                {
                    hit                  = true;
                    distanceToMove       = distance;
                    mVelocity[axisIndex] = -mVelocity[axisIndex] * mPhysics.bounciness;
                    if (mVelocity[axisIndex] > 0.0f)
                    {
                        mVelocity[axisIndex] = Mathf.Max(mVelocity[axisIndex] - STATIONARY_VELOCITY_EPSILON, 0.0f);
                    }
                    if (mVelocity[axisIndex] < 0.0f)
                    {
                        mVelocity[axisIndex] = Mathf.Min(mVelocity[axisIndex] + STATIONARY_VELOCITY_EPSILON, 0.0f);
                    }
                }
            }
        }
        transform.position += rayDirection * distanceToMove;
        return(hit);
    }
Пример #3
0
 private void Start()
 {
     _layersToAvoid   = Registry.ProjectSettings.globalSettings.layersToAvoid;
     _raycastSettings = Registry.ProjectSettings._raycastSettings;
 }