Unity_3D Survival Game Development_5

이승용·2021년 4월 3일
0
post-thumbnail
  • 이번 포스트에서는 부수적인 기능 구현에 대한 내용을 다룬다.
  1. Bullet HUD

    • Head Up Display의 준말로, 사용자가 시선을 이동시키지 않아서 인터페이스 자체에 고정되어 필요한 정보를 인식할 수 있는 장치
    • Canvas를 생성하여 각종 HUD, 스테이터스 등을 구현할 수 있다.

    • HUD 스크립트를 생성하여 GunHolder에서 지정한 총알 값을 불러온다.
public class HUD : MonoBehaviour
{

    // 필요한 컴포넌트
    [SerializeField]
    private GunController theGunController;
    private Gun currentGun;

    // 필요하면 HUD 호출, 필요 없으면 HUD 비활성화
    [SerializeField]
    private GameObject go_BulletHUD;

    // 총알 개수 텍스트에 반영
    [SerializeField]
    private Text[] text_Bullet;

   
    // Update is called once per frame
    void Update()
    {
        CheckBullet();
    }

    private void CheckBullet()
    {
        currentGun = theGunController.GetGun();
        text_Bullet[0].text = currentGun.carryBulletCount.ToString();
        text_Bullet[1].text = currentGun.reloadBulletCount.ToString();
        text_Bullet[2].text = currentGun.currentBulletCount.ToString();
        //인스펙터에 지정한 Bullet 값을 문자열 형태로 변환하여 불러온 뒤 배열 형태로 저장
    }
}

-> HUD 구현 완료 장면

  1. Crosshair
    • 사격 시 조준점을 구현하는 것이다.
    • 먼저 상황별 크로스헤어의 형태를 애니메이션으로 제작한다.
    • 크로스헤어 스크립트를 생성하여 상황 별 소스 코드 작성
public class Crosshair : MonoBehaviour
{
    [SerializeField]
    private Animator animator;

    // 크로스 헤어 상태에 따른 총의 정확도
    private float gunAccuracy;

    // 크로스 헤어 비활성화를 위한 부모 객체
    [SerializeField]
    private GameObject go_crosshairHUD;
    [SerializeField]
    private GunController theGunController;

    public void WalkingAnimation(bool _flag)
    {
        WeaponManager.currentWeaponAnim.SetBool("Walk", _flag);
        animator.SetBool("Walking", _flag); // 걷는 상태의 크로스헤어
    }

    public void RunningAnimation(bool _flag)
    {
        WeaponManager.currentWeaponAnim.SetBool("Run", _flag); // 달릴 때 총든 애니메이션 변화 
        animator.SetBool("Running", _flag); // 걷는 상태의 크로스헤어
    }

    public void JumpAnimation(bool _flag)
    {
        animator.SetBool("Running", _flag); // 점프 상태의 크로스헤어
    }

    public void CrouchingAnimation(bool _flag)
    {
        animator.SetBool("Crouching", _flag);// 앉는 상태의 크로스헤어
    }

    public void FineSightAnimation(bool _flag)
    {
        animator.SetBool("FineSight", _flag);// 정조준 시 크로스헤어
    }

    public void FireAnimation()
    {
        if (animator.GetBool("Walking"))
            animator.SetTrigger("Walk_Fire");
        else if (animator.GetBool("Crouching"))
            animator.SetTrigger("Crouch_Fire");
        else
            animator.SetTrigger("Idle_Fire");       
    }

    public float GetAccuracy()
    {
        if (animator.GetBool("Walking"))
            gunAccuracy = 0.06f;
        else if (animator.GetBool("Crouching"))
            gunAccuracy = 0.015f;
        else if (theGunController.getFineSightMode())
            gunAccuracy = 0.001f;
        else
            gunAccuracy = 0.035f;

        return gunAccuracy; 
        //상황 별 크로스헤어 발동 시 화면의 확대 정도를 조정
    }
  1. Status
    • 스테이터스를 통해 현재 플레이어의 체력, HP, 몬스터의 HP 등을 표시한다.
    • 에셋 이미지를 통해 구현도 가능하지만, Canvas 생성을 통해 구현 진행.
public class StatusSP : MonoBehaviour
{
    public Slider SPbar; //스테이터스 바 선언
    [SerializeField]
    public int  maxSp; //최대 스테이터스 
    public int currentSP;//현재 스테이터스

    // 스태미나 증가량
    [SerializeField]
    private int spIncreaseSpeed;

    // 스태미나 재회복 딜레이.
    [SerializeField]
    private int spRechargeTime;
    private int currentSpRechargeTime;

    private bool spUsed;


    // Start is called before the first frame update
    void Start()
    {
        SPbar.value = maxSp;
    }

    // Update is called once per frame
    void Update()
    {
        GaugeUpdate();
        SPRechargeTime();
        SPRecover();
    }

    private void SPRechargeTime()
    { //HP 및 각종 상태를 회복 또는 초기화하는 동안의 복귀 시간
        if (spUsed)
        {
            if (currentSpRechargeTime < spRechargeTime)
                currentSpRechargeTime++;
            else
                spUsed = false;  
        }

    }

    private void SPRecover()
    {
        if (!spUsed && currentSP < maxSp)
        {
            currentSP += spIncreaseSpeed;  
            //HP 및 각종 상태 회복
        }
    }

    private void GaugeUpdate()
    {
        SPbar.value = currentSP; 
        //스테이터스 값을 현재 값으로 수정 반영
    }

    public void DecreaseStamina(int _count)
    {
        spUsed = true;
        currentSpRechargeTime = 0;

        if (currentSP - _count > 0)
            currentSP -= _count; 
        // 현재 스테이터스 0이상이면 지속적으로 감소
        else
            currentSP = 0;
    }

    public int GetCurrentSP()
    {
        return currentSP;
    }
}

-> 스크립트 적용 후 걸을 때마다 스테미나가 감소하는 모습

  1. Creature Status - Camera
    • 총으로 몬스터 또는 돼지를 사격하면 해당 오브젝트의 HP가 감소하며 죽는다.
    • Creature Status를 보기 위한 카메라에 대한 스크립트 생성
public class MonsterHp : MonoBehaviour
{
    [SerializeField] GameObject go = null;

    List<Transform> m_objectList = new List<Transform>();
    List<GameObject> m_hpBarList = new List<GameObject>();

    Camera m_cam = null;
    // Start is called before the first frame update
    void Start()
    {
        m_cam = Camera.main; //UI 확인을 위한 카메라

        GameObject[] t_objects = GameObject.FindGameObjectsWithTag("NPC"); // NPC 태그의 오브젝트들에게 적용
        for(int i = 0; i < t_objects.Length; i++)
        {
            m_objectList.Add(t_objects[i].transform);
            GameObject t_hpbar = Instantiate(go, t_objects[i].transform.position, Quaternion.identity, transform);
            m_hpBarList.Add(t_hpbar);
            //NPC 태그의 오브젝트들에게 적용시킬 hp 스테이터스를 리스트에 추가한다.
        }
    }



    // Update is called once per frame
    void Update()
    {
        for(int i = 0; i< m_objectList.Count; i++)
        {
            m_hpBarList[i].transform.position = m_cam.WorldToScreenPoint(m_objectList[i].position + new Vector3(0, 1.8f, 0));
            // 스테이터스를 게임 화면에서 볼 수 있게 한다.
            if (m_hpBarList[i].transform.position.z < 0.0f)
            {
                m_hpBarList[i].transform.position *= -1.0f;
            } // z값이 반전, 즉 3D 공간에서 반대로 고개를 돌려도 스테이터스가 나타나지 않도록 방지
        }
    }
}
  • 문제점 : 매우 먼 거리에서도 Creature Status가 확인되고 있음 -> 수정 요망
  1. Creature Status - Hp Down
    • Creature의 HP가 감소되는 알고리즘의 스크립트 생성
    • 인스펙터에서 설정한 최대 HP, 총 데미지에 따라 Hp 스테이터스가 반응한다.
public class MonsterHp1 : MonoBehaviour
{
    public Slider Pig_Hpbar;
    [SerializeField]
    public int maxHp;
    public int currentHP;
    // Start is called before the first frame update
    void Start()
    {
        Pig_Hpbar.value = maxHp; 
        //돼지 오브젝트와 스테이터스바를 연결
    }

    // Update is called once per frame
    void Update()
    {
        GaugeUpdate();
    }

    private void GaugeUpdate()
    {
        Pig_Hpbar.value = currentHP; 
        //현재의 기본 HP 업데이트
    }

    public void DecreaseHP(int _count)
    {
        if (currentHP > 0)
        {
            currentHP -= _count;
        } // 타격 횟수를 count로 받아 돼지의 HP를 감소

        if (currentHP <= 0)
            currentHP = 0;
    }



    public int GetCurrentHP()
    {
        return currentHP;
    }

}

-> 모든 스크립트 적용 후 공격 시 HP가 감소하는 돼지

profile
A little strange but passionate, sincere hard worker.

0개의 댓글