plantilla base para movimiento básico
This commit is contained in:
Robii Aragon
2026-02-05 05:07:55 -08:00
parent ed7b223c04
commit fd87a6ffd5
14441 changed files with 13711084 additions and 20 deletions

View File

@@ -0,0 +1,129 @@
using System.Collections;
using UnityEngine;
namespace HPhysic
{
[RequireComponent (typeof (Rigidbody))]
public class Connector : MonoBehaviour
{
public ConType ConnectionType { get; private set; } = ConType.Male;
[SerializeField] private bool makeConnectionKinematic = false;
private bool _wasConnectionKinematic;
[SerializeField] private bool hideInteractableWhenIsConnected = false;
[field: SerializeField] public Connector ConnectedTo { get; private set; }
[Header ("Object to set")]
public Transform connectionPoint;
private FixedJoint _fixedJoint;
public Rigidbody Rigidbody { get; private set; }
public Vector3 ConnectionPosition => connectionPoint ? connectionPoint.position : transform.position;
public Quaternion ConnectionRotation => connectionPoint ? connectionPoint.rotation : transform.rotation;
public Quaternion RotationOffset => connectionPoint ? connectionPoint.localRotation : Quaternion.Euler (Vector3.zero);
public Vector3 ConnectedOutOffset => connectionPoint ? connectionPoint.right : transform.right;
public bool IsConnected => ConnectedTo != null;
public enum ConType { Male, Female }
private void Awake ()
{
Rigidbody = gameObject.GetComponent<Rigidbody> ();
}
private void Start ()
{
if (ConnectedTo != null) {
Connector t = ConnectedTo;
ConnectedTo = null;
Connect (t);
}
}
private void OnDisable () => Disconnect ();
public void SetAsConnectedTo (Connector secondConnector)
{
ConnectedTo = secondConnector;
_wasConnectionKinematic = secondConnector.Rigidbody.isKinematic;
UpdateInteractableWhenIsConnected ();
}
public void Connect (Connector secondConnector)
{
if (secondConnector == null) {
Debug.LogWarning ("Attempt to connect null");
return;
}
if (IsConnected) {
Disconnect (secondConnector);
}
secondConnector.transform.rotation = ConnectionRotation * secondConnector.RotationOffset;
secondConnector.transform.position = ConnectionPosition - (secondConnector.ConnectionPosition - secondConnector.transform.position);
_fixedJoint = gameObject.AddComponent<FixedJoint> ();
_fixedJoint.connectedBody = secondConnector.Rigidbody;
secondConnector.SetAsConnectedTo (this);
_wasConnectionKinematic = secondConnector.Rigidbody.isKinematic;
if (makeConnectionKinematic) {
secondConnector.Rigidbody.isKinematic = true;
}
ConnectedTo = secondConnector;
// disable outline on select
UpdateInteractableWhenIsConnected ();
}
public void Disconnect (Connector onlyThis = null)
{
if (ConnectedTo == null || onlyThis != null && onlyThis != ConnectedTo) {
return;
}
Destroy (_fixedJoint);
// important to dont make recusrion
Connector toDisconect = ConnectedTo;
ConnectedTo = null;
if (makeConnectionKinematic) {
toDisconect.Rigidbody.isKinematic = _wasConnectionKinematic;
}
toDisconect.Disconnect (this);
// enable outline on select
UpdateInteractableWhenIsConnected ();
}
private void UpdateInteractableWhenIsConnected ()
{
if (hideInteractableWhenIsConnected) {
if (TryGetComponent (out Collider collider)) {
collider.enabled = !IsConnected;
}
}
}
public bool CanConnect (Connector secondConnector) =>
this != secondConnector
&& !this.IsConnected && !secondConnector.IsConnected
&& this.ConnectionType != secondConnector.ConnectionType;
}
}