3-유니티 플랫포머 마이크로 공부 (Platformer Microgame)- player직접 구현
일단 캐릭터를 구현하기 위해서 에셋이 필요하고 이 에셋을 잘라 쓰기 위해선
밑에 설명처럼 하여야 한다.
sprite mode 멀티플로 바꿔 줘야 됨 사진을 찌를 때
그리고 Sprite Editor을 클릭
이런 화면이 뜨는데 slice를 해주고
슬라이스 타입을 Gird By Cell Size로 해주고
Pixel size를 원래 사이즈와 똑같이 128 126으로 나눠 주겠습니다.
야무지게 잘렸네요
제일 앞에 있는 이미지 하나 씬에 나 두고
캐릭터 전부를 드래그해서 처음 씬에 나돈 이미지에 드래그해서 넣어주세요
아까 씬에 옮긴 캐릭터 이름을 player로 저는 바꿨습니다
드래그해서 넣으면 이런 창이 하나 뜨는데
저는 player_stand라고 이름을 하나 지을게요
두 개의 파일이 생겼습니다
player은 Animator Conroller입니다
이 두 개가 생기면
캐릭터가 살아 숨시기 시작할 거예요
코드를 하나 생성해 주고
캐릭터에 입혀줍니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float maxSpeed;
Rigidbody2D rigid;
void Awake()
{
rigid= GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
float x = Input.GetAxis("Horizontal");
rigid.AddForce(Vector2.right * x, ForceMode2D.Impulse);
if (rigid.velocity.x > maxSpeed) //오른쪽으로 이동 + 최대 속력을 높으면
rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y); //해당 오브젝트의 속력은 maxSpeed
//Max speed left
else if (rigid.velocity.x < maxSpeed * (-1)) // 왼쪽으로 이동 -
rigid.velocity = new Vector2(maxSpeed * (-1), rigid.velocity.y); //y값은 점프의 영향이므로 0으로 제한을 두면 안됨
}
}
//Vector2 지정된x,y구성요소로 새벡터 생성
// right는 (1,0) 을 나타냄
코드를 간결하게 설명하자면 키보드로 이동할 수 있게 만들어주고
최고 속력을 정하여 가속도를 받지 않게 만들어 줍니다!
그리고 Player에 이 두 속성을 넣어주고
Linear Drag 2로 해주고
2D는 마찰력/탄성력 등
존재하기 때문에
밑에 땅바닥 부분에
Physical Material2D를 넣어 줘야 됩니다.
캐릭터가 밑에 바닥으로 인식하고 자기가 원하는 대로 움직입니다.
이제 jump. 도 구현 해줄 건데
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float maxSpeed;
Rigidbody2D rigid;
SpriteRenderer spriterenderer;
Animator animator;
public float jumpPower;
void Awake()
{
rigid= GetComponent<Rigidbody2D>();
spriterenderer= GetComponent<SpriteRenderer>();
animator= GetComponent<Animator>();
}
void Update()
{
if (Input.GetButton("Horizontal")) // 방향키 입력이 들어오면 실행
spriterenderer.flipX = Input.GetAxisRaw("Horizontal") == -1; // -1 (왼쪽이면, flipX true(체크))
// 버튼에서 손을 떄는 등의 단발적인 키보드 입력은 FixedUpdate보다 Update에 쓰는게 키보드 입력이 누락될 확률이 낮아짐
//Stop speed
if (Input.GetButtonUp("Horizontal"))
{ // 버튼에서 손을 때는 경우
// normalized : 벡터 크기를 1로 만든 상태 (단위벡터 : 크기가 1인 벡터)
// 벡터는 방향과 크기를 동시에 가지는데 크기(- : 왼 , + : 오)를 구별하기 위하여 단위벡터(1,-1)로 방향을 알수 있도록 단위벡터를 곱함
rigid.velocity = new Vector2(0.5f * rigid.velocity.normalized.x, rigid.velocity.y);
}
if (Mathf.Abs(rigid.velocity.x) < 0.3)
//속도가 0 == 멈춤 으로 할려했으나 애니메이션이
// 그이후로 계속 걷는 행동을 보임 그래서 0.3 정도 해주는게 좋음
animator.SetBool("lsRun", false); //IsRun 변수 : false
else// 이동중
animator.SetBool("lsRun", true);
if (Input.GetButtonDown("Jump"))
rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
if (rigid.velocity.x > maxSpeed) //오른쪽으로 이동 (+) , 최대 속력을 넘으면
rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y); //해당 오브젝트의 속력은 maxSpeed
//Max speed left
else if (rigid.velocity.x < maxSpeed * (-1)) // 왼쪽으로 이동 (-)
rigid.velocity = new Vector2(maxSpeed * (-1), rigid.velocity.y); //y값은 점프의 영향이므로 0으로 제한을 두면 안됨
}
}
//Vector2 지정된x,y구성요소로 새벡터 생성
// right는 (1,0) 을 나타냄
자세한 내용은 주석에 다 넣어 뒀는데
이 코드를 설명하자면 캐릭터가 자연스럽게 움직이고
점프할 수 있는 그런 메커니즘이다.
실제 게임에서는 코드의 가독성도 좋지 않고 이런 식으로
만들지는 않겠지만 구현을 해본 것으로 만족하고 다시 좀 더 배경이나, 오디오 부분들을 확인해봐야겠다.