유니티 공부.. 3D 쿼터뷰 액션게임 골드메탈님 01
unity 유니티 공부 2024. 11. 28. 17:35 |https://www.youtube.com/watch?v=WkMM7Uu2AoA
일단 기초 맵 부터 생성
3d 오브젝트 바닥과 벽을 생성하기
카메라 비추는데 방해되는 벽 오브젝트는
mesh renderer 옆 체크 박스 off 해서 비활성화 하기
![]() |
![]() |
마테리알, 베이스 맵에 텍스쳐 넣을 시
너무 늘어난 거 같으면 tiling 의 x y 값을 올리면 됨
플레이어 될 오브젝트엔
ㅁ Rigidbody
ㅁ Capsule Collider
ㅁ Script 빈거
이 세 개 콤포넌츠 부터 만들기
플레이어 스크립트 짜는데..
using UnityEngine;
public class PlayerSC : MonoBehaviour
{
float hAxis;
float vAxis;
Vector3 moveVec;
void Start()
{
}
void Update()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
}
}
참고로 인풋 중 Horizontal, Vertical 은
프로젝트 세팅 , 인풋 매니저에서 가져옴
대각선 이동도 스크립트에 구현할건데..
대각선 이동이 빨라지면 형평성에 어긋나니까
대각선 이동도 그냥 가로 이동과 똑같이 하기 위한게 필요함
normalized 를 쓸거임
테스트할 때, 캐릭터가 넘어지면?
Rigidbody 콤포넨트 항목에서
Constraints 의 Freeze Rotation x z 를 설정 on 하면 됨
Fixed Update 인 벽과 Update 인 플레이어 .
두 업데이트 방식이 다르면
물리 충돌이 제대로 발동 안되는 오류가 생길 수 있음
해결법 :
플레이어의 Rigidbody 콤포넨트
Collision Detection Discrete에서 Continuous 로 변경하면 됨
플레이어의 애니메이션을 만들어보자
Animation Controller 생성
플레이어 자식 탭에 Mesh Object 로 애니메이션 컨트롤러를 드래그 해서 적용
Animator 컴포넌트 Controller 옆 더블 클릭하면 애니메이터 윈도우 창이 나옴
에셋 창에서 , 플레이어 fbx 모델을 펼쳐보면
세모 아이콘 모양, 애니메이션도 같이 있음
.fbx 파일은
메쉬, 텍스쳐, 애니, 뼈 등 각종 정보가 저장된 3d 확장자임
애니메이션 중 idle 을 애니메이터 윈도우 쪽으로 드래그
idle 어셋 우측 상단 edit 누른 후 loop 설정
애니메이터 윈도우에서
idle walk run 세 개를 우클 ㅡ make transition 해서 연결
저 연결 화살표를 누르면 트랜지션 설정 가능
보통 transition duration 을 0.1~0.3 정도로 왔다 갔다 해서 조절하는 편
이동속도와 애니메이션 속도가 서로 안 맞으면
Speed 조절 가능함
반대방향으로도 우클, 트랜지션 연결 해둔다
조건에 해당되면 애니 바뀌려면
왼위 Parameters 를 눌러주고...
저 플러스 버튼 , bool 값을 클릭
isWalk
isRun
두 개를 생성
idle - > Run 화살표 누른 후 오른아래 컨디션 isRun true 로 설정
Has Exit Time 은 off
세팅 눌러보면 트랜지션 겹치는 구간의 길이를 설정가능
지금은 0.1 로 설정
Run 에서 Idle 로 향하는 건 컨디션 isRun 이 False 가 되어야 함
우리는 지금
달리는 Run 을 기본으로 하고,
Shift 를 눌렀을 때 Walk 걷기로 하자
Walk <- Run 일 땐
Conditions isWalk 를 true
Walk -> Run 일 땐
Conditions isWalk 를 false
헷갈릴 수 있으니 주의
Walk -> idle 될 땐
Conditions isRun 이 false 로 저장되어야 함
'보통은 뛰고 shift 누르면 걷는다' 시스템 때문임
idle -> Walk 일 땐
Conditions 두 개 여야 함
isRun isWalk 둘 다 true
shift 키 쓸 수 있도록
프로젝트 세팅- 인풋 메니저 - cancel 아래 아무 값 - 이름 Walk , 포지티브 버튼에 left shift
ali 버튼은 조이스틱 되어있을건데 지우기
+
걸을 때 속도 감소는 이런식으로 표현 가능
근데 if 절을 이런식으로 한 줄로 표현 가능
? 가 조건에 해당될 때
: 가 조건이 아닐때의 else 를 뜻함
용어로는 삼항연상자
참고로 플레이어 오브젝트의 z 로테이션은 0 이 되어야 제대로 회전이 이루어짐
loot 라던가 그런 오브젝트 z 로테이션도 0 으로 되어야
용어 정리
LookAt
이 물체가 어느쪽을 향해 바라볼거다
transform.position
지금 우리 위치
moveVec
나아가야 할 위치
플레이어 컨트롤러 스크립트를 정리하면 아래와 같음
using UnityEngine;
public class PlayerSC : MonoBehaviour
{
public float speed;
float hAxis;
float vAxis;
bool wDown; // Walk 를 위핸 shift 꾹
Vector3 moveVec;
Animator anim;
void Awake()
{
anim = GetComponentInChildren<Animator>();
}
void Update()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
wDown = Input.GetButton("Walk"); //GetButton은 꾹 누를 때만 적용
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
if (wDown) // Walk 걸을 때 속도 감소
transform.position += moveVec * speed * 0.3f * Time.deltaTime;
else
transform.position += moveVec * speed * 1.0f * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
transform.LookAt(transform.position + moveVec); //회전구현
}
}
+
플레이어 바라보는 카메라 만들기
using UnityEngine;
public class FollowCam : MonoBehaviour
{
public Transform target;
public Vector3 offset;
void Update()
{
Transform.position = target.position + offset;
}
}
카메라 컨트롤러 컴포넌트 스크립트 구성은 위와 같음
Target 엔 플레이어를 드래그.
오프셋엔 미리 맞춰놓은 카메라 각도를 적용하는 거임
오프셋엔 위에서 설정한 x y z 포지션을 그대로 적용
+
지금껏 만들었는데
뭔가 밋밋하다
그래서 45 ˚ 기울여보자
create empty 를 부모로 적용후
바닥, 벽을 자식으로 넣은 후
엠티 오브젝트를 y 45로 돌려버리기