쿠키런 같은 자석효과

정제로·2023년 10월 17일
0

Unity

목록 보기
19/19

자석효과

쿠키런에는 자석효과를 가진 아이템이 존재한다.

대충 이런기능이다.
여기서난 저렇게 자석아이템을 먹었을때, 자석처럼 플레이어에게 아이템이 땡겨져 오는 코드를 짜고싶었다.

접근방식

자석아이템을 먹었을때, 이어서 트리거나 콜라이더 충돌로 해결하고자 했고, 그렇게 되면 Update보다는 코루틴으로 해결하는편이 좋겠다고 생각했다!

그렇게 코루틴코드를 짰지만 계속해서 아이템을 획득한 플레이어의 위치만 받아서 플레이어가 조금이라도 움직이면, 아이템이 날아가버렸다..

뭐가 문제일까 고민을 하다가, 이거 무한루프 반복문 안에서 플레이어 위치를 계속 받아오고, 거기안에서 자석효과 시간후에 yield break를 하면 해결이 될것같았다.
그렇게 코드를 천천히 짜보았고, 그 결과 아래의 코드가 나왔다.

유니티에서의 자석효과 코드

public float magnetTime = 3f;
    public float magnetRange = 5f;
    public float magnetPower = 10f;
    private bool isMagneticActive = false;

#region Player Magnet Effect
    public void MagneticEffect()
    { 
        if (!isMagneticActive)
        {
            StartCoroutine(ApplyMagneticEffectContinuously());
        }
    }

    private IEnumerator ApplyMagneticEffectContinuously()
    {
        isMagneticActive = true;
        float time = 0;

        while (isMagneticActive)
        {
            // 플레이어의 위치
            Vector2 playerPosition = transform.position;

            // 모든 ItemData 오브젝트를 찾음
            ItemData[] itemsInScene = FindObjectsOfType<ItemData>();

            foreach (ItemData item in itemsInScene)
            {
                // 아이템과 플레이어 사이의 거리를 계산
                float distanceToPlayer = Vector2.Distance(playerPosition, item.transform.position);

                // 만약 아이템이 자석 효과 범위 내에 있다면
                if (distanceToPlayer <= magnetRange)
                {
                    // 자석 효과 방향을 계산
                    Vector2 forceDirection = (playerPosition - (Vector2)item.transform.position).normalized;

                    // 아이템에 자석 효과를 적용
                    Rigidbody2D itemRigidbody = item.GetComponent<Rigidbody2D>();
                    if (itemRigidbody != null)
                    {
                        itemRigidbody.AddForce(magnetPower * forceDirection, ForceMode2D.Force);
                    }
                }
            }

            time += Time.deltaTime;

            yield return null;

            if (time > magnetTime)
            {

                isMagneticActive = false;
                yield break;
            }
        }
    } 
    #endregion

그리고 결과는 이렇게 되었다.


잘 적용된다!
지금 이건 예제코드기에 자석범위와 강도를 약하게 해서 저렇게 되었다.
나중에는 자석강도와 범위를 늘리면 해결이 된다!

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글