일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- C언어 계산기 프로그램
- 입출력 관리자
- 논리 연산
- 값/참조/주소에 의한 전달
- IPv4 주소체계
- c언어 괄호검사
- 운영체제 기능
- C언어 스택 연산
- 괄호 검사 프로그램
- 회전 및 자리 이동 연산
- 문자형 배열
- 주기억장치
- C언어 덱
- getline()함수
- 범위 기반 for문
- 네트워크 결합
- auto 키워드
- 원형 연결 구조 연결된 큐
- 유형 변환
- r-value참조자
- 프로그래머스 푸드 파이트 대회
- 프로그래머스 배열만들기4
- 알고리즘 조건
- const화
- 문제해결 단계
- const l-value참조자
- l-value참조자
- LAN의 분류
- 백준 파이썬
- string유형
- Today
- Total
chyam
[unity 3d] - 플레이어, 카메라 이동 본문
< 구현 목표 >
플레이어가 바라보는 방향으로 앞,뒤로 움직일 수 있고 좌,우 방향키를 통해 바라보는 방향을 조정할수있게 만들기.
아래는 애니메이션을 제외한 전체 코드입니다!
using Newtonsoft.Json.Converters;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;
public class Player : MonoBehaviour
{
public float Speed = 20.0f; // 움직이는 속도
float ry;
float h, v;
public float rotateSpeed=100.0f;
void Start()
{
ry=transform.eulerAngles.y;
}
void Update()
{
v = Input.GetAxis("Vertical");
h = Input.GetAxis("Horizontal");
Walking();
}
void Walking()
{
if (Input.GetButton("Sprint")) // Run
{
Speed = 50.0f;
}
else
{
Speed = 20.0f;
}
transform.Translate(new Vector3(0, 0, v) * Speed * Time.deltaTime);
ry += h * rotateSpeed * Time.deltaTime;
transform.rotation = Quaternion.Euler(new Vector3(0, ry, 0));
}
}
변수 선언부터 하나씩 보자면 아래의 주석과 같습니다.
public float Speed = 20.0f; // 움직이는 속도
float ry; // 회전 각도를 저장
float h, v; // 좌우 회전과, 앞뒤 이동
public float rotateSpeed=100.0f; // 회전 속도
Start() 메서드는 아래와 같습니다.
transform.eulerAngles는 오브젝트의 회전 값을 오일러 각도 형태로 반환해줍니다.
ry는 y의 값을 가져온 것입니다.
void Start()
{
ry=transform.eulerAngles.y;
}
Update() 메서드는 아래와 같습니다.
void Update()
{
v = Input.GetAxis("Vertical");
h = Input.GetAxis("Horizontal");
Walking();
}
GetAxis는 -1~1 사이의 값을 반환합니다. 키를 누를때 부드러운 입력 처리를 제공합니다.
즉각적인 반응이 필요할때는 -1,0,1 중 하나만 반환하는 GetAxisRaw를 사용해야합니다!
"Vertical"은 "W"나 위쪽 방향키를 누르면 +1, "S"나 아래쪽 방향키를 누르면 -1를 가집니다.
"Horizontal"은 "A"나 왼쪽 방향키를 누르면 -1, "D"나 오른쪽 방향키를 누르면 +1를 가집니다.
Walking() 메서드는 아래와 같습니다.
void Walking()
{
if (Input.GetButton("Sprint")) // Run
{
Speed = 50.0f;
}
else
{
Speed = 20.0f;
}
transform.Translate(new Vector3(0, 0, v) * Speed * Time.deltaTime);
ry += h * rotateSpeed * Time.deltaTime;
transform.rotation = Quaternion.Euler(new Vector3(0, ry, 0));
}
Sprint는 "Left Shift"로 설정해주어서 이를 누르는 동안 Speed를 증가시켜주고, 누르지 않으면 기본적으로 걷는 속도가 적용됩니다.
transform.Translate는 오브젝트를 부드럽게 이동시킵니다.
앞뒤 이동은 z축을 기준으로 하기 때문에 z축을 변경해줍니다.
Time.deltaTime을 사용하는 이유는 모든 프레임에서 일정한 속도로 움직일 수 있기떄문에 컴퓨터 성능이나 프레임차이에 따라 속도가 달라지는 문제를 방지하기 위해서 입니다!
오브젝트 회전 명령어 중에 '오일러 앵글'을 사용하였습니다.
x, y, z 축 회전 중에서 양옆으로 회전을 하기 위해서는 y축 회전을 적용해야 합니다.
지속적인 회전을 위해서는 Update() 메서드에 작성해야 합니다!
Update()는 프레임마다 호출되기 때문에, 입력에 따라 실시간으로 반응하는 회전을 구현할 수 있습니다.
유니티의 rotation 속성은 기본적으로 쿼터니언 형태로 회전 값을 처리합니다.
따라서 오일러각도를 쿼터니언으로 자동 변환하는 아래와 같은 코드를 사용해야 합니다!
ry += h * rotateSpeed * Time.deltaTime;
transform.rotation = Quaternion.Euler(new Vector3(0, ry, 0));
ry는 현재 y축 회전 각도를 저장하는 변수입니다. new Vector3를 통하여 오일러 각도를 정의한 후, 쿼터니언으로 변환해준 값을 현재 오브젝트의 rotation에 저장해줍니다.
카메라는 플레이어를 따라가기위해 가장 간단한 방법을 사용하였습니다.
아래와같이 플레이어의 하위에 넣어 위치를 조정해주면 됩니다.
'unity' 카테고리의 다른 글
[unity 3d] - 바라보는 오브젝트를 키 입력을 통해 인벤토리에 저장하기 (0) | 2025.03.03 |
---|---|
[unity 3d] - 마우스 움직임을 통해 플레이어가 해당 방향을 바라보도록 설정하기 (0) | 2025.02.27 |
[unity] - 로켓을 움직여 도착지에 도달하는 미니게임 (0) | 2025.01.08 |
[unity] - 버튼 순서대로 누르면 성공하는 퍼즐 (0) | 2024.09.12 |
[unity] - 시간 흐름 [ deltaTime ] (0) | 2024.09.09 |