★ 1인칭 캐릭터 생성
비전 운동의 구현(1인칭)
캐릭터 이동 구현 → 높은 곳에서 낙하 시 중력 구현
점프 구현(강체 기능 구현)
w, s, a, d 키를 이용하여 캐릭터의 움직임을 구현해 봅시다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 캐릭터 컨트롤러 가져오기
private CharacterController controller;
// 이동속도
(SerializeField) float moveSpeed = 5;
private void Start()
{
// 캐릭터 컨트롤러 컴포넌트 저장하기
controller = GetComponent<CharacterController>();
}
void Update()
{
if(Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
}
if(Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
}
if(Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
}
if(Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);
}
}
}
제가 처음에 작성한 코드입니다.
Space.World(세계 좌표)에 들어가면 플레이어가 능동적으로 움직일 수 있도록 동작이 이상해집니다.
방금 제거 (로컬 좌표)하고 요청대로 움직임이 구현되었습니다.
물론 이 코드는 이동하지만 화살표 키 값을 포함하기에는 코드가 너무 복잡해집니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 캐릭터 컨트롤러 가져오기
private CharacterController controller;
// 이동하기
(SerializeField) float moveSpeed = 5;
private void Start()
{
// 캐릭터 컨트롤러 컴포넌트 저장하기
controller = GetComponent<CharacterController>();
}
void Update()
{
// 이동 구현
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveX + transform.forward * moveY;
controller.Move(move * Time.deltaTime * moveSpeed);
}
Input.GetAxis(“가로”); 변수 moveX, Input.GetAxis(“수직”); moveY 변수에 저장됩니다.
(가로, 세로 키 사용 시 a, s, d, w 키 외에 방향키로도 이동이 가능합니다.)
그리고 변수의 이동 값을 얻습니다. move.the.controller 컨트롤러로 이동합니다.
이 시점에서 Vector3 move = transform.right * moveX + transform.forward * moveY; ~이다
Vector3 move = new Vector3(moveX, 0f, moveY); 로 대체할 수도 있습니다.

아주 부드럽게 움직입니다.
후회. . .. 높은 빌딩 위로 올라가서 그 선수가 넘어지면 그대로 넘어지지 않는다.
그것은 공중에서 같은 장소에 머문다. 중력이 구현되지 않기 때문입니다.
중력 값을 입력하겠습니다.
중력 값을 지정할 때 낙하 높이 h를 계산하는 공식
h(높이) = ½ *중력*t ²
h(높이) = 0.5f * 중력 * ( t * t )
중력 = 중력. 중력은 기본적으로 9.81f 의 값을 가집니다.
여기서 t는 떨어지는 시간오전.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 캐릭터 컨트롤러 가져오기
private CharacterController controller;
// 이동하기
(SerializeField) float moveSpeed = 5;
// 중력
private float gravity = -9.81f;
private Vector3 fall; // 기본 값은 (0,0,0)이다
private void Start()
{
// 캐릭터 컨트롤러 컴포넌트 저장하기
controller = GetComponent<CharacterController>();
}
void Update()
{
// 이동 구현
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveX + transform.forward * moveY;
controller.Move(move * Time.deltaTime * moveSpeed);
// 중력 구현
fall.y += 0.5f * gravity * Time.deltaTime;
controller.Move(fall * Time.deltaTime);
// -9.8을 곱했기 때문에 마이너스 좌표로 (아래로)떨어진다
}
}
중력 구현은 y 좌표만 움직이도록 낙하를 구현하는 것입니다.
Vector3 케이스 변수의 기본값은 Vector3의 기본값입니다. (0,0,0) 오전.
벡터 기본값 += 0.5f * 중력 * Time.deltaTime을 사용한 낙하 낙하 값; 찾고있는
컨트롤러에 적용됩니다.
중력은 처음에 음수인 -9.81f이므로 y좌표를 따라 떨어집니다.

위에서 떨어졌을 때 잘 떨어졌습니다.
★ 1인칭 캐릭터 생성
비전 운동의 구현(1인칭)
캐릭터 이동 구현
점프 구현(강체 기능 구현) → Ground Collider를 활성화하여 지상에서만 점프 수행
중력도 포함되어 있으니 짬뿌를 구현해보자.
스페이스 바를 누르면 점프가 수행됩니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 캐릭터 컨트롤러 가져오기
private CharacterController controller;
// 이동하기
(SerializeField) float moveSpeed = 5;
// 중력
private float gravity = -9.81f;
private Vector3 fall; // 기본 값은 (0,0,0)이다
// 점프할 높이
(SerializeField) float jumpHeight = 10f;
private void Start()
{
// 캐릭터 컨트롤러 컴포넌트 저장하기
controller = GetComponent<CharacterController>();
}
void Update()
{
// 이동 구현
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveX + transform.forward * moveY;
controller.Move(move * Time.deltaTime * moveSpeed);
// 점프 구현
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
// 중력 구현
fall.y += 0.5f * gravity * Time.deltaTime;
controller.Move(fall * Time.deltaTime);
}
void Jump()
{
fall.y = Mathf.Sqrt(-2f * gravity * jumpHeight);
}
}
별도의 점프 방법을 작성했습니다.
점프 높이를 10f로 설정하고 인스펙터 창에서 빼면 재생 중에 조정할 수 있습니다.
중력에 대항하여 +y좌표(위 방향)로 올라가야 하므로 점프 높이(점프를 하기 위한 높이)를 곱한다.
일단 점프력 계산 공식 Mathf.Sqrt(-2f * 중력 * 점프 높이); 말하다…
여기서 -2+는 -9.81f라는 값에 중력이 들어갔으니 +를 곱해서 올라가면 마이너스가 됩니다.
수학 Sqrt 함수 자세한 내용은 이 기사를 확인하십시오…
Function Mathf.Sqrt( ) :: 보고싶은 기록장 공부하기(tistory.com)
하지만 솔직히 왜 이 공식을 사용해야 하는지 아직도 모르겠습니다…
머리로는 이해할 수 없을 정도로 수학적인 것입니다.
왜 2가 들어가는지 아는사람? …나중에 알게 되면 게시물에 추가하겠습니다.
이 -2에 -0.5f를 넣으면 구현이 잘 작동합니다…
점프 후 좀 더 자연스럽게 착지하고 싶다면 중력 값(heavy)을 더 줄일 수 있습니다.
중력 값을 -30으로 했더니 자연스러워졌어요!
점프 버튼이 지면에서만 작동하도록 그라운드 테스트를 수행하십시오.
(공중에서 조금 점프하지 마십시오)
빈 개체를 만들어 플레이어의 발 아래에 놓습니다.
(바닥을 확인하는 물체)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 캐릭터 컨트롤러 가져오기
private CharacterController controller;
// 이동하기
(SerializeField) float moveSpeed = 5;
// 중력
private float gravity = -30f;
private Vector3 fall; // 기본 값은 (0,0,0)이다
// 점프할 높이
(SerializeField) float jumpHeight = 10f;
// 그라운드 체크
public Transform groundCheck;
(SerializeField) private float checkRange = 0.5f;
(SerializeField) private LayerMask groundMask;
private void Start()
{
// 캐릭터 컨트롤러 컴포넌트 저장하기
controller = GetComponent<CharacterController>();
}
void Update()
{
// 그라운드 체크 구현 (땅에 있을 때만 짬푸 구현)
bool isGround = IsGroundCheck();
if(isGround == true && Input.GetKeyDown(KeyCode.Space))
{
// fall.y 가 마이너스 값을 계속 누적해서 받는 것을 방지
fall.y = -3;
}
// 이동 구현
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveX + transform.forward * moveY;
controller.Move(move * Time.deltaTime * moveSpeed);
// 점프 구현
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
// 중력 구현
fall.y += 0.5f * gravity * Time.deltaTime;
controller.Move(fall * Time.deltaTime);
}
void Jump()
{
fall.y = Mathf.Sqrt(-2f * gravity * jumpHeight);
}
bool IsGroundCheck()
{
return Physics.CheckSphere(groundCheck.position, checkRange, groundMask);
}
}
필드 선언 부분에서 객체를 선언하고 인스펙터 창으로 드래그합니다.
플레이어가 바닥에 있고 fall.y가 0보다 작으면 fall.y = -3입니다. 그것을 초기화
더 점프 -값은 누적됩니다.왜냐하면 그것은
bool 타입으로 지면에 위치하면 메소드가 실행됩니다.
Physics.CheckSphere(레이어, 반경 영역, 레이어를 찾을 위치); 기능이 있습니다
반지름 내의 모든 평면을 찾는 기능오전.
미리 토양 층을 추가하고 모든 층을 바닥에 놓습니다.
그리고 검사 창에서 접지 마스크에 적절한 레이어를 할당합니다.
범위는 0.5f로 설정됩니다. 점프 후 그라운드 체크(플레이어의 발)가 지면에 닿기 전에 속도가 0.5 반경에서 1로 변경됩니다.
전체 코드
↓
PlayMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// 캐릭터 컨트롤러 가져오기
private CharacterController controller;
// 이동하기
(SerializeField) float moveSpeed = 5;
// 중력
private float gravity = -30f;
private Vector3 fall; // 기본 값은 (0,0,0)이다
// 점프할 높이
(SerializeField) float jumpHeight = 10f;
// 그라운드 체크
public Transform groundCheck;
(SerializeField) private float checkRange = 0.5f;
(SerializeField) private LayerMask groundMask;
private void Start()
{
// 캐릭터 컨트롤러 컴포넌트 저장하기
controller = GetComponent<CharacterController>();
}
void Update()
{
// 그라운드 체크 구현 (땅에 있을 때만 점프 구현)
bool isGround = IsGroundCheck();
if(isGround == true && Input.GetKeyDown(KeyCode.Space))
{
// fall.y 가 마이너스 값을 계속 누적해서 받는 것을 방지
fall.y = -3;
}
// 이동 구현
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveX + transform.forward * moveY;
controller.Move(move * Time.deltaTime * moveSpeed);
// 점프 구현
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
// 중력 구현
fall.y += 0.5f * gravity * Time.deltaTime;
controller.Move(fall * Time.deltaTime);
}
void Jump()
{
fall.y = Mathf.Sqrt(-2f * gravity * jumpHeight);
}
// 그라운드 체크
bool IsGroundCheck()
{
return Physics.CheckSphere(groundCheck.position, checkRange, groundMask);
}
}