[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 함수가 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;
}
}
}
}