38. 3D 쿼터뷰 게임 제작 - 플레이어 점프 회피
점프 구현
void OnJump()
{
pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
}
addForce를 이용해 간단하게 점프 구현
하지만 이 코드만으론 무한 점프가 지속된다는 문제가 생김
void OnJump()
{
if (!isJumping)
{
pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
isJumping = true;
}
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
isJumping = false;
}
OnCollisionEnter() 함수를 이용해 착지 구현
점프와 닷지는 트리거를 이용해 구현, 하지만 점프는 착지모션이 또 따로 있기 때문에 플래그 변수도 하나 생성
Dodge 애니메이션에 들어가는건 따로 Exit Time을 설정할 필요가 없으나
Dodge애니메이션에서 나가는건 따로 Exit Time 이 있어야 애니메이션이 모두 재생되고 자동으로 Exit로 감
점프하는 순간에 트리거 발생, 착지하는 순간에 플래그 false로 변경
void OnJump()
{
if (!isJumping)
{
pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
animator.SetBool("isJump", true);
animator.SetTrigger("doJump");
isJumping = true;
}
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Floor")
{
isJumping = false;
animator.SetBool("isJump", false);
}
}
기존 함수를 이용해서 애니메이션 재생을 설정
중력값을 조절해서 점프해서 내려가는 속도 조절가능
지형 물리 강화
모든 지형 물리를 정적으로 변경
*Collision Detection > Continious는 Static일 때 훨신 효과적으로 작용함
리지드바디에서 Is Kinematic을 켜면 직접 움직이지 않는다면 오브젝트가 움직이지 않음
마찰력 없는 벽을 만들기위해 Physics Material 추가
회피 구현
void OnDodge()
{
if (!isDodge)
{
playerSpeed *= 2;
animator.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.4f);
}
}
void DodgeOut()
{
playerSpeed /= 2;
isDodge = false;
}
점프와 비슷하게 회피 또한 구현
Invoke 함수를 이용해 회피에서 나가는 시간을 설정해 연속 회피가 불가능하게 함
void OnJump()
{
if (!isJumping && !isDodge)
{
pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
animator.SetBool("isJump", true);
animator.SetTrigger("doJump");
isJumping = true;
}
}
void OnDodge()
{
if (!isDodge && moveVec != Vector3.zero && !isJumping)
{
playerSpeed *= 2;
animator.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.4f);
}
}void OnJump()
{
if (!isJumping && moveVec == Vector3.zero && !isDodge)
{
pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
animator.SetBool("isJump", true);
animator.SetTrigger("doJump");
isJumping = true;
}
}
void OnDodge()
{
if (!isDodge && moveVec != Vector3.zero && !isJumping)
{
playerSpeed *= 2;
animator.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.4f);
}
}
회피 중에는 점프를 못하도록, 점프 도중에는 회피를 못하도록 조건을 추가
또한 제자리에선 회피를 못하도록함
void OnDodge()
{
if (!isDodge && moveVec != Vector3.zero && !isJumping)
{
//dodgeVec에 움직임 방향 고정
dodgeVec = moveVec;
playerSpeed *= 2;
animator.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut", 0.4f);
}
}
void Move()
{
//무브 벡터가 0이 아니면 isRun 재생
animator.SetBool("isRun", moveVec != Vector3.zero);
animator.SetBool("isWalk", isWalking);
//만약 회피중이면 방향 고정
if (isDodge)
moveVec = dodgeVec;
if (isWalking)
{
transform.position += moveVec * playerSpeed * Time.deltaTime * 0.3f;
}
else
{
transform.position += moveVec * playerSpeed * Time.deltaTime;
}
}
회피 중에는 방향 전환을 못하도록
회피할때 dodgeVec에 현재 방향 벡터를 저장해서 회피를 시도할때만 방향 고정시킴