https://www.youtube.com/watch?v=APS9OY_p6wo&list=PLO-mt5Iu5TeYkrBzWKuTCl6IUm_bA6BKy&index=4
1. 오브젝트 감지
트리거 된 아이템을 저장하기 위한 변수 선언
public GameObject nearObject;
트리거 이벤트인 OnTriggerStay, Exit 사용
private void OnTriggerStay(Collider other) {
if(other.tag=="Weapon")
nearObject=other.gameObject;
Debug.Log(nearObject.name);
}
private void OnTriggerExit(Collider other) {
if(other.tag=="Weapon")
nearObject=null;
}
> Weapon 태그를 조건으로 하여 로직 작성
2. 무기 입수
bool iDown;
void GetInput(){
...
iDown = Input.GetButtonDown("Interaction");
...
}
> Input Manager에서 상호작용 버튼 추가 "Interaction" , 'e'
Interaction(상호작용) 함수
public GameObject[] weapons;
public bool[] hasWeapons;
void Interaction(){
if(iDown && nearObject != null && !isJump && !isDodge){
if(nearObject.tag =="Weapon"){
Item item = nearObject.GetComponent<Item>();
hasWeapons[weaponIndex]=true;
Destroy(nearObject);
}
}
> 플레이어의 무기관련 배열 함수 2개 선언
> 아이템 정보를 가져와서 해당 무기 입수를 체크한다.
이후 유니티 인스펙터 창에서 초기화
3. 무기 장착
Player > Mesh Object > Bone_Body > Bone_Shoulder_r > Bone_Arm_R > RightHand에 Ciylinder 생성(WeaponPoint)
WeaponPoint의 위치와 크기 조정, 캡슐 콜라이더 해제
무기 프리펩들을 무기 위치에 생성
배치된 무기 오브젝트는 모두 비활성화 & 배열(Weapons)에 할당 (상단 사진 처럼)
4. 무기 교체
bool sDown1;
bool sDown2;
bool sDown3;
void GetInput(){
...
sDown1 = Input.GetButtonDown("Swap1");
sDown2 = Input.GetButtonDown("Swap2");
sDown3 = Input.GetButtonDown("Swap3");
}
> 장비 단축키 1,2,3 변수 생성 및 input 버튼으로 등록
무기 교체 함수 생성(Swap)
void Swap(){
int weaponIndex = -1;
if (sDown1) weaponIndex = 0;
if (sDown2) weaponIndex = 1;
if (sDown3) weaponIndex = 2;
if((sDown1 || sDown2 || sDown3) && !isJump && !isDodge){
weapons[weaponIndex].SetActive(true);
}
}
> 단축키 셋 중 하나만 눌러도 되도록 OR 조건 작성
> 단축키에 맞는 무기를 배열에서 활성화하기
> 무기가 여러개 손에 들리는 문제 발생
기존에 장착된 무기를 저장하는 변수를 선언하고 활용하기
GameObject equipWeapon;
빈손일 경우 생각하여 조건 추가하기
void Swap(){
int weaponIndex = -1;
if (sDown1) weaponIndex = 0;
if (sDown2) weaponIndex = 1;
if (sDown3) weaponIndex = 2;
if((sDown1 || sDown2 || sDown3) && !isJump && !isDodge){
if(equipWeapon != null)
equipWeapon.SetActive(false);
equipWeapon = weapons[weaponIndex];
equipWeapon.SetActive(true);
}
}
무기 교체 애니메이션 추가
> 추가 : Swap 아웃시에 넘어가지 않아 endSwap을 하나 만들어서 나가는 조건으로 설정하였습니다.
교체 시간차 위한 플래그 로직 작성
bool isSwap;
void Swap(){
...
if((sDown1 || sDown2 || sDown3) && !isJump && !isDodge){
...
anim.SetTrigger("doSwap");
isSwap = true;
Invoke("SwapOut",0.4f);
}
}
void SwapOut(){
anim.SetTrigger("endSwap");
isSwap=false;
}
무기 중복 교체, 없는 무기 확인을 위한 조건 추가
int equipWeaponIndex = -1;
void Swap(){
if(sDown1 && (!hasWeapons[0] || equipWeaponIndex==0))
return;
if(sDown2 && (!hasWeapons[1] || equipWeaponIndex==1))
return;
if(sDown3 && (!hasWeapons[2] || equipWeaponIndex==2))
return;
int weaponIndex = -1;
if (sDown1) weaponIndex = 0;
if (sDown2) weaponIndex = 1;
if (sDown3) weaponIndex = 2;
if((sDown1 || sDown2 || sDown3) && !isJump && !isDodge){
if(equipWeapon != null)
equipWeapon.SetActive(false);
equipWeaponIndex = weaponIndex;
equipWeapon = weapons[weaponIndex];
equipWeapon.SetActive(true);
anim.SetTrigger("doSwap");
isSwap = true;
Invoke("SwapOut",0.4f);
}
}
> equipWeaponIndex 를 -1로 초기화 하여 0번 무기를 선택 못하는 버그 예방
깃허브 올리기
Commit : ver 1.4
Description : Weapon Interaction
https://github.com/mekain80/CloneCode_GoldMetal3D
'게임개발 > 3D_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_골드메탈_3D] 5. 아이템 먹기 & 공전물체 만들기 (0) | 2023.07.15 |
---|---|
[클론코딩_골드메탈_3D] 3. 아이템 만들기 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 2. 플레이어 점프와 회피 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 1. 플레이어 이동 (0) | 2023.07.02 |