2024-08-17 14:13:26 +00:00
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
public class CranePickDrop : MonoBehaviour
|
|
|
|
{
|
|
|
|
public SlidingCrane crane;
|
|
|
|
public Magnet magnet;
|
|
|
|
public Transform dropTarget;
|
|
|
|
|
|
|
|
public Rigidbody handlingBody;
|
|
|
|
|
|
|
|
public float magnetStrength;
|
|
|
|
|
|
|
|
public enum State
|
|
|
|
{
|
|
|
|
Idle,
|
|
|
|
Catching,
|
2024-08-17 14:39:05 +00:00
|
|
|
WaitingToCatch,
|
2024-08-17 14:13:26 +00:00
|
|
|
Tansporting,
|
2024-08-19 21:24:47 +00:00
|
|
|
WaitBeforeDrop,
|
2024-08-17 14:13:26 +00:00
|
|
|
Finished,
|
|
|
|
}
|
|
|
|
|
|
|
|
public State state;
|
|
|
|
|
2024-08-17 14:39:05 +00:00
|
|
|
float timer = 0;
|
|
|
|
|
2024-08-17 14:13:26 +00:00
|
|
|
public void OnTriggerEnterSignalReceived(EnterTriggerSender sender)
|
|
|
|
{
|
|
|
|
var otherRb = sender.triggeredCollider.attachedRigidbody;
|
|
|
|
|
2024-08-19 18:31:53 +00:00
|
|
|
if (!otherRb.GetComponent<Product>())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-08-17 14:13:26 +00:00
|
|
|
if (otherRb && otherRb.isKinematic == false && state == State.Idle)
|
|
|
|
{
|
|
|
|
handlingBody = otherRb;
|
2024-08-19 21:01:26 +00:00
|
|
|
crane.targetTransform = handlingBody.transform;
|
2024-08-17 14:13:26 +00:00
|
|
|
state = State.Catching;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void OnTriggerExitSignalReceived(EnterTriggerSender sender)
|
|
|
|
{
|
|
|
|
var otherRb = sender.triggeredCollider;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Start()
|
|
|
|
{
|
|
|
|
magnetStrength = magnet.strength;
|
2024-08-19 21:24:47 +00:00
|
|
|
crane.heightMotion.AccelerateTo(1);
|
2024-08-17 14:13:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Update()
|
|
|
|
{
|
|
|
|
if (state == State.Catching)
|
|
|
|
{
|
|
|
|
Debug.Assert(handlingBody, this);
|
|
|
|
|
2024-08-18 17:27:27 +00:00
|
|
|
if (handlingBody == null)
|
|
|
|
{
|
|
|
|
state = State.Idle;
|
|
|
|
return;
|
|
|
|
}
|
2024-08-19 18:31:53 +00:00
|
|
|
|
2024-08-19 21:24:47 +00:00
|
|
|
if (magnet.IsCloseToPlanar(handlingBody, 10f))
|
|
|
|
{
|
|
|
|
crane.heightMotion.AccelerateTo(0);
|
|
|
|
}
|
|
|
|
|
2024-08-19 18:31:53 +00:00
|
|
|
if (magnet.IsCloseTo(handlingBody, 5f))
|
|
|
|
{
|
|
|
|
magnet.strength = magnetStrength;
|
|
|
|
}
|
2024-08-17 14:13:26 +00:00
|
|
|
|
2024-08-17 14:29:47 +00:00
|
|
|
if (magnet.IsCloseTo(handlingBody, 2f))
|
2024-08-17 14:13:26 +00:00
|
|
|
{
|
2024-08-19 21:01:26 +00:00
|
|
|
crane.targetTransform = null;
|
2024-08-17 14:39:05 +00:00
|
|
|
|
|
|
|
state = State.WaitingToCatch;
|
|
|
|
timer = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (state == State.WaitingToCatch)
|
|
|
|
{
|
|
|
|
timer -= Time.deltaTime;
|
|
|
|
|
|
|
|
if (timer < 0)
|
|
|
|
{
|
2024-08-17 14:13:26 +00:00
|
|
|
state = State.Tansporting;
|
2024-08-19 21:01:26 +00:00
|
|
|
crane.targetTransform = dropTarget;
|
2024-08-19 21:24:47 +00:00
|
|
|
crane.heightMotion.AccelerateTo(1);
|
2024-08-17 14:13:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (state == State.Tansporting)
|
|
|
|
{
|
2024-08-19 21:24:47 +00:00
|
|
|
if (magnet.IsCloseToPlanar(dropTarget, 10f))
|
|
|
|
{
|
|
|
|
crane.heightMotion.AccelerateTo(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (magnet.IsCloseToPlanar(dropTarget, 3f))
|
|
|
|
{
|
|
|
|
state = State.WaitBeforeDrop;
|
|
|
|
timer = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (state == State.WaitBeforeDrop)
|
|
|
|
{
|
|
|
|
timer -= Time.deltaTime;
|
|
|
|
|
|
|
|
if (timer < 0)
|
2024-08-17 14:13:26 +00:00
|
|
|
{
|
|
|
|
magnet.strength = 0;
|
|
|
|
state = State.Idle;
|
2024-08-19 21:24:47 +00:00
|
|
|
crane.heightMotion.AccelerateTo(1);
|
2024-08-17 14:13:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|