physics wip

This commit is contained in:
2015-07-09 00:59:21 +06:00
parent 1b7a7e115c
commit d26c7e4a12
17 changed files with 394 additions and 102 deletions

View File

@@ -56,8 +56,10 @@
<Compile Include="Assets\IsoTools\Scripts\IsoContactPoint.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoFakeCollider.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoFakeObject.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoFakeRigidbody.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoObject.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoPhysicHelper.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoRaycastHit.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoRigidbody.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoSphereCollider.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoUtils.cs" />

View File

@@ -56,8 +56,10 @@
<Compile Include="Assets\IsoTools\Scripts\IsoContactPoint.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoFakeCollider.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoFakeObject.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoFakeRigidbody.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoObject.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoPhysicHelper.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoRaycastHit.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoRigidbody.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoSphereCollider.cs" />
<Compile Include="Assets\IsoTools\Scripts\IsoUtils.cs" />

View File

@@ -368,3 +368,14 @@ MonoBehaviour:
_isTrigger: 0
_size: {x: 1, y: 1, z: 1}
_offset: {x: .5, y: .5, z: .5}
--- !u!114 &1846453516
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1846453513}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 449e21ec66627fb49a67d615cd9d240a, type: 3}
m_Name:
m_EditorClassIdentifier:

View File

@@ -7,7 +7,7 @@ namespace IsoTools { namespace Examples {
var iso_object = GetComponent<IsoObject>();
var iso_rigidbody = GetComponent<IsoRigidbody>();
if ( iso_rigidbody ) {
iso_rigidbody.RealRigidbody.velocity = dir;
iso_rigidbody.Velocity = dir;
} else if ( iso_object) {
iso_object.Position += dir * Time.deltaTime;
}

View File

@@ -9,6 +9,18 @@ namespace IsoTools {
public abstract class IsoCollider : MonoBehaviour {
protected abstract Collider CreateRealCollider(GameObject target);
Collider _realCollider = null;
protected Collider RealCollider {
get { return _realCollider; }
}
protected GameObject IsoFakeObject {
get {
var helper = IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject);
return helper ? helper.IsoFakeObject : null;
}
}
[SerializeField]
public PhysicMaterial _material = null;
public PhysicMaterial Material {
@@ -33,15 +45,40 @@ namespace IsoTools {
}
}
Collider _realCollider = null;
public Collider RealCollider {
get { return _realCollider; }
public IsoRigidbody AttachedRigidbody {
get {
return RealCollider
? IsoUtils.IsoConvertRigidbody(RealCollider.attachedRigidbody)
: null;
}
}
public Bounds Bounds {
get {
return RealCollider
? RealCollider.bounds
: new Bounds();
}
}
public Vector3 ClosestPointOnBounds(Vector3 position) {
return RealCollider
? RealCollider.ClosestPointOnBounds(position)
: Vector3.zero;
}
public bool Raycast(Ray ray, out IsoRaycastHit iso_hit_info, float max_distance) {
RaycastHit hit_info;
var result = RealCollider
? RealCollider.Raycast(ray, out hit_info, max_distance)
: false;
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
void Awake() {
var fake_collider_go = new GameObject();
fake_collider_go.transform.SetParent(
IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject).IsoFakeObject.transform, false);
fake_collider_go.transform.SetParent(IsoFakeObject.transform, false);
fake_collider_go.AddComponent<IsoFakeCollider>().Init(this);
_realCollider = CreateRealCollider(fake_collider_go);
_realCollider.material = Material;
@@ -75,10 +112,8 @@ namespace IsoTools {
}
protected virtual void OnValidate() {
if ( RealCollider ) {
RealCollider.material = Material;
RealCollider.isTrigger = IsTrigger;
}
Material = _material;
IsTrigger = _isTrigger;
}
#endif
}

View File

@@ -3,24 +3,18 @@
namespace IsoTools {
public class IsoCollision {
public IsoCollider Collider { get; private set; }
public IsoContactPoint[] Contacts { get; private set; }
public IsoCollider IsoCollider { get; private set; }
public IsoContactPoint[] IsoContacts { 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;
public IsoCollision(Collision collision) {
IsoCollider = IsoUtils.IsoConvertCollider(collision.collider);
IsoContacts = IsoUtils.IsoConvertContactPoints(collision.contacts);
GameObject = IsoUtils.IsoConvertGameObject(collision.gameObject);
RelativeVelocity = collision.relativeVelocity;
IsoRigidbody = IsoUtils.IsoConvertRigidbody(collision.rigidbody);
}
}
} // namespace IsoTools

View File

@@ -1,23 +1,18 @@
using UnityEngine;
namespace IsoTools {
public class IsoContactPoint {
public struct 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;
public IsoContactPoint(ContactPoint contact_point) {
Normal = contact_point.normal;
OtherIsoCollider = IsoUtils.IsoConvertCollider(contact_point.otherCollider);
Point = contact_point.point;
ThisIsoCollider = IsoUtils.IsoConvertCollider(contact_point.thisCollider);
}
}
} // namespace IsoTools

View File

@@ -1,6 +1,4 @@
using UnityEngine;
using System.Linq;
using System.Collections.Generic;
namespace IsoTools {
public class IsoFakeObject : MonoBehaviour {
@@ -18,48 +16,6 @@ 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;
@@ -70,27 +26,31 @@ namespace IsoTools {
}
void OnTriggerEnter(Collider collider) {
var iso_collider = ConvertCollider(collider);
IsoObject.gameObject.SendMessage(
"OnIsoTriggerEnter", iso_collider, SendMessageOptions.DontRequireReceiver);
"OnIsoTriggerEnter",
IsoUtils.IsoConvertCollider(collider),
SendMessageOptions.DontRequireReceiver);
}
void OnTriggerExit(Collider collider) {
var iso_collider = ConvertCollider(collider);
IsoObject.gameObject.SendMessage(
"OnIsoTriggerExit", iso_collider, SendMessageOptions.DontRequireReceiver);
"OnIsoTriggerExit",
IsoUtils.IsoConvertCollider(collider),
SendMessageOptions.DontRequireReceiver);
}
void OnCollisionEnter(Collision collision) {
var iso_collision = ConvertCollision(collision);
IsoObject.gameObject.SendMessage(
"OnIsoCollisionEnter", iso_collision, SendMessageOptions.DontRequireReceiver);
"OnIsoCollisionEnter",
new IsoCollision(collision),
SendMessageOptions.DontRequireReceiver);
}
void OnCollisionExit(Collision collision) {
var iso_collision = ConvertCollision(collision);
IsoObject.gameObject.SendMessage(
"OnIsoCollisionExit", iso_collision, SendMessageOptions.DontRequireReceiver);
"OnIsoCollisionExit",
new IsoCollision(collision),
SendMessageOptions.DontRequireReceiver);
}
}
} // namespace IsoTools

View File

@@ -0,0 +1,16 @@
using UnityEngine;
namespace IsoTools {
public class IsoFakeRigidbody : MonoBehaviour {
IsoRigidbody _isoRigidbody = null;
public void Init(IsoRigidbody iso_rigidbody) {
_isoRigidbody = iso_rigidbody;
}
public IsoRigidbody IsoRigidbody {
get { return _isoRigidbody; }
}
}
} // namespace IsoTools

View File

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

View File

@@ -0,0 +1,20 @@
using UnityEngine;
namespace IsoTools {
public struct IsoRaycastHit {
public IsoCollider IsoCollider { get; private set; }
public float Distance { get; private set; }
public Vector3 Normal { get; private set; }
public Vector3 Point { get; private set; }
public IsoRigidbody IsoRigidbody { get; private set; }
public IsoRaycastHit(RaycastHit hit_info) {
IsoCollider = IsoUtils.IsoConvertCollider(hit_info.collider);
Distance = hit_info.distance;
Normal = hit_info.normal;
Point = hit_info.point;
IsoRigidbody = IsoUtils.IsoConvertRigidbody(hit_info.rigidbody);
}
}
} // namespace IsoTools

View File

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

View File

@@ -9,6 +9,18 @@ namespace IsoTools {
[RequireComponent(typeof(IsoObject))]
public class IsoRigidbody : MonoBehaviour {
Rigidbody _realRigidbody = null;
protected Rigidbody RealRigidbody {
get { return _realRigidbody; }
}
protected GameObject IsoFakeObject {
get {
var helper = IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject);
return helper ? helper.IsoFakeObject : null;
}
}
[SerializeField]
public bool _isKinematic = false;
public bool IsKinematic {
@@ -45,14 +57,205 @@ namespace IsoTools {
}
}
Rigidbody _realRigidbody = null;
public Rigidbody RealRigidbody {
get { return _realRigidbody; }
public Vector3 CenterOfMass {
get { return RealRigidbody ? RealRigidbody.centerOfMass : Vector3.zero; }
set {
if ( RealRigidbody ) {
RealRigidbody.centerOfMass = value;
}
}
}
public float Drag {
get { return RealRigidbody ? RealRigidbody.drag : 0.0f; }
set {
if ( RealRigidbody ) {
RealRigidbody.drag = value;
}
}
}
public Vector3 InertiaTensor {
get { return RealRigidbody ? RealRigidbody.inertiaTensor : Vector3.zero; }
set {
if ( RealRigidbody ) {
RealRigidbody.inertiaTensor = value;
}
}
}
public float Mass {
get { return RealRigidbody ? RealRigidbody.mass : 0.0f; }
set {
if ( RealRigidbody ) {
RealRigidbody.mass = value;
}
}
}
public float MaxDepenetrationVelocity {
get { return RealRigidbody ? RealRigidbody.maxDepenetrationVelocity : 0.0f; }
set {
if ( RealRigidbody ) {
RealRigidbody.maxDepenetrationVelocity = value;
}
}
}
public float SleepThreshold {
get { return RealRigidbody ? RealRigidbody.sleepThreshold : 0.0f; }
set {
if ( RealRigidbody ) {
RealRigidbody.sleepThreshold = value;
}
}
}
public int SolverIterationCount {
get { return RealRigidbody ? RealRigidbody.solverIterationCount : 0; }
set {
if ( RealRigidbody ) {
RealRigidbody.solverIterationCount = value;
}
}
}
public bool UseGravity {
get { return RealRigidbody ? RealRigidbody.useGravity : false; }
set {
if ( RealRigidbody ) {
RealRigidbody.useGravity = value;
}
}
}
public Vector3 Velocity {
get { return RealRigidbody ? RealRigidbody.velocity : Vector3.zero; }
set {
if ( RealRigidbody ) {
RealRigidbody.velocity = value;
}
}
}
public Vector3 worldCenterOfMass {
get { return RealRigidbody ? RealRigidbody.worldCenterOfMass : Vector3.zero; }
}
public void AddExplosionForce(
float explosion_force, Vector3 explosion_position, float explosion_radius)
{
AddExplosionForce(
explosion_force, explosion_position, explosion_radius,
0.0f, ForceMode.Force);
}
public void AddExplosionForce(
float explosion_force, Vector3 explosion_position, float explosion_radius,
float upwards_modifier)
{
AddExplosionForce(
explosion_force, explosion_position, explosion_radius,
upwards_modifier, ForceMode.Force);
}
public void AddExplosionForce(
float explosion_force, Vector3 explosion_position, float explosion_radius,
float upwards_modifier, ForceMode mode)
{
if ( RealRigidbody ) {
RealRigidbody.AddExplosionForce(
explosion_force, explosion_position, explosion_radius,
upwards_modifier, mode);
}
}
public void AddForce(Vector3 force) {
AddForce(force, ForceMode.Force);
}
public void AddForce(Vector3 force, ForceMode mode) {
if ( RealRigidbody ) {
RealRigidbody.AddForce(force, mode);
}
}
public void AddRelativeForce(Vector3 force) {
AddRelativeForce(force, ForceMode.Force);
}
public void AddRelativeForce(Vector3 force, ForceMode mode) {
if ( RealRigidbody ) {
RealRigidbody.AddRelativeForce(force, mode);
}
}
public void AddForceAtPosition(Vector3 force, Vector3 position) {
AddForceAtPosition(force, position, ForceMode.Force);
}
public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode) {
if ( RealRigidbody ) {
RealRigidbody.AddForceAtPosition(force, position, mode);
}
}
public Vector3 ClosestPointOnBounds(Vector3 position) {
return RealRigidbody
? RealRigidbody.ClosestPointOnBounds(position)
: Vector3.zero;
}
public bool IsSleeping() {
return RealRigidbody
? RealRigidbody.IsSleeping()
: false;
}
public void SetDensity(float density) {
if ( RealRigidbody ) {
RealRigidbody.SetDensity(density);
}
}
public void Sleep() {
if ( RealRigidbody ) {
RealRigidbody.Sleep();
}
}
public void WakeUp() {
if ( RealRigidbody ) {
RealRigidbody.WakeUp();
}
}
public bool SweepTest(Vector3 direction, out IsoRaycastHit iso_hit_info) {
return SweepTest(direction, out iso_hit_info, Mathf.Infinity);
}
public bool SweepTest(Vector3 direction, out IsoRaycastHit iso_hit_info, float max_distance) {
RaycastHit hit_info;
var result = RealRigidbody
? RealRigidbody.SweepTest(direction, out hit_info, max_distance)
: false;
iso_hit_info = result ? new IsoRaycastHit(hit_info) : new IsoRaycastHit();
return result;
}
public IsoRaycastHit[] SweepTestAll(Vector3 direction) {
return SweepTestAll(direction, Mathf.Infinity);
}
public IsoRaycastHit[] SweepTestAll(Vector3 direction, float max_distance) {
return RealRigidbody
? IsoUtils.IsoConvertRaycastHits(RealRigidbody.SweepTestAll(direction, max_distance))
: new IsoRaycastHit[0];
}
void Awake() {
var helper = IsoUtils.GetOrCreateComponent<IsoPhysicHelper>(gameObject);
_realRigidbody = helper.IsoFakeObject.AddComponent<Rigidbody>();
IsoFakeObject.AddComponent<IsoFakeRigidbody>().Init(this);
_realRigidbody = IsoFakeObject.AddComponent<Rigidbody>();
_realRigidbody.freezeRotation = true;
_realRigidbody.isKinematic = IsKinematic;
_realRigidbody.interpolation = Interpolation;
@@ -73,6 +276,7 @@ namespace IsoTools {
void OnDestroy() {
if ( _realRigidbody ) {
Destroy(IsoFakeObject.GetComponent<IsoFakeRigidbody>());
Destroy(_realRigidbody);
_realRigidbody = null;
}

View File

@@ -375,6 +375,38 @@ namespace IsoTools {
: obj.AddComponent<T>();
}
public static IsoCollider IsoConvertCollider(Collider collider) {
var fake_collider = collider ? collider.GetComponent<IsoFakeCollider>() : null;
return fake_collider ? fake_collider.IsoCollider : null;
}
public static IsoRigidbody IsoConvertRigidbody(Rigidbody rigidbody) {
var fake_rigidbody = rigidbody ? rigidbody.GetComponent<IsoFakeRigidbody>() : null;
return fake_rigidbody ? fake_rigidbody.IsoRigidbody : null;
}
public static GameObject IsoConvertGameObject(GameObject game_object) {
var fake_object = game_object ? game_object.GetComponent<IsoFakeObject>() : null;
var iso_object = fake_object ? fake_object.IsoObject : null;
return iso_object ? iso_object.gameObject : null;
}
public static IsoContactPoint[] IsoConvertContactPoints(ContactPoint[] points) {
var iso_points = new IsoContactPoint[points.Length];
for ( var i = 0; i < points.Length; ++i ) {
iso_points[i] = new IsoContactPoint(points[i]);
}
return iso_points;
}
public static IsoRaycastHit[] IsoConvertRaycastHits(RaycastHit[] hits) {
var iso_hits = new IsoRaycastHit[hits.Length];
for ( var i = 0; i < hits.Length; ++i ) {
iso_hits[i] = new IsoRaycastHit(hits[i]);
}
return iso_hits;
}
// ---------------------------------------------------------------------
//
// Debug draw

View File

@@ -23,7 +23,7 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = Assembly-CSharp.csproj
Policies = $0
$0.TextStylePolicy = $1

View File

@@ -23,7 +23,7 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = Assembly-CSharp.csproj
Policies = $0
$0.TextStylePolicy = $1

View File

@@ -1,16 +1,13 @@
<Properties>
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" PreferredExecutionTarget="MonoDevelop.Default" />
<MonoDevelop.Ide.Workbench ActiveDocument="Assets/IsoTools/Examples/Scripts/IsoEchoListener.cs">
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
<MonoDevelop.Ide.Workbench ActiveDocument="Assets/IsoTools/Scripts/IsoRigidbody.cs">
<Files>
<File FileName="Assets/IsoTools/Examples/Scripts/CircleFly.cs" Line="25" Column="35" />
<File FileName="Assets/IsoTools/Examples/Scripts/IsoEchoListener.cs" Line="29" Column="3" />
<File FileName="Assets/IsoTools/Scripts/IsoCollider.cs" Line="86" Column="4" />
<File FileName="Assets/IsoTools/Scripts/IsoRigidbody.cs" Line="14" Column="34" />
</Files>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore>
<Breakpoint file="/Users/blackmat/Programming/Projects/UnityIso/Assets/IsoTools/Examples/Scripts/IsoEchoListener.cs" line="19" />
<Breakpoint file="/Users/blackmat/Programming/Projects/UnityIso/Assets/IsoTools/Examples/Scripts/IsoEchoListener.cs" line="25" />
</BreakpointStore>
<BreakpointStore />
</MonoDevelop.Ide.DebuggingService.Breakpoints>
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
</Properties>