Esempio n. 1
0
        void UpdateEdgeInfo(ref CollisionInfo collisionInfo, Vector3 position, HitInfoFilter hitInfoFilter)
        {
            Vector3 center = characterActor.GetBottomCenter(position, characterActor.StepOffset);

            Vector3 castDirection    = (collisionInfo.hitInfo.point - center).normalized;
            Vector3 castDisplacement = castDirection * CharacterConstants.EdgeRaysCastDistance;

            Vector3 upperHitPosition = center + characterActor.Up * CharacterConstants.EdgeRaysSeparation;
            Vector3 lowerHitPosition = center - characterActor.Up * CharacterConstants.EdgeRaysSeparation;

            HitInfo upperHitInfo;

            physicsComponent.Raycast(
                out upperHitInfo,
                upperHitPosition,
                castDisplacement,
                hitInfoFilter
                );


            HitInfo lowerHitInfo;

            physicsComponent.Raycast(
                out lowerHitInfo,
                lowerHitPosition,
                castDisplacement,
                hitInfoFilter
                );


            collisionInfo.edgeUpperNormal = upperHitInfo.normal;
            collisionInfo.edgeLowerNormal = lowerHitInfo.normal;

            collisionInfo.edgeUpperSlopeAngle = Vector3.Angle(collisionInfo.edgeUpperNormal, characterActor.Up);
            collisionInfo.edgeLowerSlopeAngle = Vector3.Angle(collisionInfo.edgeLowerNormal, characterActor.Up);

            collisionInfo.edgeAngle = Vector3.Angle(collisionInfo.edgeUpperNormal, collisionInfo.edgeLowerNormal);

            collisionInfo.isAnEdge = CustomUtilities.isBetween(collisionInfo.edgeAngle, CharacterConstants.MinEdgeAngle, CharacterConstants.MaxEdgeAngle, true);
            collisionInfo.isAStep  = CustomUtilities.isBetween(collisionInfo.edgeAngle, CharacterConstants.MinStepAngle, CharacterConstants.MaxStepAngle, true);
        }