2D 게임에서 자성으로 아이템 수집하는 스크립트
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Collectable : MonoBehaviour
{
private float magnetStrength = 5f;
private float distanceStretch = 10f;
private int magnetDir = 1;
private Transform magnetTransform;
private Rigidbody2D rb;
private bool InMagneticZone = false;
private bool reached = false;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
if (InMagneticZone)
{
FlyToPlayer();
}
if (reached)
{
// 인벤토리 안에 들어가게 하기
Destroy(gameObject);
}
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Magnetic"))
{
Debug.Log("magnets");
// player 바라보게 하기
LookAtPlayer(other);
InMagneticZone = true;
}
else if (other.CompareTag("Player"))
{
reached = true;
}
}
private void OnTriggerExit2D(Collider2D other)
{
if (other.CompareTag("Magnetic"))
{
InMagneticZone = false;
}
}
// collectable이 player를 바라보게 함
void LookAtPlayer(Collider2D other)
{
magnetTransform = other.transform;
Vector2 relativePos = other.transform.position - transform.position;
float angle = Mathf.Atan2(relativePos.y, relativePos.x) * Mathf.Rad2Deg;
transform.localRotation = Quaternion.Euler(0, 0, angle-90);
transform.Translate(transform.up * magnetStrength * Time.deltaTime * (float)Space.World);
}
// collectable이 player에 다가옴
void FlyToPlayer()
{
Vector2 directionToManet = magnetTransform.position - transform.position;
float distance = Vector2.Distance(magnetTransform.position, transform.position);
float magnetDistanceStr = (distanceStretch / distance) * magnetStrength;
rb.AddForce(directionToManet * (magnetDistanceStr * magnetDir), ForceMode2D.Force);
}
}