Files
BlueArchiveMiniGame/Assets/ThirdParty/DestroyIt/Scripts/Runtime/Behaviors/SupportPoint.cs
2025-09-17 18:56:28 +08:00

68 lines
3.0 KiB
C#

using UnityEngine;
namespace DestroyIt
{
/// <summary>
/// This script manages a single support point (a Trigger Collider) on an object.
/// On startup, if the support point is connected to another rigidbody, it will create a custom joint connecting the two.
/// </summary>
public class SupportPoint : MonoBehaviour
{
public int breakForce = 750;
public int breakTorque = 750;
private bool _canSupport = true;
void Start()
{
if (transform.parent == null)
{
Debug.Log("[" + name + "] has no parent. Support points are designed to be children of objects that have attached colliders.");
_canSupport = false;
}
else if (transform.parent.GetComponent<Collider>() == null || !transform.parent.GetComponent<Collider>().enabled)
{
Debug.Log("[" + transform.parent.name + "] has a support point but no enabled collider. Support points only work on objects with colliders.");
_canSupport = false;
}
else if (transform.parent.GetComponent<Collider>().attachedRigidbody == null)
{
Debug.Log("[" + transform.parent.name + "] has a support point but no attached rigidbody. Support points only work on objects with rigidbodies.");
_canSupport = false;
}
if (_canSupport)
{
Ray ray = new Ray(transform.position - (transform.forward * 0.025f), transform.forward); // need to start the ray behind the transform a little
//Debug.DrawRay(this.transform.position, this.transform.forward * .15f, Color.red, 10f);
RaycastHit[] hitInfo = Physics.RaycastAll(ray, 0.075f);
for(int i=0; i<hitInfo.Length; i++)
{
// ignore colliders without rigidbodies to attach a joint to.
if (hitInfo[i].collider.attachedRigidbody == null) continue;
// ignore other trigger colliders - we only want to attach to the parent object.
if (hitInfo[i].collider.isTrigger) continue;
// Get the forward angle, as it relates to the parent
Vector3 angleAxis = transform.parent.transform.InverseTransformDirection(transform.TransformDirection(Vector3.forward));
// Add a stiff joint for support.
transform.parent.GetComponent<Collider>().attachedRigidbody.gameObject.AddStiffJoint(hitInfo[i].collider.attachedRigidbody,
transform.localPosition, angleAxis, breakForce, breakTorque);
break;
}
}
Destroy(gameObject);
}
private void OnDrawGizmos()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position - (transform.forward * 0.025f), .01f);
Gizmos.DrawRay(transform.position - (transform.forward * 0.025f), transform.forward * 0.075f);
}
}
}