[VR] GroundZero 개발

[4Idle - Gazzlers] 손에 탄창 충전 기능 추가

meltingmelvin 2023. 12. 5. 18:02

Test 씬에서 탄창 충전 기능 구현

-EnergyCell 태그를 생성하고 EnergyCell의 태그를 변경해준다.

-EnergyCell에 Rigidbody, Grabbable, collider를 추가한다. rigidbodyd의 isKinematic, collider의 isTrigger는 체크해준다.

 

 

-EnergyCell의 자식으로 빈 오브젝트를 생성해 grabInteractable라 하고, 다음과 같이 컴포넌트를 넣어준다.

 

-EnergyCell 오브젝트에 EnergyCelController 스크립트를 생성해 붙여준다.

 

-Grab이 끝났을때의 이벤트를 받기위해 Distance Grab Interactor에 interactor Unity Event Wrapper 컴포넌트를 추가한다.

-Unselect() 이벤트에 EnergyController의 OnUnGrab을 연결해준다.

 

 

-ChargeArea 태그를 추가하고, cellPos의 태그를 변경해준다.

-충돌 검사를 통해 cell이 chargeArea 범위 내에 있을 때에만 부착될 수 있도록 bool 변수를 통해 true false를 바꿔주었다.

 

-탈 것의 자식으로 cell이 다시 돌아가게 될 위치를 생성 후, energy cell Controller에 할당해주었다.

 

-unselect에 연결된 onUnGrab 메서드

-위에서 unselect 이벤트에 연결한 onUnGrab 함수가 isCharge일때에만 총에 부착되고, 그렇지 않을때에는 원래 자리로 돌아가도록 코드를 작성해 주었다.

잡았을 때 일정 거리 이내에서만 총에 부착되는 결과

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace hyw
{
    public class EnergyCellController : MonoBehaviour
    {
        [SerializeField] Transform energyCellPoint;
        [SerializeField] Transform energyCellOriginalPoint;
        private bool isCharge;
        // Start is called before the first frame update
        void Start()
        {
           
        }

        // Update is called once per frame
        void Update()
        {
            
        }
        public void OnGrab()
        {
            Debug.Log("Grab");
        
        }


        public void OnUnGrab()
        {
            Debug.Log("unGrab");
            if(this.isCharge)
            {
                this.transform.SetParent(this.energyCellPoint);
                this.transform.localPosition = Vector3.zero;
                this.transform.localRotation = Quaternion.Euler(-90,0,0);
            }
            else
            {
                this.transform.position = this.energyCellOriginalPoint.position;
                this.transform.localRotation = Quaternion.identity;

            }
        }


        private void OnTriggerStay(Collider other)
        {
            if (other.gameObject.CompareTag("ChargeArea"))
            {
               // Debug.Log("Charge Area");
                this.isCharge = true;

            }
            
        }

        private void OnTriggerExit(Collider other)
        {
            if (other.gameObject.CompareTag("ChargeArea"))
            {
               // Debug.Log("Exit Area");
                this.isCharge = false;

            }

        }
    }
}