https://www.youtube.com/watch?v=Z4iULRbiSTg&list=PLO-mt5Iu5TeZGR_y6mHmTWyo0RyGgO0N_&index=3&t=51s
위 영상을 보고 따라가는 중이다.
Assets 폴더에 Scripts 폴더를 만들어주고
PlayerMove 스크립트 파일을 생성한다.
그 파일을 Player sprite에 드래그 해주면 Inspector에 스크립트 창이 생긴다.
스크립트 이름을 더블클릭해주면 VS에서 소스를 수정할 수 있다.
코드를 짜다가 문제가 하나 있었는데
영상에서 보면 Rigidbody2D라던가
GetComponent같은 것들은 이미 유니티에서 구현이 된 클래스나 기능들인 것 같은데
나는 자동완성이 되지 않았다.
그래서 알고봤더니 아래 블로그와 같은 문제였다!
유니티, 비주얼스튜디오 자동완성(인텔리센스)가 안될때 해결 방법.
안녕하세요. 주투리아입니다. 어저께 컴퓨터가 먹통이 되면서 윈도우를 초기화했더니 설치되었던 프로그램...
blog.naver.com
영상에서 추가한 이동 로직은 다음과 같다.
최대한 영상에 나오는 설명들을 주석에 추가했다..
일단 C#도 공부를 좀 해야할 필요가 있고 유니티에서 제공하는 기능들도 더 알아봐야할 것 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
//public 변수로 설정하면 Inspector에서 실행 중에도 값 변경 가능
public float maxSpeed;
Rigidbody2D rigid;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
//FixedUpdate는 보통 1초에 약 50회 돈다.
//1초 동안 방향키를 누르고 있으면 AddForce가 50번 입력된다.
//Move By Key Control
float h = Input.GetAxisRaw("Horizontal");
rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
//Vector2의 첫번째 파라미터는 x축 속도, 두번째 파라미터는 y축 속도?
if (rigid.velocity.x > maxSpeed) // Right Max Speed
rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
else if (rigid.velocity.x < maxSpeed*(-1)) // Left Max Speed
// 왼쪽은 마이너스 속도기 때문에 맥스 스피드에 -1 곱
rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
}
}
그리고 Assets 폴더에서 우클릭해서
Create -> 2D -> Physics Material 2D를 생성해서 Friction(마찰력)을 0으로 설정하고
모든 floor를 선택하고 Box Collider 2D에서 Material에 새로 만든 Physics Material을 드래그해서 적용해준다.
그럼 플레이어가 방향키를 한번만 눌러도 미끄러진다. 마찰력이 없기 때문에
이렇게 해주는 이유는 다음 강의에서 경사로를 올라가기 위해서라고 한다.
이 부분은 실제로 이 방법 밖에 없는건지 한번 찾아봐야겠다.
다음은 마찰력이 없는 것을 보완하기 위해 공기저항을 추가하는 것이다.
플레이어를 선택하면 Rigidbody 2D에 Linear Drag가 있다. 말그대로 해석하면 선형저항 같은데
이게 2D 게임에서는 공기저항같은 것으로 표현되나 보다.
공기저항이기 때문에 점프하고 공중에서 내려올 때도 천천히 내려오게 만들기 때문에 너무 큰 값을 주면 안된다.
Rigidbody 2D에서 Freeze Rotation에서 z축을 체크를 꼭해야 플레이어가 넘어지지 않는다.
처음에 키 입력을 하고 나서 좌우로 막 움직이니 플레이어가 넘어지고 날라가고 그랬는데 이 옵션을 줘야지 그런 현상을 막을 수 있나보다.

다음은 애니메이션 적용하기
방향키를 입력받을 때 Run 애니메이션 적용하는 방법이다.
Parameter 탭에서 +를 누르면 타입이 나오는데 이것이 애니메이션 state를 바꿀 때 필요한 변수의 타입이라고 한다.

여기서 변수를 하나 추가해주고 transition을 누르면 inspector에서 Conditions에서 +를 누르면 추가했던 파라미터를 설정할 수 있다.
그리고 아래 코드에서 보면 업데이트 부분에서 anim.setBool함수로 이용하고 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
//public 변수로 설정하면 Inspector에서 실행 중에도 값 변경 가능
public float maxSpeed;
Rigidbody2D rigid;
SpriteRenderer spriteRenderer;
Animator anim;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
//단발적인 키 입력은 Update에서 하는 것이 좋다
void Update()
{
//Stop speed
if(Input.GetButtonUp("Horizontal"))
{
//normalized : 벡터 크기를 1로 만든 상태(단위벡터) GetAxisRaw랑 비슷하다?
//normalized에 곱해주는 값이 크면 버튼을 떼도 미끄러진다.
rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.001f, rigid.velocity.y);
}
//Direction Sprite
//flipX는 bool값으로 default는 false
if (Input.GetButton("Horizontal"))
{
spriteRenderer.flipX = Input.GetAxisRaw("Horizontal") == -1;
}
//Run animation 적용
if (Mathf.Abs(rigid.velocity.x) < 0.3)
{
anim.SetBool("isRunning", false);
}
else
{
anim.SetBool("isRunning", true);
}
}
//지속적인 키 입력은 FixedUpdate에서 하는 것
void FixedUpdate()
{
//FixedUpdate는 보통 1초에 약 50회 돈다.
//1초 동안 방향키를 누르고 있으면 AddForce가 50번 입력된다.
//Move Speed
float h = Input.GetAxisRaw("Horizontal");
rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
//Vector2의 첫번째 파라미터는 x축 속도, 두번째 파라미터는 y축 속도?
//Max Speed
if (rigid.velocity.x > maxSpeed) // Right Max Speed
rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
else if (rigid.velocity.x < maxSpeed*(-1)) // Left Max Speed
// 왼쪽은 마이너스 속도기 때문에 맥스 스피드에 -1 곱
rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
}
}'Unity' 카테고리의 다른 글
| [Unity] 타일맵으로 플랫폼 만들기 (0) | 2022.08.09 |
|---|---|
| [Unity] 점프 구현하기 (0) | 2022.08.08 |
| [Unity] 프로젝트 생성과 github을 이용한 버전 관리 (0) | 2022.08.02 |
| Unity의 시작 (0) | 2022.08.02 |