Unity Collect Items with Magnetism

littleDev·2024년 6월 2일

Unity

목록 보기
6/7

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);
    }
}
profile
매일 성장하고싶은 개발자

0개의 댓글