인프런 강의 - 케이디 생존게임
케이디 강의10 - (근접 무기 구현)
WMG1
2022. 11. 13. 19:54
반응형
이번 시간에는 지난번 무기 스왑에 이어서 다른 근접무기 추가를 배웠다.
public abstract class CloseWeaponController : MonoBehaviour
//미완성 클래스(추상 클래스)
//미완성 함수가 포함되므로 자식클래스에서 완성시켜야 함
{
//##현재 장착된 Hand형 타입 무기##
[SerializeField]
protected CloseWeapon currentCleseWeapon;
protected bool isAttack = false; //공격 중인지 체크
protected bool isSwing = false; //팔 휘두르고 있는지 체크
protected RaycastHit hitInfo; //레이에 닿았을 때 정보를 얻어올 수있는 변수
//##공격##
protected void TryAttack() //버튼 입력
{
if (Input.GetButton("Fire1")) //마우스 좌클릭
{
if (!isAttack) //딜레이 때문에 isAttack이 거짓일때만 가능하도록
{
//코루틴 실행(중복실행 방지)
StartCoroutine(AttackCoroutine());
}
}
}
protected IEnumerator AttackCoroutine() // 애니매이션실행 && 공격 코루틴-> 공격이 이루어지는 과정 && 중복실행 방지
{
isAttack = true;
currentCleseWeapon.anim.SetTrigger("Attack"); // Attack 트리거 실행(애니매이션 실행)
yield return new WaitForSeconds(currentCleseWeapon.attackDelayA); // attackDelayA(공격 활성화 시점까지 대기)
isSwing = true; // 팔 휘두르기 참
StartCoroutine(HitCoroutine()); // 적중여부 판단 코루틴
yield return new WaitForSeconds(currentCleseWeapon.attackDelayB); //attackDelayB 공격 비활성화 시점
isSwing = false; // 팔 휘두르기 거짓(팔 접음)
yield return new WaitForSeconds(currentCleseWeapon.attackDelay - currentCleseWeapon.attackDelayA - currentCleseWeapon.attackDelayB); // attackDelay만큼만 대기
isAttack = false;
}
// ##공격 적중 체크##
protected abstract IEnumerator HitCoroutine(); // 공격 적중 확인 코루틴
// => 미완성(추상)코루틴 == 자식클래스에서 완성시켜 써라
protected bool CheckObject() // 적중 확인 레이캐스트 발사
{
if (Physics.Raycast(transform.position, transform.forward, out hitInfo, currentCleseWeapon.range)) //발사정보- 현재 위치값, 방향은 정면, 받아올 정보, 범위(레이 길이)
{
return true; // 충돌함
}
return false; // 아무것도 없음
}
//완성 함수 이지만, 추가 편집이 가능한 함수((자식 클래스에서 호출 후 수정가능함수))
public virtual void CloseWeaponChange(CloseWeapon _cleseWeapon) // GunController의 GunChange와 동일함
{
if (WeaponManager.currentWeapon != null) // 현재 뭔가를 들고있는 경우
WeaponManager.currentWeapon.gameObject.SetActive(false); //기존에 들고있는것 비활성화
currentCleseWeapon = _cleseWeapon; // 바꿀 총을 현재총으로 넣어줌
WeaponManager.currentWeapon = currentCleseWeapon.GetComponent<Transform>(); // 현재 무기를 현재손 으로 변경
WeaponManager.currentWeaponAnim = currentCleseWeapon.anim; //현재무기 애니메이션을 현재 손 애니메이션으로 변경
currentCleseWeapon.transform.localPosition = Vector3.zero; //상대적 벡터 포지션을 000으로 초기화
currentCleseWeapon.gameObject.SetActive(true); //인스팩터 활성화 상태
}
}
상속의 부모 스크립트
public class PickaxeController : CloseWeaponController
{
public static bool isActivate = true; // 활성화 상태 체크
private void Start()
{
//무기 교체용 요소 요청
WeaponManager.currentWeapon = currentCleseWeapon.GetComponent<Transform>();
WeaponManager.currentWeaponAnim = currentCleseWeapon.anim;
}
void Update()
{
if (isActivate) //활성화 체크
TryAttack();
}
protected override IEnumerator HitCoroutine() //미완성 함수 재정의(공격 적중 확인코루틴)
{
while (isSwing) //isSwing이 트루인 상태에선 계속 반복
{
if (CheckObject()) //함수 호출
{
isSwing = false; // 데미지가 한번만 적용되도록 1회 적중 시 바로 거짓으로 변경
Debug.Log(hitInfo.transform.name);
}
yield return null;
}
}
public override void CloseWeaponChange(CloseWeapon _cleseWeapon)
{
base.CloseWeaponChange(_cleseWeapon);
isActivate = true;
}
}
상속의 자식 스크립트
상속을 이용한 스크립트 공통분모 관리와
여러 상속의 기능들을 알아보았다.
또한 애니메이터 오버라이드를 통해 유사한 구조의 애니메이터를 이용하는 법도 알게 되었다.
반응형