Chapter 12-5. 기타 : 수영하기 (호흡 시스템)
카테고리: Unity Lesson 3
태그: Unity Game Engine
인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
🚀 수영
📜PlayerController
[SerializeField] private float swimSpeed;
[SerializeField] private float swimFastSpeed;
[SerializeField] private float upSwimSpeed;
private float applySpeed;
swimSpeed
: 수영시 속도swimSpeed
: 수영시Shift
키 눌렀을 때 속도swimFastSpeed
: 수영시Space
키로 위로 떠오를 때 속도
void Update()
{
if (isActivated && GameManager.canPlayerMove)
{
WaterCheck();
IsGround();
TryJump();
if (!GameManager.isWater) // 달리기는 수영 중이 아닐 때만
TryRun();
TryCrouch();
Move();
MoveCheck();
CameraRotation();
CharacterRotation();
}
}
private void WaterCheck()
{
if(GameManager.isWater) // 물 속 일 때
{
if (Input.GetKeyDown(KeyCode.LeftShift)) // Shift 키 누르면 swimFastSpeed 속도로.
applySpeed = swimFastSpeed;
else // 아니라면 swimSpeed 속도로.
applySpeed = swimSpeed;
}
}
private void TryJump()
{
if (Input.GetKeyDown(KeyCode.Space) && isGround && !GameManager.isWater && theStatusController.GetCurrentSP() > 0)
Jump();
else if (Input.GetKey(KeyCode.Space) && GameManager.isWater)
UpSwim(); // 스페이스 키를 꾹 누르는 중이고 물 속이라면
}
private void UpSwim()
{
myRigid.velocity = transform.up * upSwimSpeed;
}
📜WeaponManager
public IEnumerator WeaponInCoroutine() // 무기 집어넣기
{
isChangeWeapon = true;
currentWeaponAnim.SetTrigger("Weapon_Out");
yield return new WaitForSeconds(changeweaponDelayTime);
currentWeapon.gameObject.SetActive(false);
}
public void WeaponOut() // 무기 꺼내기
{
isChangeWeapon = false;
currentWeapon.gameObject.SetActive(true);
}
물 속일 땐 무기 집어넣기 위해 만든 함수. 물 밖으로 나올 땐 자동으로 현재 무기 다시 꺼냄.
📜GameManager
private WeaponManager theWeaponManager;
private bool flag = false;
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
theWeaponManager = FindObjectOfType<WeaponManager>();
}
void Update()
{
if (isOpenInventory || isOpenCraftManual || isOnComputer || isOpenArchemyTable)
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
canPlayerMove = false;
}
else
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
canPlayerMove = true;
}
if (isWater)
{
if (!flag)
{
StopAllCoroutines();
StartCoroutine(theWeaponManager.WeaponInCoroutine());
flag = true; // 1번만 실행되게 flag 사용
}
}
else
{
if (flag)
{
theWeaponManager.WeaponOut();
flag = false;
}
}
}
게임 매니저에서 물 속일 경우 무기를 집어넣게(한번만), 물 밖일 경우 무기를 꺼내게 하기.
📜CrossHair
if (!GameManager.isWater)
일 때만 여러 애니메이션들 재생
🚀 호흡 게이지
✈ 호흡 게이지 UI
Base_UI
는 테두리가 되는 배경 이미지이다. Gauge
는 가운데 진한 초록색 이미지인데 이미지 타입을 Filled
로 하여 수평으로 게이지 값에 따라 채워지게끔 할 것이다. 슬라이더처럼! 평소엔 비활성화 해둔다. 수영할 때만 활성화 할 것이기 떄문이다.
📜Water
[SerializeField] private float totalOxygen; // 100
private float currentOxygen;
private float temp;
[SerializeField] private GameObject go_BaseUI;
[SerializeField] private Text text_TotalOxygen;
[SerializeField] private Text text_currentOxygen;
[SerializeField] private Image image_gauge;
void Start()
{
originColor = RenderSettings.fogColor;
originFogDensity = RenderSettings.fogDensity;
originDrag = thePlayer.GetComponent<Rigidbody>().drag;
currentOxygen = totalOxygen; // 처음엔 100에서 출발. 여기서 점점 감소될 것.
text_TotalOxygen.text = totalOxygen.ToString();
}
void Update()
{
if (GameManager.isWater)
{
currentBreatheTime += Time.deltaTime;
if (currentBreatheTime >= breatheTime)
{
SoundManager.instance.PlaySE(sound_WaterBreathe);
currentBreatheTime = 0;
}
}
DecreaseOxygen();
}
private void DecreaseOxygen()
{
if(GameManager.isWater) // 물 속일땐 currentOxygen 1초에 1씩 감소
{
currentOxygen -= Time.deltaTime;
text_currentOxygen.text = Mathf.RoundToInt(currentOxygen).ToString(); // 정수로 텍스트UI에 저장
image_gauge.fillAmount = currentOxygen / totalOxygen; // %
if (currentOxygen <= 0) // 호흡 게이지가 0 이하면 1초에 한번씩 HP를 1씩 달게한다.
{
temp += Time.deltaTime;
if (temp >= 1)
{
thePlayer.GetComponent<StatusController>().DecreaseHP(1); // 1초에 1씩 달게
temp = 0;
}
}
}
}
private void GetInWater(Collider _player)
{
SoundManager.instance.PlaySE(sound_WaterIn);
go_BaseUI.SetActive(true); // 호흡 게이지 UI 활성화
// ...
private void GetOutWater(Collider _player)
{
SoundManager.instance.PlaySE(sound_WaterOut);
if (GameManager.isWater)
{
go_BaseUI.SetActive(false); // 호흡 게이지 UI 비활성화
// ...
물 속에 있을 땐 호흡 게이지가 점점 줄어든다. 0 이하로 떨어지면 체력도 1초에 1씩 달게 된다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기