mirror of
https://github.com/BlackMATov/unity-iso-tools.git
synced 2025-12-16 22:16:55 +07:00
physics wip
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
26
Assets/IsoTools/Scripts/IsoCollision.cs
Normal file
26
Assets/IsoTools/Scripts/IsoCollision.cs
Normal 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
|
||||
12
Assets/IsoTools/Scripts/IsoCollision.cs.meta
Normal file
12
Assets/IsoTools/Scripts/IsoCollision.cs.meta
Normal 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:
|
||||
23
Assets/IsoTools/Scripts/IsoContactPoint.cs
Normal file
23
Assets/IsoTools/Scripts/IsoContactPoint.cs
Normal 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
|
||||
12
Assets/IsoTools/Scripts/IsoContactPoint.cs.meta
Normal file
12
Assets/IsoTools/Scripts/IsoContactPoint.cs.meta
Normal 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:
|
||||
16
Assets/IsoTools/Scripts/IsoFakeCollider.cs
Normal file
16
Assets/IsoTools/Scripts/IsoFakeCollider.cs
Normal 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
|
||||
12
Assets/IsoTools/Scripts/IsoFakeCollider.cs.meta
Normal file
12
Assets/IsoTools/Scripts/IsoFakeCollider.cs.meta
Normal 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:
|
||||
@@ -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
|
||||
@@ -6,6 +6,7 @@ using UnityEditor;
|
||||
|
||||
namespace IsoTools {
|
||||
[ExecuteInEditMode]
|
||||
[DisallowMultipleComponent]
|
||||
public class IsoObject : MonoBehaviour {
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace IsoTools {
|
||||
[DisallowMultipleComponent]
|
||||
[RequireComponent(typeof(IsoObject))]
|
||||
public class IsoPhysicHelper : MonoBehaviour {
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace IsoTools {
|
||||
[DisallowMultipleComponent]
|
||||
[RequireComponent(typeof(IsoObject))]
|
||||
public class IsoRigidbody : MonoBehaviour {
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ using UnityEditor;
|
||||
|
||||
namespace IsoTools {
|
||||
[ExecuteInEditMode]
|
||||
[DisallowMultipleComponent]
|
||||
public class IsoWorld : MonoBehaviour {
|
||||
|
||||
class ObjectInfo {
|
||||
|
||||
Reference in New Issue
Block a user