You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.6 KiB
C#

6 months ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace Autohand{
public class Sticky : MonoBehaviour{
[Header("Sticky Settings")]
public Rigidbody body;
[Tooltip("How strong the joint is between the stickable and this")]
public float stickStrength = 1;
[Tooltip("Multiplyer for required stick speed to activate")]
public float requiredStickSpeed = 1;
[Tooltip("This index must match the stickable object to stick")]
public int stickIndex = 0;
[Header("Event")]
public UnityEvent OnStick;
List<Stickable> stickers;
List<Joint> joints;
private void Start() {
if(body == null)
body = GetComponent<Rigidbody>();
stickers = new List<Stickable>();
joints = new List<Joint>();
}
void OnCollisionEnter(Collision collision) {
Stickable stick;
if(collision.gameObject.CanGetComponent(out stick)) {
CreateStick(stick);
}
}
void CreateStick(Stickable sticker) {
if(stickers.Contains(sticker) || sticker.stickIndex != stickIndex)
return;
if(sticker.body.velocity.sqrMagnitude*sticker.stickSpeedMultiplyer < requiredStickSpeed)
return;
var joint = gameObject.AddComponent<FixedJoint>();
joint.connectedBody = sticker.body;
joint.breakForce = 1000*stickStrength*sticker.stickStrength;
joint.breakTorque = 1000*stickStrength*sticker.stickStrength;
joint.connectedMassScale = 1;
joint.massScale = 1;
joint.enableCollision = false;
joint.enablePreprocessing = true;
sticker.Stick(this);
OnStick?.Invoke();
joints.Add(joint);
stickers.Add(sticker);
}
public void ForceRelease(Stickable stuck) {
Destroy(joints[stickers.IndexOf(stuck)]);
}
void OnJointBreak(float breakForce) {
StartCoroutine(JointBreak());
}
IEnumerator JointBreak() {
yield return new WaitForFixedUpdate();
for(int i = joints.Count-1; i >= 0; i--) {
if(!joints[i]) {
joints.RemoveAt(i);
stickers[i].EndStick?.Invoke();
stickers.RemoveAt(i);
}
}
}
private void OnDrawGizmosSelected() {
if(!body && GetComponent<Rigidbody>())
body = GetComponent<Rigidbody>();
}
}
}