ok
This commit is contained in:
@@ -15,12 +15,15 @@ public abstract class NetworkHeldInteractable : NetworkInteractable, IWorkstatio
|
|||||||
[SerializeField, Min(0.05f)] private float collisionRefreshInterval = 0.25f;
|
[SerializeField, Min(0.05f)] private float collisionRefreshInterval = 0.25f;
|
||||||
|
|
||||||
[Header("Holding Follow")]
|
[Header("Holding Follow")]
|
||||||
[SerializeField, Min(0.01f)] private float positionSmoothTime = 0.12f;
|
|
||||||
[SerializeField, Min(0.1f)] private float maximumFollowSpeed = 12f;
|
[SerializeField, Min(0.1f)] private float maximumFollowSpeed = 12f;
|
||||||
[SerializeField, Min(0.1f)] private float maximumFollowDistance = 1.25f;
|
|
||||||
[SerializeField, Min(0.5f)] private float maximumHoldDistance = 4.5f;
|
[SerializeField, Min(0.5f)] private float maximumHoldDistance = 4.5f;
|
||||||
[SerializeField, Min(0.1f)] private float rotationFollowSpeed = 14f;
|
[SerializeField, Min(0.1f)] private float rotationFollowSpeed = 14f;
|
||||||
|
|
||||||
|
[Header("Local Presentation")]
|
||||||
|
[Tooltip("Removes the server round-trip delay for the player currently carrying the item.")]
|
||||||
|
[SerializeField] private bool correctLocalHolderPresentation = true;
|
||||||
|
[SerializeField, Min(0.1f)] private float maximumLocalCorrectionDistance = 2f;
|
||||||
|
|
||||||
[Header("Throw")]
|
[Header("Throw")]
|
||||||
[SerializeField, Min(0f)] private float throwForce = 6f;
|
[SerializeField, Min(0f)] private float throwForce = 6f;
|
||||||
[SerializeField, Min(0f)] private float throwUpwardForce = 0.5f;
|
[SerializeField, Min(0f)] private float throwUpwardForce = 0.5f;
|
||||||
@@ -38,6 +41,7 @@ public abstract class NetworkHeldInteractable : NetworkInteractable, IWorkstatio
|
|||||||
private readonly HashSet<Collider> ignoredPlayerColliders = new();
|
private readonly HashSet<Collider> ignoredPlayerColliders = new();
|
||||||
private readonly HashSet<Collider> desiredIgnoredColliders = new();
|
private readonly HashSet<Collider> desiredIgnoredColliders = new();
|
||||||
private readonly List<Collider> collidersToRestore = new();
|
private readonly List<Collider> collidersToRestore = new();
|
||||||
|
private readonly RaycastHit[] localCorrectionHits = new RaycastHit[24];
|
||||||
private float nextCollisionRefreshTime;
|
private float nextCollisionRefreshTime;
|
||||||
private bool initialUseGravity;
|
private bool initialUseGravity;
|
||||||
private CollisionDetectionMode initialCollisionDetectionMode;
|
private CollisionDetectionMode initialCollisionDetectionMode;
|
||||||
@@ -125,6 +129,28 @@ public abstract class NetworkHeldInteractable : NetworkInteractable, IWorkstatio
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void LateUpdate()
|
||||||
|
{
|
||||||
|
if (!correctLocalHolderPresentation || IsServer || !IsSpawned ||
|
||||||
|
!IsHeldByLocalPlayer || IsExternallyControlled || physicsBody == null ||
|
||||||
|
!TryGetPlayerObject(holderClientId.Value, out NetworkObject holder))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Transform anchor = ResolveHoldingAnchor(holder);
|
||||||
|
Vector3 targetPosition = anchor.TransformPoint(HoldingOffset);
|
||||||
|
Vector3 targetDelta = targetPosition - physicsBody.position;
|
||||||
|
if (targetDelta.sqrMagnitude >
|
||||||
|
maximumLocalCorrectionDistance * maximumLocalCorrectionDistance ||
|
||||||
|
HasBlockingColliderForLocalCorrection(targetDelta))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
transform.SetPositionAndRotation(targetPosition, anchor.rotation);
|
||||||
|
}
|
||||||
|
|
||||||
public void RequestThrow()
|
public void RequestThrow()
|
||||||
{
|
{
|
||||||
if (IsSpawned && IsHeldByLocalPlayer)
|
if (IsSpawned && IsHeldByLocalPlayer)
|
||||||
@@ -266,17 +292,10 @@ public abstract class NetworkHeldInteractable : NetworkInteractable, IWorkstatio
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
float distance = targetDelta.magnitude;
|
Vector3 targetVelocity = targetDelta / Mathf.Max(Time.fixedDeltaTime, 0.001f);
|
||||||
float speedDistance = Mathf.Max(maximumFollowDistance, 0.01f);
|
physicsBody.linearVelocity = Vector3.ClampMagnitude(
|
||||||
float desiredSpeed = maximumFollowSpeed * Mathf.Clamp01(distance / speedDistance);
|
targetVelocity,
|
||||||
Vector3 desiredVelocity = distance > 0.0001f
|
maximumFollowSpeed);
|
||||||
? targetDelta / distance * desiredSpeed
|
|
||||||
: Vector3.zero;
|
|
||||||
float maximumAcceleration = maximumFollowSpeed / Mathf.Max(positionSmoothTime, 0.01f);
|
|
||||||
Vector3 velocityChange = Vector3.ClampMagnitude(
|
|
||||||
desiredVelocity - physicsBody.linearVelocity,
|
|
||||||
maximumAcceleration * Time.fixedDeltaTime);
|
|
||||||
physicsBody.AddForce(velocityChange, ForceMode.VelocityChange);
|
|
||||||
|
|
||||||
DriveRotation(anchor.rotation);
|
DriveRotation(anchor.rotation);
|
||||||
return true;
|
return true;
|
||||||
@@ -292,15 +311,52 @@ public abstract class NetworkHeldInteractable : NetworkInteractable, IWorkstatio
|
|||||||
if (angle > 180f)
|
if (angle > 180f)
|
||||||
angle -= 360f;
|
angle -= 360f;
|
||||||
|
|
||||||
Vector3 desiredAngularVelocity = axis.normalized *
|
Vector3 targetAngularVelocity = axis.normalized *
|
||||||
(angle * Mathf.Deg2Rad * rotationFollowSpeed);
|
(angle * Mathf.Deg2Rad / Mathf.Max(Time.fixedDeltaTime, 0.001f));
|
||||||
desiredAngularVelocity = Vector3.ClampMagnitude(
|
physicsBody.angularVelocity = Vector3.ClampMagnitude(
|
||||||
desiredAngularVelocity,
|
targetAngularVelocity,
|
||||||
rotationFollowSpeed);
|
rotationFollowSpeed);
|
||||||
Vector3 angularVelocityChange = Vector3.ClampMagnitude(
|
}
|
||||||
desiredAngularVelocity - physicsBody.angularVelocity,
|
|
||||||
rotationFollowSpeed * 4f * Time.fixedDeltaTime);
|
private bool HasBlockingColliderForLocalCorrection(Vector3 targetDelta)
|
||||||
physicsBody.AddTorque(angularVelocityChange, ForceMode.VelocityChange);
|
{
|
||||||
|
float distance = targetDelta.magnitude;
|
||||||
|
if (distance <= 0.0001f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int hitCount = Physics.RaycastNonAlloc(
|
||||||
|
physicsBody.position,
|
||||||
|
targetDelta / distance,
|
||||||
|
localCorrectionHits,
|
||||||
|
distance,
|
||||||
|
~0,
|
||||||
|
QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
for (int hitIndex = 0; hitIndex < hitCount; hitIndex++)
|
||||||
|
{
|
||||||
|
Collider hitCollider = localCorrectionHits[hitIndex].collider;
|
||||||
|
if (hitCollider == null ||
|
||||||
|
ignoredPlayerColliders.Contains(hitCollider) ||
|
||||||
|
IsObjectCollider(hitCollider))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsObjectCollider(Collider candidate)
|
||||||
|
{
|
||||||
|
foreach (Collider objectCollider in objectColliders)
|
||||||
|
{
|
||||||
|
if (objectCollider == candidate)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleHolderChanged(ulong _, ulong __) => ApplyHoldingState();
|
private void HandleHolderChanged(ulong _, ulong __) => ApplyHoldingState();
|
||||||
|
|||||||
@@ -341314,7 +341314,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 2055952141}
|
objectReference: {fileID: 2055952141}
|
||||||
- target: {fileID: 1187608763751665767, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
|
- target: {fileID: 1187608763751665767, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
|
||||||
propertyPath: m_VersionIndex
|
propertyPath: m_VersionIndex
|
||||||
value: 1189
|
value: 1192
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 2057801181638564846, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
|
- target: {fileID: 2057801181638564846, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
|
||||||
propertyPath: m_Mesh
|
propertyPath: m_Mesh
|
||||||
@@ -363686,7 +363686,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 1230761045}
|
objectReference: {fileID: 1230761045}
|
||||||
- target: {fileID: 5333406013407316476, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
|
- target: {fileID: 5333406013407316476, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
|
||||||
propertyPath: m_VersionIndex
|
propertyPath: m_VersionIndex
|
||||||
value: 3432
|
value: 3435
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 5521966715159789732, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
|
- target: {fileID: 5521966715159789732, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
|
|||||||
Reference in New Issue
Block a user