* 다크 모드를 키고 보시면 일부 텍스트가 잘 보이지 않습니다 ! *
▪에셋 출처 👨
( 남자캐릭터의 머리와 검을 없애주었다. ) ( 추후 검은 아이템으로 다시 줍게 할 예정)
본 코드는 상당수 부분을 골드메탈님의 강좌 코드를 보고 작성하였습니다.
◆ Player 움직임 스크립트
float hAxis;
float vAxis;
public float Speed;
public float JumpPower;
public float DJumpPower;
변수 선언 해준다.
float | 실수 |
int | 정수 |
public | 인스펙터에서 변경 가능 한 값 |
왠만한 연산은 int로 해야지 좀 더 빨라진다는걸 책에서 본 적 있다.
정확해지진 않더라도, 소숫점 계산하는게 굉장히 복잡해진다고..(대충요약)
bool JDown;
bool isJump;
bool isDodge;
bool wDown;
bool dDown;
bool JJDown; //더블점프 버튼
bool isJJDown; //더블 점프를 하고 있는가?
bool | 참인가 거짓인가? 조건문과 결합하면 코드의 흐름을 조절할 수 있는 강력한 도구 ⛏ |
Rigidbody rigid;
Vector3 moveVec;
Vector3 DodgeVec;
Animator anim;
Rigidbody | GameObject가 물리 제어로 동작하게 한다. |
Vector3 | 3D 공간 안에서 X,Y,Z ( 변수 선언하고 무조건 초기화 해야함 ) |
void Awake()
{
rigid = GetComponent<Rigidbody>();
anim = GetComponentInChildren<Animator>();
}
GetComponent | 게임 오브젝트의 컴포넌트를 가져오는 함수. |
void Update()
{
GetInput();
move();
Jump();
Trun();
Dodge();
}
호출 해주기.
void GetInput()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");//
wDown = Input.GetButton("Walk");//걷기
JDown = Input.GetButtonDown("Jump");//점프
JJDown = Input.GetButtonDown("Jump");//더블점프
dDown = Input.GetButtonDown("Dodge");//회피
}
GetInput() : 키 입력
(표 내용 출처 ↗)
GetAxisRaw | InputManager에 입력된 키를 누를때, 값을 반환 nagative button을 누르면 음수가, positive button을 누르면 양수가 반환 |
GetButton | 키를 눌렀을때는 true를 반환, 그렇지 않다면 false를 반환. |
GetButtonDown | 키를 눌렀을 때, 딱 한번 true를 반환 |
🚗 Horizontal,Vertical 🚗
void move()
{
moveVec = new Vector3(hAxis,0,vAxis).normalized;
if(isDodge)
moveVec = DodgeVec;
anim.SetBool("isRun",moveVec != Vector3.zero);
anim.SetBool("isWalk",wDown);
}
normalized | 방향값이 1로 보정된 백터(피타고라스) |
!=(bool) | 같지 않다. 아니다. |
anim | animator의 변수명, move는 Run상태이니, 애니메이션 Run을 Vector3.zero가 아닐때 실행되게 한다. |
Transform이동은 물리 충돌을 무시할 가능성이 있다.
일단은 RigidBody에 Collision Detection을 Continuuous로 변경.
void Trun()
{
transform.LookAt(transform.position+moveVec);
if(moveVec != Vector3.zero)
{
Quaternion newRotation = Quaternion.LookRotation(moveVec);
rigid.rotation = Quaternion.Slerp(rigid.rotation,newRotation,rorateSpeed*Time.deltaTime);
}
}
우리가 나아가는 방향으로 바라보는 스크립트
Quaternion | 오로직 회전만을 다루는. x,y,z축 직접 접근하여 변경 불가능 제공해주는 함수를 사용 해야함. |
Lookat | Look At을 이용하면 게임 오브젝트의 앞 방향이 Look At에서 지칭하는 오브젝트를 바라본다. |
MoveRotation(Qiaternion) | 목표 회전값으로 바로 회전 |
Slerp | 목표 회전 값싸지 회전 속도에 따라 천천히 회전시키는 함수 |
Time.deltatime | pc성능과는 다르게 동일한 Fps를 보여줌. |
void Jump()
{
if(JDown &&!isJump &&!isDodge)
{
rigid.AddForce(Vector3.up*JumpPower,ForceMode.Impulse);
anim.SetBool("isJump",true);
anim.SetTrigger("doJump");
isJump = true;
}
else if( JJDown &&!isDodge &&!isJJDown )
{
rigid.AddForce(Vector3.up*DJumpPower,ForceMode.Impulse);
anim.SetBool("isJJDown",true);
anim.SetTrigger("doJump");
isJJDown = true;
}
}
점프와 더블점프 구현 🏃♀️
&& | and 연산자, 양쪽 모두 true면 true |
ForceMode | 어떤식으로 힘을 전달할 것인가? |
Impulse | (누가 밀듯이)짧은 순간의 힘, 무게적용 |
1단 점프 (if)
더블 점프(else if)
더블 점프 코드는 내가 만든 코드라, 살짝 이상한데.
JJDown를 하나 더 만들어서 애니메이션 파라메터만 잘 연결 해줬다.
void Dodge()
{
if(dDown&&moveVec != Vector3.zero && !isJump &&!isDodge )
{
DodgeVec = moveVec;
Speed*=2;
anim.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut",0.5f); //밸런스 딜레이
}
}
void DodgeOut()
{
Speed *= 0.5f;
isDodge = false;
}
회피
Invoke | 함수 실행 지연 시킬 수 있다. |
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
anim.SetBool("isJump",false);
isJump = false;
anim.SetBool("isJJDown",false);
isJJDown = false;
}
}
무한 점프 제한 조건
OnCollisionEnter | Collision에 들어갔을때 실행 |
만약 Player가 닿아있는 Collision이 Floor다
그러면 isJump,isJJDonw을 false 시켜주기. ( 다시 true가 되려면 점프키를 눌러야 한다.!)
◆ Unity Tag 설정 방법 👆
floor옆에 화살표 버튼을 누르고 Add Tag 클릭
+모양을 눌러서
태그를 추가해주시면 됩니다.
중요한점은
Tag를 이용해 이런식으로 코드 작성을 해주게 되는데,
본인이 설정한 태그와 똑같이 설정해주셔야 합니다.
아니면 오류가 발생하기 때문에, 코드가 제대로 작동이 되지 않는다면 오탈자가 있는지 먼저 확인 해주세요.
◆ animator 애니메이터 설정 🍳
오른쪽 클릭후 Animator 생성후
Player에게 넣어주기.
네모난 모양은 Bool
동그란 모양은 Trigger.
스크립트에 작성한대로 + 버튼 눌러서 만들어줍니다.
파라메터.
에셋 폴더에 animation 폴더에서 마음에 들고 행동에 알맞는 애니메이션을 가지고 와서 드래그 해주면 됩니다.
보통 애니메이션 이름에 다 적혀있는데
Idle은 아무것도 하지 않는 보통의 상태일때 실행되는 애니메이션입니다.
Any State 모습입니다.
아직 설명 되지 않은.. Get,Attack 부분을 제외하고 봐주시면 되겠습니다.
Jump 부분입니다.
Any state 를 jump와 연결해주고 jump와 doubleJump를 연결 해줍니다.
Land는 착지 입니다.
any state -> jump inspector입니다.
Conditions에 + 버튼을 눌러서 trigger값을 넣어줍니다.
더블점프는 따로 만들어둔 isJJDown을 넣어줍니다.
bool값을 썼습니다.
지금 현재 (1단)점프를 하고 있는가? 를 위해서
(1단 점프후에 가능 한 조건식 )
이런식으로 애니메이션 파라메터를 연결 해 줍니다.
참! Has Exit Time 은 꺼주도록 해요
Exit으로 나갈땐 아무것도 안 넣어주시면 되겠습니다.
잘못된 점이나 궁금하신 점은
댓글로 알려주세요 !
글 읽어주셔서 감사합니다.
'🧩 코딩 > 코드 메모' 카테고리의 다른 글
선형 보간 / Lerp로 부드럽게 움직이기 (MoveTowards,Lerp, SmoothDamp 비교 ) (0) | 2022.11.29 |
---|---|
Unity Time.timeScale로 게임 내 시간 조절하기 🤸🏻♀️ (0) | 2022.10.30 |
Unity2D 물리 충돌이 되지 않을때 여러가지 해결 방법 (0) | 2022.10.23 |
Unity2D 물리 충돌이 되지 않을때(Trigger,Collider충돌) (2) | 2022.10.11 |
Unity 오류 CS0642: Possible mistaken empty statement (0) | 2022.09.27 |