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); }
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); }
private void Start() { _layersToAvoid = Registry.ProjectSettings.globalSettings.layersToAvoid; _raycastSettings = Registry.ProjectSettings._raycastSettings; }