Bullet HUD
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 구현 완료 장면
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;
//상황 별 크로스헤어 발동 시 화면의 확대 정도를 조정
}
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;
}
}
-> 스크립트 적용 후 걸을 때마다 스테미나가 감소하는 모습
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 공간에서 반대로 고개를 돌려도 스테이터스가 나타나지 않도록 방지
}
}
}
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가 감소하는 돼지