요즘 레트로 유튜브 강의 "기초만 꾹꾹 눌러담은 3D 게임 만들기 [유니티 입문 강좌 BE1]"을 보면서 3D게임을 제작해보고 있습니다.
정리도 할 겸 배운 것을 블로그에 남기고자 합니다 ^~^
1. 플레이어 생성
우선 유니티에서 3D 오브젝트 sphere을 하나 생성해주고 "Player"라고 이름 지어줍니다.
그리고 Plane으로 바닥을 만들어 주었습니다.
2. 방향키를 통한 플레이어 움직임 구현
이제 바로 player 스크립트를 작성할 텐데요.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBall : MonoBehaviour {
Rigidbody rigid;
priavte void Awake() {
rigid = GetComponent<Rigidbody>();
}
private void FixedUpdate() {
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
rigid.AddForce(new Vector3(h, 0, v), ForceMode.Impulse);
}
구체 이동을 기본 transform으로 구현하면 자연스러운 이동을 할 수가 없기 때문에 물리엔진 역할을 하는 Rigidbody 컴포넌트를 추가했습니다.
그리고 Rigidbody의 function 중 하나인 AddForce를 사용했습니다.
우선 FixedUpdate 함수를 하나 만들어줍니다.
Rigidbody와 같은 물리효과를 사용할 때는 FixedUpdate에서 구현하는 것이 좋습니다.
Update는 불규칙한 호출이기 때문에 물리엔진 충돌검사가 잘 안될 수 있다고 하네요.
FixedUpdate 함수에 방향키를 넣어줄 건데요.
h 변수의 Input.GetAxisRaw("Horizontal")는 컴퓨터 왼쪽 오른쪽 방향키이며,
v 변수의 Input.GetAxisRaw("Vertiacal")는 위 아래 방향키 입니다.
그런 후 각 변수를 rigid.AddForce Vector3의 x와 z부분에 넣어줍니다.
그러면 왼쪽 오른쪽 방향키는 x 방향 이동, 위 아래 방향키는 z 방향 이동이 됩니다!
다음으로 ForceMode를 설정해주는데요.
참고로 FroceMode는 4가지가 있습니다. 간략하게 정리하면 아래와 같습니다.
1. Force : 오브젝트의 무게에 영향을 받으며 가속하는 방식
2. Acceleration : 오브젝트의 무게와 관계없이 가속하는 방식
3. Impulse : 오브젝트의 무게에 영향을 받으며 순간적으로 속도가 붙는 방식
4. VelocityChange : 오브젝트의 무게에 영향을 받지 않고 순간적으로 속도가 붙는 방식
강의에서는 Impulse를 사용했는데요. 저도 모든 방식을 적용해보니 현재 만들고자 하는 게임에 가장 적합한 방식은 Impulse더라고요.
이렇게 마무리해주면 방향키로 오브젝트를 움직을 수 있게 됩니다.
3. 점프 구현
이제 점프를 구현해볼건데요.
스크립트는 아래와 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBall : MonoBehaviour {
public float JumpPower;
public int itemCount;
bool isJump;
Rigidbody rigid;
void Awake() {
rigid = GetComponent<Rigidbody>();
}
private void FixedUpdate() {
float h = Input.GetAxisRaw("Horizontßal");
float v = Input.GetAxisRaw("Vertical");
rigid.AddForce(new Vector3(h, 0, v), ForceMode.Impulse);
}
private void Update() {
if (Input.GetButtonDown("Jump") && !isJump) {
isJump = true;
rigid.AddForce(new Vector3(0, JumpPower, 0), ForceMode.Impulse);
}
}
private void OnCollisionEnter(Collision collision) {
if (collision.gameObject.name == "Plane")
isJump = false;
}
}
JumpPower와 isJump를 변수 선언하고 Update문에서 돌려줍니다.
if 문을 써서 Input.GetButtonDoew("Jump")로 스페이스바를 누를 때 그리고 !isJump일 때 AddForce로 y값을 JumpPower로 지정해주면 스페이스바를 누를 때 점프를 하도록 구현됩니다.
여기서 문제는 점프를 한번하고 내려오면 더 이상 점프가 되지 않는건데요.
이를 해결하기 위해 OnCollisionEnter 함수를 사용해 바닥과 충돌체크 후 점프를 false로 돌려주는 함수를 구현합니다.
이렇게 오브젝트의 방향키 이동과 점프를 구현 해봤는데요.
강의를 따라서 했지만 백지에서 다시 한번 해볼까 싶습니다.
'프로그래밍⚡️ > unity' 카테고리의 다른 글
C# 유니티 상수와 열거형, 가위바위보 게임 코드 개선 (0) | 2022.07.17 |
---|---|
c# 조건문을 활용한 가위바위보 게임 만들기 (1) | 2022.07.08 |
유니티 Light 오브젝트와 스크립트로 다루기 (0) | 2022.05.22 |
unity 3D 오브젝트 회전 주기 (1) | 2022.05.10 |
unity 스플래시 데미지 구현 (1) | 2022.05.10 |