
강의를 통해 Unity3D에 대해 학습하고 Unity3D의 캐릭터 이동과
물리 처리를 직접 구현하는 과제를 만들어 보겠습니다.
강의를 다 듣고 이제 개인 과제를 시작하게 되었다.
벌써 어질어질한데 일단 강의에서 했던 내용들은 토대로 차근차근 해볼 생각이다.
강의에서 사용했던 InputSystem을 활용하였다.
이동 및 점프를 먼저 구현을 했고, 달리기도 한번 추가해보았다.
이동과 점프는 강의에서의 내용과 똑같기 때문에 제쳐두고,
달리기 부분만 한번 보겠다.
public bool isRun;
public float runStamina;
-------------생략-------------
if (isRun)
{
dir *= runSpeed;
}
else
{
dir *= moveSpeed;
}
달리기 상태인지 체크하는 변수와 달리기 속도 변수를 사용하여
해당 상태에 따라 추가되는 속도를 달리 하였다.
public void OnRun(InputAction.CallbackContext context)
{
if (context.phase == InputActionPhase.Performed)
{
isRun = true;
if (staminaCoroutine != null)
{
StopCoroutine(staminaCoroutine);
}
staminaCoroutine = StartCoroutine(UseStaminaTime());
}
else if (context.phase == InputActionPhase.Canceled)
{
isRun = false;
if (staminaCoroutine != null)
{
StopCoroutine(staminaCoroutine);
staminaCoroutine = null;
}
}
}
달리기 상태의 유무는 OnRun을 통해서 체크했고,
shift키를 눌르고 있을때는 true, 아닐때는 false로 해주었다.
발생한 문제
위의 코드는 해결한 후의 코드이기 때문에 이미 기입이 되있긴하다.
달리기 상태에서 스태미너가 계속 소비하게 하고 싶었는데
처음 한번 눌렀을때만 스태미너가 소비 됬다.
해결
코루틴을 사용하여 스태미너 소비를 0.1초마다 계속되게 해주었다.
private IEnumerator UseStaminaTime()
{
while (isRun)
{
CharacterManager.Instance.Player.condition.UseStamina(runStamina);
yield return new WaitForSeconds(0.1f);
}
}

어떤 식으로 체력을 닳게 만들까 하다가 그냥 시간에 따라서 계속해서 닳게 만들었다.
추가로 스태미너바를 구현해보았다.
health.Subtract(healthDecay * Time.deltaTime);
if (!CharacterManager.Instance.Player.controller.isRun)
{
stamina.Add(stamina.passiveValue * Time.deltaTime);
}
if(stamina.curValue < CharacterManager.Instance.Player.controller.needStamina)
{
CharacterManager.Instance.Player.controller.isRun = false;
}
-----------------------------------------------------------------
private void Update()
{
uiBar.fillAmount = GetPersentage();
}
float GetPersentage()
{
return curValue / maxValue;
}
public bool UseStamina(float amout)
{
if (stamina.curValue - amout < 0f)
{
return false;
}
stamina.Subtract(amout);
return true;
}
해당 방식을 이용하여 체력과 스태미너를 UI 반영하였다.
발생한 문제
마찬가지로 해당 코드는 해결 후의 코드다.
달리기 상태에서 회복이 계속 되어 닳지 않았고 이후 달리기 키를 때고 난 후에도
계속 바가 닳고 달리기 상태가 지속되는 문제가 발생했다.
해결
if (!CharacterManager.Instance.Player.controller.isRun)
{
stamina.Add(stamina.passiveValue * Time.deltaTime);
}
if(stamina.curValue < CharacterManager.Instance.Player.controller.needStamina)
{
CharacterManager.Instance.Player.controller.isRun = false;
}
스태미너 회복에 조건문을 추가하여 달리기 상태가 아닐때만 회복되게 변경했다.
만약 현재 스태미나가 요구치 미만일때는 isRun을 false로 해줘서 달리기 상태를 변경해줬다.

발제자료에서 Impulse를 사용하여 구현하면 된다고 나와있었다.
오브젝트 하나를 추가하고 스크립트를 달아줘서 점프대를 구현하기로 했다.
public float jumpForce = 300f;
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Rigidbody player = other.GetComponent<Rigidbody>();
if (player != null)
{
player.velocity = new Vector3(player.velocity.x, 0f, player.velocity.z);
player.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
해당 오브젝트에 트리거 되었을때 Player tag일때 플레이어의 rigidbody를 가지고와서
ForceMode.Impulse 해주었다.
혹시 몰라서 위치도 한번 초기화 해줬다.
발생한 문제
좀 부끄럽긴하지만 아무튼 문제가 있긴 했다.
발판을 밟았는데 점프가 안되었다.
해결
"아무튼 태그를 달아"
태그를 설정 안해줬던 것 이었다...ㅋ

레이어만 설정해주고 왜 안되지 하고 있었다.
저번에도 이랬던 것 같은데 자꾸 까먹게 된다. ㅎㅎ

그래도 필수 기능의 대부분이 강의에서 했던 내용들이라서
크게 막히는 부분없이 진행이 되었던 것 같다.
강의의 내용을 한번 더 복습하는 느낌이 들기도 해서 아주 좋은 것 같다.