https://www.youtube.com/watch?v=eZ8Dm809j4c&list=PLO-mt5Iu5TeYkrBzWKuTCl6IUm_bA6BKy&index=2
1. 코드정리
FixedUpdate안에 함수를 입력하는 방식으로 정리
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
...
void FixedUpdate()
{
GetInput();
Move();
Turn();
}
void GetInput(){
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk");
}
void Move(){
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
}
void Turn(){
transform.LookAt(transform.position + moveVec);
}
...
}
2. 점프 구현
bool 변수 선언 후 , GetButtonDown()으로 점프 입력 받기
bool jDown;
Rigidbody rigid;
void Awake()
{
...
rigid = GetComponent<Rigidbody>();
}
void GetInput(){
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk");
jDown = Input.GetButton("Jump");
}
void Jump(){
if(jDown && !isJump){
rigid.AddForce(Vector3.up*15,ForceMode.Impulse);
}
}
> 물리적 제어을 위해 rigidbody선언 및 초기화
> AddForce() 함수로 물리적인 힘을 가하기
◆ForceMode의 종류
1. 연속적인 힘
●무게를 적용, ForceMode.Force
●무게를 무시, ForceMode.Acceleration
2. 순간적인 힘
●무게를 적용, ForceMode.Impulse
●무게를 무시, ForceMode.VelocityChange
무한 점프를 막기 위한 제약 조건 생성
bool isJump;
void Jump(){
if(jDown && moveVec == Vector3.zero && !isJump && !isDodge){
rigid.AddForce(Vector3.up*15,ForceMode.Impulse);
isJump = true;
}
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
isJump = false;
}
}
> isJump 변로 점프 상태 확인
> OnCollisionEnter() 이벤트 함수로 착지 구현
> OnCollisionEnter의 매개변수 collision의 tag가 Floor일 경우 false로 초기화
바닥 오브젝트의 태그를 새로 추가하여 지정
>Add Tag를 눌러서 Floor 태그를 추가한뒤 Floor 오브젝트에 적용해준다.
점프와 회피 애니메이션을 드래그 드랍을 통해 배치하고 트랜지션을 정의한다.
>일회성 애니메이션은 Trigger 파라메터 사용(doJump, doDodge)
>jump는 끝났음을 전달해야 함으로 bool형 파라미터 생성(isJump)
>Transition의 Condition에 파라메터 등록
>Transition Duration 조정
컨트롤을 위한 스크립팅 작업
public class Player : MonoBehaviour
{
bool isJump;
bool isDodge;
...
void Jump(){
if(jDown && moveVec == Vector3.zero && !isJump && !isDodge){
...
anim.SetBool("isJump",isJump);
anim.SetTrigger("doJump");
...
}
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
...
anim.SetBool("isJump", isJump);
}
}
}
중력 설정 변경(더 세게)
> Edit>Project Settings>Physics에서 중력 설정
3. 지형 물리 강화
> WorldSpace의 우측 상단 static을 눌르고 Yes, change children을 통해 모든 자식들을 Static으로 설정
> Collision Dection > Continuous는 Static과 충돌할 때 효과
지형 오브젝트에 리지드 바디 추가 (Use Gravitiy 해제)
●벽 마찰 방지를 위한 Physics Material
▷Physics Material : 물체의 물리성질 정의
▷0 0 0 Min 설정후 적용
4. 회피 구현
회피
bool isDodge;
void Dodge()
{
if (jDown && !isJump)
{
speed *= 2;
anim.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut",0.4f);
}
}
void DodgeOut()
{
speed *= 0.5f;
isDodge = false;
}
> invoke("함수이름", 딜레이) 함수로 시간차 함수 호출
움직임을 조건으로 추가해서 점프와 회피로 나누기
void Jump(){
if(jDown && moveVec == Vector3.zero && !isJump && !isDodge){
void Dodge()
{
if (jDown && moveVec!=Vector3.zero && !isJump && !isDodge)
Dodge 회피 애니메이션 speed 3설정(알맞게)
◆회피시 방향 고정
Vector3 moveVec;
Vector3 dodgeVec;
void Dodge()
{
if (jDown && moveVec!=Vector3.zero && !isJump && !isDodge)
{
dodgeVec = moveVec;
...
}
}
void Move(){
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
if (isDodge)
moveVec = dodgeVec;
...
}
> 회피중이라면 moveVec을 dodgeVec으로 초기화하여 변경 못하게 고정
깃허브 올리기
Commit : ver 1.2
Description : Player Jump & Dodge
https://github.com/mekain80/CloneCode_GoldMetal3D
'게임개발 > 3D_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_골드메탈_3D] 5. 아이템 먹기 & 공전물체 만들기 (0) | 2023.07.15 |
---|---|
[클론코딩_골드메탈_3D] 4. 드랍 무기 입수와 교체 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 3. 아이템 만들기 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 1. 플레이어 이동 (0) | 2023.07.02 |