physics wip

This commit is contained in:
2015-07-07 20:00:18 +06:00
parent ba3448a39b
commit 7342b70d82
20 changed files with 363 additions and 154 deletions

View File

@@ -33,18 +33,23 @@ namespace IsoTools {
}
}
Collider _realCollider = null;
GameObject _isoFakeCollider = null;
public GameObject IsoFakeCollider {
get { return _isoFakeCollider; }
}
public Collider RealCollider {
get { return _realCollider; }
get { return IsoFakeCollider ? IsoFakeCollider.GetComponent<Collider>() : null; }
}
void Awake() {
var helper = IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject);
_realCollider = CreateCollider(helper.IsoFakeObject);
if ( _realCollider ) {
_realCollider.material = Material;
_realCollider.isTrigger = IsTrigger;
}
_isoFakeCollider = new GameObject();
_isoFakeCollider.transform.SetParent(
IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject).IsoFakeObject.transform, false);
_isoFakeCollider.AddComponent<IsoFakeCollider>().Init(this);
var real_collider = CreateCollider(_isoFakeCollider);
real_collider.material = Material;
real_collider.isTrigger = IsTrigger;
}
void OnEnable() {
@@ -60,9 +65,9 @@ namespace IsoTools {
}
void OnDestroy() {
if ( _realCollider ) {
Destroy(_realCollider);
_realCollider = null;
if ( _isoFakeCollider ) {
Destroy(_isoFakeCollider);
_isoFakeCollider = null;
}
}

View File

@@ -0,0 +1,26 @@
using UnityEngine;
namespace IsoTools {
public class IsoCollision {
public IsoCollider Collider { get; private set; }
public IsoContactPoint[] Contacts { get; private set; }
public GameObject GameObject { get; private set; }
public Vector3 RelativeVelocity { get; private set; }
public IsoRigidbody IsoRigidbody { get; private set; }
public IsoCollision(
IsoCollider collider,
IsoContactPoint[] contacts,
GameObject game_object,
Vector3 relative_velocity,
IsoRigidbody iso_rigidbody)
{
Collider = collider;
Contacts = contacts;
GameObject = game_object;
RelativeVelocity = relative_velocity;
IsoRigidbody = iso_rigidbody;
}
}
} // namespace IsoTools

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 6a0c6ad7ad6d84258be23c24fad58b84
timeCreated: 1436119603
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,23 @@
using UnityEngine;
namespace IsoTools {
public class IsoContactPoint {
public Vector3 Normal { get; private set; }
public IsoCollider OtherIsoCollider { get; private set; }
public Vector3 Point { get; private set; }
public IsoCollider ThisIsoCollider { get; private set; }
public IsoContactPoint(
Vector3 normal,
IsoCollider other_iso_collider,
Vector3 point,
IsoCollider this_iso_collider)
{
Normal = normal;
OtherIsoCollider = other_iso_collider;
Point = point;
ThisIsoCollider = this_iso_collider;
}
}
} // namespace IsoTools

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 121a2248ec18d4aa4be6bec03265e86e
timeCreated: 1436119761
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,16 @@
using UnityEngine;
namespace IsoTools {
public class IsoFakeCollider : MonoBehaviour {
IsoCollider _isoCollider = null;
public void Init(IsoCollider iso_collider) {
_isoCollider = iso_collider;
}
public IsoCollider IsoCollider {
get { return _isoCollider; }
}
}
} // namespace IsoTools

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: e6013de6edf894f15b4b45e011afe2a4
timeCreated: 1436271657
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,4 +1,6 @@
using UnityEngine;
using System.Linq;
using System.Collections.Generic;
namespace IsoTools {
public class IsoFakeObject : MonoBehaviour {
@@ -16,6 +18,48 @@ namespace IsoTools {
get { return _isoObject; }
}
IsoCollider ConvertCollider(Collider collider) {
var fake_collider = collider.GetComponent<IsoFakeCollider>();
return fake_collider ? fake_collider.IsoCollider : null;
}
IsoRigidbody ConvertRigidbody(Rigidbody rigidbody) {
var fake_object = rigidbody.GetComponent<IsoFakeObject>();
var iso_object = fake_object ? fake_object.IsoObject : null;
return iso_object ? iso_object.GetComponent<IsoRigidbody>() : null;
}
GameObject ConvertGameObject(GameObject game_object) {
var fake_object = game_object.GetComponent<IsoFakeObject>();
var iso_object = fake_object ? fake_object.IsoObject : null;
return iso_object ? iso_object.gameObject : null;
}
IsoContactPoint ConvertContactPoint(ContactPoint contact_point) {
return new IsoContactPoint(
contact_point.normal,
ConvertCollider(contact_point.otherCollider),
contact_point.point,
ConvertCollider(contact_point.thisCollider));
}
IsoContactPoint[] ConvertContactPoints(ContactPoint[] points) {
var iso_points = new IsoContactPoint[points.Length];
for ( var i = 0; i < points.Length; ++i ) {
iso_points[i] = ConvertContactPoint(points[i]);
}
return iso_points;
}
IsoCollision ConvertCollision(Collision collision) {
return new IsoCollision(
ConvertCollider(collision.collider),
ConvertContactPoints(collision.contacts),
ConvertGameObject(collision.gameObject),
collision.relativeVelocity,
ConvertRigidbody(collision.rigidbody));
}
void FixedUpdate() {
if ( !IsoUtils.Vec3Approximately(_lastPosition, IsoObject.Position) ) {
transform.position = IsoObject.Position;
@@ -26,27 +70,27 @@ namespace IsoTools {
}
void OnTriggerEnter(Collider collider) {
Debug.LogFormat("OnTriggerEnter: {0}-{1}", gameObject.name, collider.gameObject.name);
var iso_collider = ConvertCollider(collider);
IsoObject.gameObject.SendMessage(
"OnIsoTriggerEnter", iso_collider, SendMessageOptions.DontRequireReceiver);
}
void OnTriggerExit(Collider collider) {
Debug.LogFormat("OnTriggerExit: {0}-{1}", gameObject.name, collider.gameObject.name);
}
void OnTriggerStay(Collider collider) {
Debug.LogFormat("OnTriggerStay: {0}-{1}", gameObject.name, collider.gameObject.name);
var iso_collider = ConvertCollider(collider);
IsoObject.gameObject.SendMessage(
"OnIsoTriggerExit", iso_collider, SendMessageOptions.DontRequireReceiver);
}
void OnCollisionEnter(Collision collision) {
Debug.LogFormat("OnCollisionEnter: {0}-{1}", gameObject.name, collision.gameObject.name);
var iso_collision = ConvertCollision(collision);
IsoObject.gameObject.SendMessage(
"OnIsoCollisionEnter", iso_collision, SendMessageOptions.DontRequireReceiver);
}
void OnCollisionExit(Collision collision) {
Debug.LogFormat("OnCollisionExit: {0}-{1}", gameObject.name, collision.gameObject.name);
}
void OnCollisionStay(Collision collision) {
Debug.LogFormat("OnCollisionStay: {0}-{1}", gameObject.name, collision.gameObject.name);
var iso_collision = ConvertCollision(collision);
IsoObject.gameObject.SendMessage(
"OnIsoCollisionExit", iso_collision, SendMessageOptions.DontRequireReceiver);
}
}
} // namespace IsoTools

View File

@@ -6,6 +6,7 @@ using UnityEditor;
namespace IsoTools {
[ExecuteInEditMode]
[DisallowMultipleComponent]
public class IsoObject : MonoBehaviour {
// ------------------------------------------------------------------------

View File

@@ -1,6 +1,7 @@
using UnityEngine;
namespace IsoTools {
[DisallowMultipleComponent]
[RequireComponent(typeof(IsoObject))]
public class IsoPhysicHelper : MonoBehaviour {

View File

@@ -5,6 +5,7 @@ using UnityEditor;
#endif
namespace IsoTools {
[DisallowMultipleComponent]
[RequireComponent(typeof(IsoObject))]
public class IsoRigidbody : MonoBehaviour {

View File

@@ -8,6 +8,7 @@ using UnityEditor;
namespace IsoTools {
[ExecuteInEditMode]
[DisallowMultipleComponent]
public class IsoWorld : MonoBehaviour {
class ObjectInfo {