112 lines
2.5 KiB
C#
112 lines
2.5 KiB
C#
namespace Fusion.Addons.KCC
|
|
{
|
|
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// Custom wrapper/cache for fast property checks and synchronization.
|
|
/// Direct changes on the Collider component or the Game Object won't propagate here.
|
|
/// </summary>
|
|
public sealed partial class KCCCollider
|
|
{
|
|
// PUBLIC MEMBERS
|
|
|
|
public GameObject GameObject;
|
|
public Transform Transform;
|
|
public CapsuleCollider Collider;
|
|
public bool IsSpawned;
|
|
public bool IsTrigger;
|
|
public float Radius;
|
|
public float Height;
|
|
public int Layer;
|
|
|
|
// PUBLIC METHODS
|
|
|
|
public void Update(KCC kcc)
|
|
{
|
|
KCCSettings settings = kcc.Settings;
|
|
|
|
if (IsSpawned == false)
|
|
{
|
|
IsTrigger = settings.IsTrigger;
|
|
Radius = settings.Radius;
|
|
Height = settings.Height;
|
|
Layer = settings.ColliderLayer;
|
|
|
|
GameObject = new GameObject("KCCCollider");
|
|
GameObject.layer = settings.ColliderLayer;
|
|
|
|
Transform = GameObject.transform;
|
|
Transform.SetParent(kcc.Transform, false);
|
|
Transform.localPosition = Vector3.zero;
|
|
Transform.localRotation = Quaternion.identity;
|
|
Transform.localScale = Vector3.one;
|
|
|
|
Collider = GameObject.AddComponent<CapsuleCollider>();
|
|
Collider.direction = 1;
|
|
Collider.isTrigger = settings.IsTrigger;
|
|
Collider.radius = settings.Radius;
|
|
Collider.height = settings.Height;
|
|
Collider.center = new Vector3(0.0f, settings.Height * 0.5f, 0.0f);
|
|
|
|
IsSpawned = true;
|
|
}
|
|
|
|
if (IsTrigger != settings.IsTrigger)
|
|
{
|
|
IsTrigger = settings.IsTrigger;
|
|
Collider.isTrigger = settings.IsTrigger;
|
|
}
|
|
|
|
if (Radius != settings.Radius)
|
|
{
|
|
Radius = settings.Radius;
|
|
Collider.radius = settings.Radius;
|
|
}
|
|
|
|
if (Height != settings.Height)
|
|
{
|
|
Height = settings.Height;
|
|
Collider.height = settings.Height;
|
|
Collider.center = new Vector3(0.0f, settings.Height * 0.5f, 0.0f);
|
|
}
|
|
|
|
if (Layer != settings.ColliderLayer)
|
|
{
|
|
Layer = settings.ColliderLayer;
|
|
GameObject.layer = settings.ColliderLayer;
|
|
}
|
|
|
|
OnUpdate(kcc);
|
|
}
|
|
|
|
public void Destroy()
|
|
{
|
|
if (IsSpawned == false)
|
|
return;
|
|
|
|
if (Collider != null)
|
|
{
|
|
Collider.enabled = false;
|
|
}
|
|
|
|
GameObject.Destroy(GameObject);
|
|
|
|
GameObject = default;
|
|
Transform = default;
|
|
Collider = default;
|
|
IsSpawned = default;
|
|
IsTrigger = default;
|
|
Radius = default;
|
|
Height = default;
|
|
Layer = default;
|
|
|
|
OnDestroy();
|
|
}
|
|
|
|
// PARTIAL METHODS
|
|
|
|
partial void OnUpdate(KCC kcc);
|
|
partial void OnDestroy();
|
|
}
|
|
}
|