본문 바로가기

개발 프로젝트/Unity - WeaponGameProject

WeaponGameProject - Weapon 클래스 설계 (3) (Bash와 상호작용하는 Weapon의 상태 구현 - 2)

바로 직전의 포스팅을 보았는데

글의 규모가 너무 넓고 집중이 되지 않았습니다.

기술의 핵심만을 작성하는 기술을 연습 해보겠습니다.

고로 오늘은 짧게 작성하겠습니다.

 

지난 포스팅에서 작성한 Weapon에 1가지 상태를 추가할 것입니다.

예전에 포스팅한 동영상에서 눈치채신 분들도 있겠지만, Weapon의 상태는 1가지 더 존재합니다.

무기가 노랗게 빛나는 상태. Weapon의 BashTrigger가 준비되었습니다.

Bash 기술을 사용하여 WeaponDetectCollider가 생성되었을 때

플레이어 주변의 Weapon들은 CanBash 상태가 됩니다.

 

하지만 많은 무기들 중에 플레이어가 원하는 무기를 선택할 수 있어야겠지요.

원하는 무기를 선택하기 위해선 조준선이 필요했습니다.

조준선은 SphereCast를 이용하면 간단하게 구현 가능하겠죠?

 

public class WeaponDetectColldier : MonoBehaviour
{
    private bool _isFindBashWeapon = false;
    private Vector3 _bashWeaponVector = Vector3.zero;
    .
    .
    void Update(){
    	FindBashWeapon();
    }
    private void FindBashWeapon()
    {
        if (Physics.SphereCast(transform.position, 0.3f, dirVector, out RaycastHit hit, _sphereCollider.radius + 1.0f , layerMaskWeapon))
        {
            if (hit.transform.gameObject.tag == "Weapon" && hit.transform.GetComponent<Weapon>().isCanBash)
            {
                _isFindBashWeapon = true;
                _bashWeaponVector = hit.transform.position;
                hit.transform.GetComponent<Weapon>().ChangeTriggerBashBool(true);
            }
        }
        else
        {
            _isFindBashWeapon = false;
            _bashWeaponVector = Vector3.zero;
        }
    }
    .
    .
}

 

WeaponDetectCollider FindBashWeapon 함수를 추가합니다.

말 그대로 CanBash인 무기를 찾는 함수이며, SphereCast에 감지된 무기가 CanBash 상태일 경우

해당 무기의 상태를 바꾸는 함수(ChaneTriggerBashBool())을 실행시키고,

해당 무기의 Position을 Vector변수에 할당합니다.

 

public class Weapon : MonoBehaviour {
    .
    .
    _isTriggerBash = false;
    
     private void FixedUpdate()
    {
    	.
        .
        CheckWeaponBashStatus();
        ChangeWeaponColor();
    }
    
     private void CheckWeaponBashStatus()
    {
        if (_isTriggerBash)
        {
            SetOnTriggerBashBool();
        }
        else if (_isCanBash != _weaponCollider.IsCanBash)
        {
            if (_weaponCollider.IsCanBash)
            {
                SetOnBashBool();
            }
            else
            {
                SetOffBashBool();
                SetOffTriggerBashBool();
            }
        }
        else
        {
            SetOffTriggerBashBool();
        }

    }
    private void ChangeWeaponColor()
    {
        if (_isTriggerBash)
        {
            weaponColor.material = _weaponMat[3];
        }           
        else if (_isCanBash)
            weaponColor.material = _weaponMat[1];
        else
            weaponColor.material = _weaponMat[0];
    }
    
    public void ChangeTriggerBashBool(bool changeBool)
    {
        if (changeBool)
        {
            if (_isCanBash)
            {
                SetOnTriggerBashBool();
            }
        }
        else
        {
            SetOffTriggerBashBool();
        }
    }
    private void SetOnTriggerBashBool()
    {
        _isTriggerBash = true;
    }

    private void SetOffTriggerBashBool()
    {
        _isTriggerBash = false;
    }
    
}

 

Weapon의 상태를 구별하는데 도움이 될 Material
원본 Material의 색을 변경하고 Emission 속성으로 발광시켰습니다.

 

ChangeTriggerBashBool() 함수를 실행한 Weapon Class는 TriggerBash 상태가 됩니다.

Trigger 상태인 무기의 좌표도 저장했고, 월드에 인스턴스화 하여 상태 구별도 성공적으로 구현했습니다.

 

이제 Weapon이 준비가 되었으니

남은 것은 TriggerBash인 무기에 플레이어가

돌진하는 기능을 구현하면 끝이나겠지요.

 

다음 포스팅부턴 Bash 클래스 설계로 작성하겠습니다.