GQ_Communicate/GQ_TongXin/Assets/Obi/Scripts/Collisions/ObiRigidbody.cs

81 lines
1.7 KiB
C#

using UnityEngine;
using System;
using System.Collections;
namespace Obi{
/**
* Small helper class that lets you specify Obi-only properties for rigidbodies.
*/
[ExecuteInEditMode]
[RequireComponent(typeof(Rigidbody))]
public class ObiRigidbody : MonoBehaviour
{
public bool kinematicForParticles = false;
private IntPtr oniRigidbody = IntPtr.Zero;
private Rigidbody unityRigidbody;
private bool dirty = true;
private Oni.Rigidbody adaptor = new Oni.Rigidbody();
private Oni.RigidbodyVelocities oniVelocities = new Oni.RigidbodyVelocities();
private Vector3 velocity, angularVelocity;
public IntPtr OniRigidbody {
get{return oniRigidbody;}
}
public void Awake(){
unityRigidbody = GetComponent<Rigidbody>();
oniRigidbody = Oni.CreateRigidbody();
UpdateIfNeeded();
}
public void OnDestroy(){
Oni.DestroyRigidbody(oniRigidbody);
oniRigidbody = IntPtr.Zero;
}
public void UpdateIfNeeded(){
if (dirty){
velocity = unityRigidbody.velocity;
angularVelocity = unityRigidbody.angularVelocity;
adaptor.Set(unityRigidbody,kinematicForParticles);
Oni.UpdateRigidbody(oniRigidbody,ref adaptor);
dirty = false;
}
}
/**
* Reads velocities back from the solver.
*/
public void UpdateVelocities(){
if (!dirty){
// kinematic rigidbodies are passed to Obi with zero velocity, so we must ignore the new velocities calculated by the solver:
if (unityRigidbody.isKinematic || !kinematicForParticles){
Oni.GetRigidbodyVelocity(oniRigidbody,ref oniVelocities);
unityRigidbody.velocity += oniVelocities.linearVelocity - velocity;
unityRigidbody.angularVelocity += oniVelocities.angularVelocity - angularVelocity;
}
dirty = true;
}
}
}
}