108 lines
2.9 KiB
C#
108 lines
2.9 KiB
C#
using UnityEngine;
|
|
|
|
[ExecuteAlways]
|
|
public class ItemGameObject : MonoBehaviour
|
|
{
|
|
public float PickupDistance = 1.5f;
|
|
public float PickupSize = 1.375f;
|
|
public ItemBase ItemData;
|
|
|
|
public bool Collected { get; protected set; }
|
|
|
|
private Collider2D col;
|
|
private PlayerController player;
|
|
private Rigidbody2D rb;
|
|
private SpriteRenderer sr;
|
|
|
|
private Vector2 initialSize;
|
|
|
|
private void Awake()
|
|
{
|
|
col = GetComponent<Collider2D>();
|
|
player = FindObjectOfType<PlayerController>();
|
|
rb = GetComponent<Rigidbody2D>();
|
|
sr = GetComponent<SpriteRenderer>();
|
|
|
|
initialSize = transform.localScale;
|
|
}
|
|
|
|
private bool lastCouldPickup;
|
|
|
|
private void Update()
|
|
{
|
|
if (!Application.isPlaying)
|
|
{
|
|
Awake();
|
|
sr.sprite = ItemData.Sprite;
|
|
return;
|
|
}
|
|
|
|
float desiredSize, pickupDistSqr = PickupDistance * PickupDistance;
|
|
|
|
Vector2 diff = player.transform.position - transform.position;
|
|
float diffMagSqr = diff.x * diff.x + diff.y * diff.y;
|
|
if (!Collected && diffMagSqr <= pickupDistSqr)
|
|
{
|
|
if (!lastCouldPickup) OnEnterPickupRange();
|
|
OnStayPickupRange();
|
|
|
|
desiredSize = PickupSize;
|
|
lastCouldPickup = true;
|
|
if (Input.GetKeyDown(KeyCode.Space))
|
|
{
|
|
if (player.TryPickupItem(ItemData))
|
|
{
|
|
desiredSize = 1;
|
|
OnPickup();
|
|
}
|
|
else OnPickupFailed();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lastCouldPickup) OnExitPickupRange();
|
|
|
|
desiredSize = 1;
|
|
lastCouldPickup = false;
|
|
}
|
|
|
|
transform.localScale = Vector2.Lerp(transform.localScale, initialSize * desiredSize, Time.deltaTime * 15);
|
|
|
|
if (col != null) col.enabled = !Collected;
|
|
if (Collected)
|
|
{
|
|
Vector3 playerPos = player.transform.position, curPos = transform.position;
|
|
transform.position = Vector3.Lerp(curPos, playerPos, Time.deltaTime * 10);
|
|
|
|
if (sr != null)
|
|
{
|
|
Color clearCol = new Color(sr.color.r, sr.color.g, sr.color.b, 0);
|
|
sr.color = Color.Lerp(sr.color, clearCol, Time.deltaTime * 10);
|
|
|
|
if (sr.color.a <= 1e-3) Destroy(gameObject);
|
|
}
|
|
|
|
if (diffMagSqr <= 1e-4) Destroy(gameObject);
|
|
}
|
|
}
|
|
|
|
public void GiveRandomVelocity(float max = 10)
|
|
{
|
|
if (rb == null) return;
|
|
|
|
Vector2 dir = Random.insideUnitCircle;
|
|
rb.velocity = dir * max;
|
|
}
|
|
|
|
public virtual void OnDrop() { }
|
|
protected virtual void OnEnterPickupRange() { }
|
|
protected virtual void OnStayPickupRange() { }
|
|
protected virtual void OnExitPickupRange() { }
|
|
protected virtual void OnPickup()
|
|
{
|
|
Collected = true;
|
|
ItemData.OnPickup();
|
|
}
|
|
protected virtual void OnPickupFailed() { }
|
|
}
|