사실 첫번째 블로그는 임시저장해둔상태로 2번째부터 폭주해서 달려버렸다.
인벤토리까지 구현이 된 상태라 그냥 적지말까...하다가 못찾은 오류도 발견하고 코드도 정리할겸 적기로 했다!
설치 후 애니메이션
기본으로 설정되있는 이동.
스페이스바를 누르면 다음 동작을 하도록 만들어져있다.
유니티짱을 누르면 Idle Changer라는 스크립트가 애니메이션을 바꿔준다.
그리고 유니티짱을 임포트후에 같이 설치된 스크립트를 찾아봤는데, 이동이 가능하게 해주는 스크립트가 있었다.
어차피 새로 만들예정이긴 했지만, 넣으니까 에러가 나더라... 에러가 한둘이 아니라 이유도 모르겠다. 검색해도 안뜨고...
그래서 위에 있는 기본이동들 외에 에셋스토어를 찾아다니며 동작을 임포트했다.
에셋스토어 무료 애니메이션
https://assetstore.unity.com/?category=3d%2Fanimations&free=true&orderBy=1
에셋스토어
여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.
assetstore.unity.com
Generic & Humanoid
유니티짱을 import하고 나면 2가지 타입이 있는데, Generic과 Humanoid가 있다.
Humanoid모델은 뼈대가 15개 이상이고, 사람과 같이 구성되어 있는 모델이다.
그래서 Humanoid는 Humanoid에 맞는 애니메이션을 사용하면 모델이 전혀 달라도 사용가능하다.
Generic모델은 사람 이외의 모든 것이라고 보면 된다.
동물이나 물건 등 모든것들이고, 비휴머노이드 라고도 부른다.
그러니 Humanoid를 사용하면 애니메이션을 적용하기 쉽고, 이번 만드는 게임도 Humanoid모델로 만든다.
사용한 애니메이션을 기억나는걸 올려보자면
https://assetstore.unity.com/packages/3d/animations/rpg-character-mecanim-animation-pack-free-65284
RPG Character Mecanim Animation Pack FREE | 3D 애니메이션 | Unity Asset Store
Elevate your workflow with the RPG Character Mecanim Animation Pack FREE asset from Explosive. Find this & other 애니메이션 options on the Unity Asset Store.
assetstore.unity.com
https://assetstore.unity.com/packages/3d/animations/free-32-rpg-animations-215058
FREE - 32 RPG Animations | 3D 애니메이션 | Unity Asset Store
Elevate your workflow with the FREE - 32 RPG Animations asset from Blink. Find this & other 애니메이션 options on the Unity Asset Store.
assetstore.unity.com
https://assetstore.unity.com/packages/3d/animations/melee-warrior-animations-free-165785
Melee Warrior Animations FREE | 3D 애니메이션 | Unity Asset Store
Elevate your workflow with the Melee Warrior Animations FREE asset from Kevin Iglesias. Find this & other 애니메이션 options on the Unity Asset Store.
assetstore.unity.com
https://assetstore.unity.com/packages/3d/animations/sd-chan-animation-bundle-204862
SD chan Animation bundle | 3D 애니메이션 | Unity Asset Store
Elevate your workflow with the SD chan Animation bundle asset from uchwch. Find this & other 애니메이션 options on the Unity Asset Store.
assetstore.unity.com
애니메이션 몇몇개씩 뽑아썼다.
3번째인 Melee Warrior Animations를 들어가보면 아래 설명에 이렇게 적혀있다.
Free sample of humanoid 3D fighting animations with melee weapons for retargeting to other humanoid 3D characters.
"다른 휴머노이드 3D 캐릭터로 대상을 변경하기 위한 근접 무기가 포함된 휴머노이드 3D 격투 애니메이션의 무료 샘플입니다."
Humanoid라고 적혀있는게 Humanoid모델이면 애니메이션 가져다 붙이면 바로 쓸수 있어요~ 라는 뜻
마음에 드는 애니메이션이 몇개 있었는데, 왜인지... 비휴머노이드인 애니메이션도 몇몇개있었다. 찾아서 잘 다운해야한다.
TPS처럼 만들기
TPS ( 3인칭 슈팅 게임) 처럼 만들것이다.최근에 유행한 게임인 젤다:왕국의 눈물 이게 유행해서 방송으로 많이봤더니 따라 만들고 싶어졌었다.
우선 유니티짱에 앞뒤좌우 이동을 해주는 Input을 Update에 만들어 넣어서 테스트했었다.지금은 한참 만들고 나서 쓰는 포스팅이니 바로보는 완성본
이동은 이동대로 움직이고, 카메라 회전은 카메라회전대로 움직인다.이동방향은 카메라회전에 영향을 받는다.
이렇게 만들기 위해서 우선 하이어라키에 이렇게 만들어준다.
모델을 Player아래에 넣어주고, Camera는 Camera Arm아래에 넣는다.
그리고 Camera Arm도 Player에 넣어준다.
Camera Arm은 회전을 담당하고 Camera는 부모인 Camera Arm이 회전하니 따라 회전하도록 되있다.
Camera Arm을 클릭해둔 상태고, MainCamera는 3만큼 떨어트려놨다.
Player에 대부분의 스크립트를 넣어주면 된다.
(이동은 FSM과 Charactor Controller으로 만들었고 다음 포스팅에 계속)
봐야할건 Camera Controller
Zoom과 회전, 위아래 최대각도를 설정할 수 있도록 만들었다.
Camera Controller
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Thanks for the help
// https://www.youtube.com/watch?v=P4qyRyQdySw 베르 - 카메라와 이동을 따로
public class CameraController : MonoBehaviour
{
[SerializeField] private Transform cameraArm;
[SerializeField] private Transform mainCam;
[SerializeField] private float zoomRange = 1; //카메라 줌 범위(0.4 ~ 1로 설정)
[SerializeField] private float upRange = 30f; //카메라 위로 이동 최대 각도
[SerializeField] private float downRange = 30f; //카메라 아래 이동 최대 각도
void Start()
{
Cursor.lockState = CursorLockMode.Locked; // 마우스를 화면 중앙에 고정
}
void Update()
{
if (GameManager.Instance.isLockCameraRotation) return;
mainCam.localPosition = cameraArm.localPosition + new Vector3(0, 1.5f, -3) * zoomRange; //mainCamera을 캐릭터쪽으로 이동하며 줌
LookAround();
Zoom();
}
//마우스 회전시 CameraArm을 회전시켜서 화면회전 구현
private void LookAround()
{
Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); // 마우스 입력
Vector3 camAngle = cameraArm.rotation.eulerAngles; // 카메라 오일러각으로 변경
float x = camAngle.x - mouseDelta.y; //mouseDelta.y는 위로가면 -값, 아래로가면 +값을 가짐.
float y = camAngle.y + mouseDelta.x;
// 카메라의 위아래 각도 제한
if (x < 180f)
{
x = Mathf.Clamp(x, -1f, upRange); // -1이 아니라 0을 하면 0도에서 360으로 안넘어가짐
}
else
{
x = Mathf.Clamp(x, 360f - downRange, 361f); // 361이 아니라 360을 하면 360도에서 0도로 안넘어가짐
}
cameraArm.rotation = Quaternion.Euler(x, camAngle.y + mouseDelta.x, 0); // 마우스 이동시 카메라 회전
}
// 마우스 휠을 사용해서 줌인 줌아웃 가능
// 휠을 올리면 줌인, 휠을 내리면 줌아웃
private void Zoom()
{
float scroll = -Input.GetAxis("Mouse ScrollWheel"); //zoomRange값만큼 곱하는데 클수록 멀어지기 때문에 -를 붙임
zoomRange += scroll;
zoomRange = Mathf.Clamp(zoomRange, 0.4f, 1); //줌의 최대거리 제한
}
}
사실 힘들게 혼자 계산해가면서 만든 코드가 있는데...
이동을 그냥 Update에서 만들었다가 FSM으로 수정하고나니 에러가났었다.
그래서 유튜브의 베르님 영상을 참고해서 새로 만든 코드다. 후...
Update에서 if(Gamemanager~~) return;라는 부분이 있다.
이 부분은 ESC나 Inventory를 사용하면 Mouse Lock을 풀어야하니 그 부분때문에 추가했다.
그리고 이동부분에 대한 스크립트를 짤막하게 올리자면
private Vector2 MoveTo()
{
Vector2 moveInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
moveInput = RunTo(moveInput);
Vector3 lookForward = new Vector3(camArm.forward.x, 0f, camArm.forward.z).normalized;
Vector3 lookRight = new Vector3(camArm.right.x, 0f, camArm.right.z).normalized;
Vector3 _moveDir = lookForward * moveInput.y + lookRight * moveInput.x;
if (moveInput.magnitude > Mathf.Epsilon)
{
unityChan.forward = _moveDir;
}
characterController.Move(Time.deltaTime * moveSpeed * new Vector3(_moveDir.x, moveDir.y, _moveDir.z));
return moveInput;
}
caemra Arm의 영향을 받아 움직이도록 되어있다.
추가로... 혼자 만들었던 이동로직 일부분은
// Idle와 걷기
// public void MoveTo(float _h, float _v)
// {
// if (_h < Mathf.Epsilon && _v < Mathf.Epsilon) return;
// Vector3 dir_cam = cam.transform.forward; // 메인 카메라가 보는 방향
// dir_cam = new Vector3(dir_cam.x, 0, dir_cam.z).normalized; // 카메라의 방향에서 y축을 제외한 벡터를 정규화
// unityChan.localRotation = Quaternion.Euler(0, Mathf.Atan2(dir_cam.x, dir_cam.z) * Mathf.Rad2Deg, 0); //카메라가 보는 방향으로 캐릭터를 회전
// Vector3 _moveDir = new Vector3(_h, 0, _v).normalized; // 대각이동과 직선이동이 같은거리를 이동하는것을 방지하기위해 normalized
// unityChan.Rotate(0, Mathf.Atan2(_moveDir.x, _moveDir.z) * Mathf.Rad2Deg, 0); //카메라가 보는 방향에서 이동해야할 방향만큼 추가로 회전
// float t_moveAngle = Vector3.SignedAngle(Vector3.forward, dir_cam, Vector3.up); //이동 해야할 방향의 각도를 계산
// _moveDir = Quaternion.AngleAxis(t_moveAngle, Vector3.up) * _moveDir; //이동방향의 각도만큼 회전
// _moveDir = RunTo(_moveDir);
// moveDir = new Vector3(_moveDir.x, moveDir.y, _moveDir.z); //점프상태를 유지하면서 연산이 끝난 이동방향을 대입
// }
뭔 고생을 한걸까
자세한 이동은 다음글에...
'유니티_일기 > 3D_RPG!' 카테고리의 다른 글
3D RPG 만들기! (6) 몬스터+아이템 만들기 (0) | 2023.08.17 |
---|---|
3D RPG 만들기! (5) 공격 만들기 - 레이어마스크, 애니메이션 레이어 (0) | 2023.08.09 |
3D RPG 만들기! (4) 대화 구현하기 (0) | 2023.08.07 |
3D RPG 만들기! (3) 이동 구현하기 (0) | 2023.08.06 |
3D RPG 만들기! (1) 유니티짱 적용하기 (0) | 2023.08.02 |
댓글