EasyCastleUNITY

가장 가까운 무기 장착 본문

유니티 심화

가장 가까운 무기 장착

EasyCastleT 2023. 8. 21. 17:40

레이어마스크와 OverlapSphereNonAlloc 함수 활용

해당 함수는 주변에 물체의 갯수가 일정할 때만 사용하는 것이 좋다.

여기서는 6개로 일정하기에 사용하였다. 

 

무기들은 모두 콜라이더를 가지고 있고, 레이어의 이름은 Gun이다. 

현재 상황

주변에 콜라이더를 모두 검색하여, 가장 가까운 무기를 장착한다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OverlapPlayer : MonoBehaviour
{
    [SerializeField]
    private float radius = 1.0f;
    [SerializeField]
    private Transform weaponChild;
    private Collider[] colls = new Collider[6];
    private float weaponDistance = 0.0f;
    private float minDistance = 100f; //min 크게 하기 
    private GameObject equipWeapon;
    // Start is called before the first frame update


    private void Start()
    {
        
        int layMask = 1 << LayerMask.NameToLayer("Gun");
        int cnt = Physics.OverlapSphereNonAlloc(this.transform.position, radius, colls, layMask);
        Debug.LogFormat("count:{0}", cnt);
        foreach(Collider col in colls)
        {
            float distance = Vector3.Distance(this.transform.position, 
                col.gameObject.transform.position);
            if( this.minDistance> distance) // minDistance가 갱신될 때가 검색된 무기 중에서 현재 가장 가까운 무기
            {
                this.minDistance = distance;
                this.equipWeapon = col.gameObject;
            }
            Debug.Log(col.gameObject.name);
        }
        Debug.LogFormat("<color=lime>minDistance:{0}</color>", this.minDistance);
        Debug.LogFormat("<color=lime>equipWeapon:{0}</color>", this.equipWeapon);
        this.equipWeapon.transform.position = Vector3.zero; //주변에 있는 거 줍는거여서, 위치를 초기화해준다. 
        this.equipWeapon.transform.SetParent(weaponChild,false); //장착 무기를, weaponChild의 자식으로 설정한다.
    }
    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(transform.position, radius);
    }
}

플레이어 인스펙터

결과

가장 가까운거 장착
무기의 위치를 바꾸어보고 다시 실행