protected unsafe override JobHandle OnUpdate(JobHandle inputDeps) { var physicsWorld = m_BuildPhysicsWorldSystem.PhysicsWorld; var time = m_GameTimeSingletonQuery.GetSingleton <GlobalGameTime>().gameTime; var PredictingTick = World.GetExistingSystem <GhostPredictionSystemGroup>().PredictingTick; Entities .WithName("CheckSupportJob") .ForEach(( ref CharacterControllerComponentData ccData, ref CharacterControllerMoveQuery ccQuery, ref CharacterControllerMoveResult resultPosition, ref CharacterControllerVelocity velocity, ref CharacterControllerCollider ccCollider, ref CharacterControllerGroundSupportData ccGroundData, in PredictedGhostComponent predictedGhostComponent) => { if (!GhostPredictionSystemGroup.ShouldPredict(PredictingTick, predictedGhostComponent)) { return; } if (!ccQuery.CheckSupport) { ccGroundData.SupportedState = CharacterControllerUtilities.CharacterSupportState.Unsupported; ccGroundData.SurfaceVelocity = float3.zero; ccGroundData.SurfaceNormal = float3.zero; return; } var stepInput = new CharacterControllerUtilities.CharacterControllerStepInput { World = physicsWorld, DeltaTime = time.tickDuration, Up = math.up(), Gravity = new float3(0.0f, -9.8f, 0.0f), MaxIterations = ccData.MaxIterations, Tau = 0.4f, // CharacterControllerUtilities.k_DefaultTau, Damping = 0.9f, // CharacterControllerUtilities.k_DefaultDamping, SkinWidth = ccData.SkinWidth, ContactTolerance = ccData.ContactTolerance * 2.0f, MaxSlope = ccData.MaxSlope, RigidBodyIndex = -1, CurrentVelocity = velocity.Velocity, MaxMovementSpeed = ccData.MaxMovementSpeed }; var transform = new RigidTransform { pos = resultPosition.MoveResult, rot = quaternion.identity }; var collider = (Unity.Physics.Collider *)ccCollider.Collider.GetUnsafePtr(); // FollowGround can cause the collider to lift further above ground // before entering upwards slopes or exiting downwards slopes. // Halfpipes show the issue the most. // Lengthen the ground probe vector to remove undesired unsupporteds. float probeFactor = ccQuery.FollowGround ? 2 : 1; // Check support CharacterControllerUtilities.CheckSupport( ref physicsWorld, collider, stepInput, transform, out ccGroundData.SupportedState, out ccGroundData.SurfaceNormal, out ccGroundData.SurfaceVelocity); //for (int i = 0; i < constraints.Length; i++) //{ // var constraint = constraints[i]; // DebugDraw.Line(constraint.HitPosition, constraint.HitPosition + constraint.Plane.Normal, constraint.Touched && !constraint.IsTooSteep ? UnityEngine.Color.blue : UnityEngine.Color.red); // DebugDraw.Sphere(constraint.HitPosition, 0.1f, constraint.IsTooSteep ? UnityEngine.Color.blue : UnityEngine.Color.red); // DebugDraw.Circle(constraint.HitPosition, math.up(), 0.2f, constraint.Touched ? UnityEngine.Color.blue : UnityEngine.Color.red); // //DebugDraw.Arrow(constraint.HitPosition, 30f, constraint.Plane.Distance > 0 ? UnityEngine.Color.blue : UnityEngine.Color.red); // //GameDebug.Log($"constraints.dis {constraint.Plane.Distance}"); //} //Unity.Sample.Core.GameDebug.Log($"--- constraints: {numSupportingPlanes}"); //Unity.Sample.Core.GameDebug.Log($"2 groundState.SurfaceVelocity {ccGroundData.SurfaceVelocity}"); }).Run(); return(inputDeps); }
/// <summary> /// 需要unsafe来使用指针 /// </summary> protected unsafe override JobHandle OnUpdate(JobHandle inputDependencies) { var physicsWorld = m_BuildPhysicsWorldSystem.PhysicsWorld; var time = m_GameTimeSingletonQuery.GetSingleton <GlobalGameTime>().gameTime; //var predictingTick = World.GetExistingSystem<GhostPredictionSystemGroup>().PredictingTick; 预测 var constraints = new NativeList <SurfaceConstraintInfo>(Allocator.Temp); //表面约束信息? var castHits = new NativeList <ColliderCastHit>(Allocator.Temp); //射线击中信息? var deltaTime = Time.DeltaTime; Entities .WithName("CheckSupportJob") .ForEach(( ref CharacterControllerComponentData ccData, ref CharacterControllerMoveQuery ccQuery, ref CharacterControllerMoveResult resultPosition, ref CharacterControllerVelocity velocity, ref CharacterControllerCollider ccCollider, ref CharacterControllerGroundSupportData ccGroundData //in PredictedGhostComponent predictedGhostComponent ) => { //if(!GhostPredictionSystemGroup.ShouldPredict(PredictingTick,predictedGhostComponent)) // return; //查询到的信息写入状态信息 if (!ccQuery.CheckSupport) { ccGroundData.SupportedState = CharacterControllerUtilities.CharacterSupportState.Unsupported; ccGroundData.SurfaceVelocity = float3.zero; ccGroundData.SurfaceNormal = float3.zero; } constraints.Clear(); castHits.Clear(); var collider = (Unity.Physics.Collider *)ccCollider.Collider.GetUnsafePtr(); var stepInput = new CharacterControllerUtilities.CharacterControllerStepInput { World = physicsWorld, //DeltaTime = time.tickInterval, DeltaTime = deltaTime, Up = math.up(),//设定角色永远头朝上 Gravity = new float3(0.0f, -9.8f, 0.0f), MaxIterations = ccData.MaxIterations, Tau = CharacterControllerUtilities.k_DefaultTau, Damping = CharacterControllerUtilities.k_DefaultDamping, SkinWidth = ccData.SkinWidth, ContactTolerance = ccData.ContactTolearance * 2.0f, MaxSlope = ccData.MaxSlope, RigidBodyIndex = -1, CurrentVelocity = velocity.WorldVelocity, MaxMovementSpeed = ccData.MaxMovementSpeed }; var transform = new RigidTransform { pos = resultPosition.MoveResult, rot = quaternion.identity }; //FollowGround为了解决上下坡穿入的问题 float probeFactor = ccQuery.FollowGroud ? 2 : 1; CharacterControllerUtilities.CheckSupport( ref physicsWorld, collider, stepInput, ccData.GroundProbeVector * probeFactor, transform, ccData.MaxSlope, ref constraints, ref castHits, out ccGroundData.SupportedState, out ccGroundData.SurfaceNormal, out ccGroundData.SurfaceVelocity); }).Run(); constraints.Dispose(); castHits.Dispose(); return(inputDependencies); }
protected unsafe override JobHandle OnUpdate(JobHandle inputDeps) { var physicsWorld = m_BuildPhysicsWorldSystem.PhysicsWorld; var time = m_GameTimeSingletonQuery.GetSingleton <GlobalGameTime>().gameTime; var PredictingTick = World.GetExistingSystem <GhostPredictionSystemGroup>().PredictingTick; var constraints = new NativeList <SurfaceConstraintInfo>(Allocator.Temp); var castHits = new NativeList <ColliderCastHit>(Allocator.Temp); Entities .WithName("CheckSupportJob") .ForEach(( ref CharacterControllerComponentData ccData, ref CharacterControllerMoveQuery ccQuery, ref CharacterControllerMoveResult resultPosition, ref CharacterControllerVelocity velocity, ref CharacterControllerCollider ccCollider, ref CharacterControllerGroundSupportData ccGroundData, in PredictedGhostComponent predictedGhostComponent) => { if (!GhostPredictionSystemGroup.ShouldPredict(PredictingTick, predictedGhostComponent)) { return; } if (!ccQuery.CheckSupport) { ccGroundData.SupportedState = CharacterControllerUtilities.CharacterSupportState.Unsupported; ccGroundData.SurfaceVelocity = float3.zero; ccGroundData.SurfaceNormal = float3.zero; return; } constraints.Clear(); castHits.Clear(); var collider = (Unity.Physics.Collider *)ccCollider.Collider.GetUnsafePtr(); var stepInput = new CharacterControllerUtilities.CharacterControllerStepInput { World = physicsWorld, DeltaTime = time.tickInterval, Up = math.up(), Gravity = new float3(0.0f, -9.8f, 0.0f), MaxIterations = ccData.MaxIterations, Tau = CharacterControllerUtilities.k_DefaultTau, Damping = CharacterControllerUtilities.k_DefaultDamping, SkinWidth = ccData.SkinWidth, ContactTolerance = ccData.ContactTolerance * 2.0f, MaxSlope = ccData.MaxSlope, RigidBodyIndex = -1, CurrentVelocity = velocity.Velocity, MaxMovementSpeed = ccData.MaxMovementSpeed }; var transform = new RigidTransform { pos = resultPosition.MoveResult, rot = quaternion.identity }; // FollowGround can cause the collider to lift further above ground // before entering upwards slopes or exiting downwards slopes. // Halfpipes show the issue the most. // Lengthen the ground probe vector to remove undesired unsupporteds. float probeFactor = ccQuery.FollowGround ? 2 : 1; // Check support CharacterControllerUtilities.CheckSupport( ref physicsWorld, collider, stepInput, ccData.GroundProbeVector * probeFactor, transform, ccData.MaxSlope, ref constraints, ref castHits, out ccGroundData.SupportedState, out ccGroundData.SurfaceNormal, out ccGroundData.SurfaceVelocity); }).Run(); constraints.Dispose(); castHits.Dispose(); return(inputDeps); }