public bool CastSphere(Vector3 origin, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = Physics3D.DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal) { return(_world.SphereCast(origin, radius, direction, out hitInfo, maxDistance, layerMask, queryTriggerInteraction)); }
protected override void OnSimulate(float dt) { checkCode += dt; transform.position += _velocity * dt; if (m_HasTrajectoryOverride && _consumedTrajectoryCorrectionVector.sqrMagnitude < _trajectoryCorrectionVector.sqrMagnitude) { var correctionLeft = _trajectoryCorrectionVector - _consumedTrajectoryCorrectionVector; float distanceThisFrame = (transform.position - m_LastRootPosition).magnitude; Vector3 correctionThisFrame = (distanceThisFrame / trajectoryCorrectionDistance) * _trajectoryCorrectionVector; correctionThisFrame = Vector3.ClampMagnitude(correctionThisFrame, correctionLeft.magnitude); // if (!IsServer) // Debug.Log($"{(float3) correctionThisFrame},{(float3) correctionLeft} {correctionLeft.magnitude}"); _consumedTrajectoryCorrectionVector += correctionThisFrame; if (_consumedTrajectoryCorrectionVector.sqrMagnitude == _trajectoryCorrectionVector.sqrMagnitude) { m_HasTrajectoryOverride = false; } transform.position += correctionThisFrame; } else { if (!this.IsServer) { GetComponent <MeshRenderer>().enabled = true; } } // Orient towards velocity transform.forward = _velocity.normalized; // add gravity to the projectile velocity for ballistic effect _velocity += Vector3.down * 10f * dt; // 碰撞检测 Vector3 displacementSinceLastFrame = transform.position - m_LastRootPosition; RaycastHit[] result = new RaycastHit[1]; int len = _physicsScene.SphereCast(m_LastRootPosition, 0.1f, displacementSinceLastFrame.normalized, result, displacementSinceLastFrame.magnitude, Physics.AllLayers, QueryTriggerInteraction.Ignore); if (len > 0) { // uint tick = World.GetExistingSystem<GhostPredictionSystemGroup>().PredictingTick; // if (this.IsServer) // { // NetDebug.SLog( // $"{tick} 击中物体:{result[0].collider.name} {(float3) result[0].point} {(float3) transform.position} {math.lengthsq((float3) result[0].point)} {checkCode}"); // } // else // { // NetDebug.CLog( // $"{tick} 击中物体:{result[0].collider.name} {(float3) result[0].point} {(float3) transform.position} {math.lengthsq((float3) result[0].point)} {checkCode}"); // } OnHit(result[0].collider, result[0].point, result[0].normal); } m_LastRootPosition = transform.position; }