Disable collisions on teleport / spawn

This commit is contained in:
Ricardo Lopes 2020-03-15 11:08:11 +01:00
parent 084767d1dd
commit c777943664
3 changed files with 50 additions and 10 deletions

View File

@ -31,7 +31,7 @@ namespace QSB.TransformSync
var body = Instantiate(GetPlayerModel());
GetComponent<AnimationSync>().InitRemote(body);
var physicsBody = new GameObject();
var physicsBody = new GameObject("PlayerBodySync");
var collider = physicsBody.AddComponent<CapsuleCollider>();
collider.radius = 1;
@ -40,6 +40,7 @@ namespace QSB.TransformSync
var rigidBodySync = physicsBody.AddComponent<RigidbodySync>();
rigidBodySync.target = body;
rigidBodySync.localColliderType = typeof(PlayerBody);
//var capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule).transform;
//capsule.parent = rigidBodySync.transform;

View File

@ -9,22 +9,27 @@ namespace QSB.TransformSync
class RigidbodySync : MonoBehaviour
{
public Transform target;
public Type localColliderType;
private Rigidbody _rigidbody;
private Collider _collider;
private Vector3 _prevPosition;
private const float _collisionDisableMovementThreshold = 250;
void Awake()
{
_collider = GetComponent<Collider>();
_collider.isTrigger = true;
}
void Start()
{
gameObject.AddComponent<OWRigidbody>();
_rigidbody = gameObject.GetComponent<Rigidbody>();
if (_rigidbody == null)
{
DebugLog.Screen("Could not add rigidbody");
}
else
{
DebugLog.Screen("Could yes add rigidbody");
}
_rigidbody.useGravity = false;
_rigidbody.isKinematic = true;
_prevPosition = transform.position;
InvokeRepeating(nameof(TryEnableCollisions), 1, 1);
}
void FixedUpdate()
@ -32,5 +37,38 @@ namespace QSB.TransformSync
_rigidbody.MovePosition(target.position);
_rigidbody.MoveRotation(target.rotation);
}
void TryEnableCollisions()
{
if (!_collider.isTrigger)
{
return;
}
var colliders = Physics.OverlapSphere(transform.position, 2);
foreach (var collider in colliders)
{
if (collider.gameObject == gameObject)
{
continue;
}
if (collider.GetComponentInParent(localColliderType) || collider.GetComponent<RigidbodySync>())
{
DebugLog.All("Occupied by", collider.name);
return;
}
}
DebugLog.All("Enable collisions for", gameObject.name);
_collider.isTrigger = false;
}
void Update()
{
if (!_collider.isTrigger && (_prevPosition - transform.position).sqrMagnitude > _collisionDisableMovementThreshold)
{
DebugLog.All("Disable collisions for", gameObject.name);
_collider.isTrigger = true;
}
_prevPosition = transform.position;
}
}
}

View File

@ -41,7 +41,7 @@ namespace QSB.TransformSync
= landingGearRight.localPosition
+= Vector3.up * 3.762f;
var physicsBody = new GameObject();
var physicsBody = new GameObject("ShipBodySync");
var collider = physicsBody.AddComponent<SphereCollider>();
collider.radius = 5;
@ -49,6 +49,7 @@ namespace QSB.TransformSync
var rigidBodySync = physicsBody.AddComponent<RigidbodySync>();
rigidBodySync.target = remoteTransform;
rigidBodySync.localColliderType = typeof(ShipBody);
//var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform;
//sphere.parent = rigidBodySync.transform;