quality-control/Assets/Scripts/CranePickDrop.cs

125 lines
2.8 KiB
C#
Raw Permalink Normal View History

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,
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;
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;
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
}
}
}
}