117 lines
4.2 KiB
C#
117 lines
4.2 KiB
C#
using FishNet.CodeGenerating.Extension;
|
|
using FishNet.CodeGenerating.Helping.Extension;
|
|
using FishNet.Connection;
|
|
using MonoFN.Cecil;
|
|
using MonoFN.Cecil.Cil;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using SR = System.Reflection;
|
|
|
|
|
|
namespace FishNet.CodeGenerating.Helping
|
|
{
|
|
internal class PhysicsHelper : CodegenBase
|
|
{
|
|
#region Reflection references.
|
|
public MethodReference GetScene_MethodRef;
|
|
public MethodReference GetPhysicsScene2D_MethodRef;
|
|
public MethodReference GetPhysicsScene3D_MethodRef;
|
|
public MethodReference Physics3D_Simulate_MethodRef;
|
|
public MethodReference Physics2D_Simulate_MethodRef;
|
|
public MethodReference Physics3D_SyncTransforms_MethodRef;
|
|
public MethodReference Physics2D_SyncTransforms_MethodRef;
|
|
#endregion
|
|
|
|
public override bool ImportReferences()
|
|
{
|
|
SR.MethodInfo locMi;
|
|
//GetScene.
|
|
locMi = typeof(GameObject).GetMethod("get_scene");
|
|
GetScene_MethodRef = base.ImportReference(locMi);
|
|
|
|
//Physics.SyncTransform.
|
|
foreach (SR.MethodInfo mi in typeof(Physics).GetMethods())
|
|
{
|
|
if (mi.Name == nameof(Physics.SyncTransforms))
|
|
{
|
|
Physics3D_SyncTransforms_MethodRef = base.ImportReference(mi);
|
|
break;
|
|
}
|
|
}
|
|
foreach (SR.MethodInfo mi in typeof(Physics2D).GetMethods())
|
|
{
|
|
if (mi.Name == nameof(Physics2D.SyncTransforms))
|
|
{
|
|
Physics2D_SyncTransforms_MethodRef = base.ImportReference(mi);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//PhysicsScene.Simulate.
|
|
foreach (SR.MethodInfo mi in typeof(PhysicsScene).GetMethods())
|
|
{
|
|
if (mi.Name == nameof(PhysicsScene.Simulate))
|
|
{
|
|
Physics3D_Simulate_MethodRef = base.ImportReference(mi);
|
|
break;
|
|
}
|
|
}
|
|
foreach (SR.MethodInfo mi in typeof(PhysicsScene2D).GetMethods())
|
|
{
|
|
if (mi.Name == nameof(PhysicsScene2D.Simulate))
|
|
{
|
|
Physics2D_Simulate_MethodRef = base.ImportReference(mi);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//GetPhysicsScene.
|
|
foreach (SR.MethodInfo mi in typeof(PhysicsSceneExtensions).GetMethods())
|
|
{
|
|
if (mi.Name == nameof(PhysicsSceneExtensions.GetPhysicsScene))
|
|
{
|
|
GetPhysicsScene3D_MethodRef = base.ImportReference(mi);
|
|
break;
|
|
}
|
|
}
|
|
foreach (SR.MethodInfo mi in typeof(PhysicsSceneExtensions2D).GetMethods())
|
|
{
|
|
if (mi.Name == nameof(PhysicsSceneExtensions2D.GetPhysicsScene2D))
|
|
{
|
|
GetPhysicsScene2D_MethodRef = base.ImportReference(mi);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Returns instructions to get a physics scene from a gameObject.
|
|
/// </summary>
|
|
public List<Instruction> GetPhysicsScene(MethodDefinition md, VariableDefinition gameObjectVd, bool threeDimensional)
|
|
{
|
|
ILProcessor processor = md.Body.GetILProcessor();
|
|
return GetPhysicsScene(processor, gameObjectVd, threeDimensional);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns instructions to get a physics scene from a gameObject.
|
|
/// </summary>
|
|
public List<Instruction> GetPhysicsScene(ILProcessor processor, VariableDefinition gameObjectVd, bool threeDimensional)
|
|
{
|
|
List<Instruction> insts = new List<Instruction>();
|
|
|
|
//gameObject.scene.GetPhysics...
|
|
insts.Add(processor.Create(OpCodes.Ldloc, gameObjectVd));
|
|
insts.Add(processor.Create(GetScene_MethodRef.GetCallOpCode(base.Session), GetScene_MethodRef));
|
|
if (threeDimensional)
|
|
insts.Add(processor.Create(OpCodes.Call, GetPhysicsScene3D_MethodRef));
|
|
else
|
|
insts.Add(processor.Create(OpCodes.Call, GetPhysicsScene2D_MethodRef));
|
|
|
|
return insts;
|
|
}
|
|
}
|
|
} |