public void Spherecast(Ray ray, float radius, float distance) { var hits = TimePhysics.SphereCastNonAlloc(ray, radius, HitsCache, distance); for (int i = 0; i < hits; i++) { var marker = HitsCache[i].collider.GetComponent <HitboxMarkerDebug>(); if (marker != null && TimePhysics.DebugMode) { ShooterDebug?.DebugHitRewind(marker, 1f); } HitCount++; } }
//example usage snippet /* * private void Shoot(Ray ray) * { * using (TimePhysics.RewindSeconds(Ping)) * { * RaycastHit hit; * if (TimePhysics.Raycast(ray, out hit)) * { * // hit code * } * } * } */ public void Shoot(Ray ray, float distance) { RaycastHit hit; if (TimePhysics.Raycast(ray, out hit, distance)) { var marker = hit.collider.GetComponent <HitboxMarkerDebug>(); if (marker != null && TimePhysics.DebugMode) { ShooterDebug?.DebugHitRewind(marker, 2f); } HitCount++; } }
public void AOE(Vector3 origin, float radius, float distance) { var hits = TimePhysics.OverlapSphereNonAlloc(origin, radius, ColliderCache); for (int i = 0; i < hits; i++) { var marker = ColliderCache[i].GetComponent <HitboxMarkerDebug>(); if (marker != null && TimePhysics.DebugMode) { ShooterDebug?.DebugHitRewind(marker, 1f); } HitCount++; } }
private void Fire() { //convert ping to float seconds var ping = (BasePingMs + Random.Range(0, PingRandomMs)) / 1000f; using (TimePhysics.RewindSeconds(ping, HitboxBody)) { Ray ray = new Ray(RayOrigin.transform.position, RayOrigin.transform.forward * ShootDistance); RaycastHit hit; Debug.DrawRay(ray.origin, ray.direction, ShotColor); if (TimePhysics.SphereCast(ray, SphereRadius, out hit, ShootDistance)) { var marker = hit.collider.GetComponent <HitboxMarkerDebug>(); if (marker != null && TimePhysics.DebugMode) { ShooterDebug?.DebugHitRewind(marker, 2f); } } } }
private void ExecuteCommand(Command cmd) { if (!cmd.Rewind) // don't rewind if we don't have to { return; } var ping = Random.Range(Ping - PingJitter, Ping + PingJitter); Profiler.BeginSample("Rewind & Cast"); using (TimePhysics.RewindSeconds(ping)) // or using (TimePhysics.RewindFrames(FrameDelay)) { //perform all raycasts for this rewindframe within the 'using' block if (cmd.Primary) { //Shoot(cmd.Ray, Distance); Spherecast(cmd.Ray, .25f, Distance); } if (cmd.Secondary) { AOE(cmd.Ray.origin, 10f, Distance); } } Profiler.EndSample(); }