프로퍼티가 인스펙터에서 안보이는 경우는 보통 셋 중에 하나입니다. 1. 코드에 에러가 있을 경우 2. 해당 프로퍼티를 선언할 때 public으로 선언하지 않은 경우 3. 해당 프로퍼티를 private으로 선언하고 [SerializeField] 어트리뷰트를 붙이지 않은 경우 세 가지 경우를 한 번 확인 해보면 좋을 것 같습니다.
@@wergia 막 입문자라 무작정 코드 베껴 쓰는데 오타난 부분이 있어서 수정했더니 the script don't inherit a native class that can manage a script 라고 뜹니다 안터넷에서 찾아봐도 답이 안나와서 벌써 코드만 다시쓰기 여러번 했네요,, (유니티 2020 최신버전 씁니다)
@@helloworld06 그럼 .cs 파일의 이름과 클래스의 이름도 완전히 일치하나요? 그 외에도 문제가 없는데 계속 에러가 뜬다면 forum.unity.com/threads/the-script-dont-inherit-a-native-class-that-can-manage-a-script.1011988/ 유니티 포럼의 해달 스레드에서 유니티 2020의 버그인 것 같다는 내용은 발견했습니다. 먼저 새로 프로젝트를 생성해서 같은 문제가 발생하는지 테스트하고, 만약 같은 문제가 발생한다면 유니티 2019로 버전을 낮춰서 해보시길 권해드립니다.
@@조인서-h6z 캐릭터컨트롤러 클래스의 LookAround 함수에서 Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); 이렇게 마우스 델타를 구하는 부분에서 Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X") * sensitivity, Input.GetAxis("Mouse Y") * sensitivity); 이렇게 감도 값을 곱해주면 됩니다. 좌우 감도와 상하 감도를 따로 주고 싶으면 Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X") * HorizontalSensitivity, Input.GetAxis("Mouse Y") * VerticalSensitivity); 이렇게 변수를 따로 곱해줘도 됩니다.
질문 몇 개 있습니다. 그대로 따라서했는데 메인이 Empty 오브젝트여서 예를들어 캐릭터가 벽에 충돌한상태로 W키를 누르면 Empty오브젝트만 앞으로 가서 카메라랑 캐릭터랑 뒤틀립니다. 이럴 경우에는 Empty 오브젝트 기준이아닌 캐릭터 기준으로 해야하나요?? 또 만약 게임을 제작하다보면 카메라를 돌렸을 때, 벽속에 들어가는 현상이 있는데 이럴땐 카메라에 콜라이더를 넣어서 처리하나요?
1. 앞으로 가서 벽에 부딪히면 충돌체가 없는 카메라만 앞으로 이동하고 캐릭터는 멈춰서 틀어진다는 뜻인가요? 제가 만든 방식은 빈 게임오브젝트 + 충돌체 + 캐릭터 컨트롤러 ㄴ 캐릭터 모델링 ㄴ 카메라 암 ㄴ 카메라 이런 구조로 실제 충돌처리는 빈 게임 오브젝트가 해서 카메라와 캐릭터가 틀어지지 않는 방식으로 했습니다. 2. 카메라가 벽에 들어가지 않게 하는 방법은 여러가지가 있습니다. 카메라에 콜라이더를 넣어서 처리하는 방법도 있고 캐릭터에서 카메라가 있는 방향으로 Raycast라는 충돌감지 광선을 쏴서 감지된 거리가 캐릭터와 카메라 사이의 거리보다 짧으면 카메라를 당겨주는 방식도 사용할 수 있습니다.
안녕하세요 베르님 항상 신세지고 있습니다 다름이 아니라 궁금한 점이 있어 여쭤보려합니다 Vector3 lookRight = new Vector3(cameraArm.right.x, 0f, cameraArm.right.z).normalized;에서 Vector3 lookRight = new Vector3(cameraArm.right.x, cameraArm.right.y, cameraArm.right.z).normalized; 로 변경해도 캐릭터가 위로 이동하지 않던데 이유가 무엇인가요? Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x; 에서 두 벡터값을 더하므로 결국엔 moveDir의 y값에 right쪽에 카메라암의y값이 들어가는것이 아닌가요? forward에서는 0f로 해줘야 캐릭터가 위로 향하지 않는데 right는 0f로 하지않아도 캐릭터가 위로 향하지 않는 이유가 궁금합니다.
Vector3 lookRight = new Vector3(cameraArm.right.x, cameraArm.right.y, cameraArm.right.z).normalized; 로 코드를 변경해도 캐릭터가 위아래로 움직이지 않는 이유는 우선 Right 값은 Roll 회전이 발생하지 않는 이상 수평을 유지하기 때문입니다. Pitch와 Yaw 회전만 있으면 객체의 right는 기울어지지 않고 수평을 유지합니다. Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x; 에서 lookRight * moveInput.x를 처리하는 부분은 카메라 암의 y값이 들어가는게 아니라 플레이어의 좌우 입력 값의 크기와 캐릭터의 오른쪽 방향을 곱해서 좌우 움직임을 얼마나 보이게 만들지를 결정하는 겁니다.
@@소환사자리비움 우선 RayCast를 쏘는 부분이나 RayCast를 쏴서 동작하는 맞은 위치를 검출했을 때와 못했을 때로 구분해서 처리하는 방향은 맞습니다. 다만 if(Physics.Raycast(CameraArmBox.center, Vector3.back, out hit, 3f))에서 레이캐스트를 사용하는 위치나 방향이 조금 잘못된것 같네요 우선 CameraArmBox가 어디를 중심으로 배치된 것인지 모르니 기존 코드에 있는 cameraArm을 기준으로 사용하는게 좋을 것 같습니다. 그리고 레이캐스트를 사용하는 방향으로 Vector3.back을 넣으셨는데 이 back은 cameraArm이 바라보는 방향 기준의 Back이 아니라 월드 중심 좌표가 기준이기 때문에 올바른 방향이 아닙니다. 그렇기 때문에 -cameraArm.forward를 사용해야 카메라 암이 바라보는 방향의 뒤를 구할 수 있습니다. 그리고 레이캐스트가 맞았을 때, CharCamera.transform.position += Vector3.forward * Time.deltaTime * 5f; 이런식으로 좌표를 더하고 있는데 이렇게 되면 카메라의 위치가 계속 더해져서 아예 다른 위치로 가게될 겁니다. 카메라의 위치를 정하기 위해서는 우선 레이캐스트로 구한 hit에서 맞은 거리를 hit.distance로 구할 수 있는데, 지금 카메라의 위치를 정할 때 로컬 좌표 중에 Z 값만 이용해서 사용하고 있기 때문에, CharCamera.transform.localPosition = new Vector3(0f, 0f, -hit.distance); 정도로 구하면될 것 같습니다.
@@wergia 혹시 캐릭터의 forward를 moveDir로 해놓고 대각선으로 움직인 뒤 멈추면 캐릭터가 회전하지 않나요? 왼쪽 앞 대각선으로 움직이다 멈춘다 하면 캐릭터 보는 방향이 대각선이 아니라 앞이나 왼쪽으로 회전하고 멈추네요 제가 잘못된건가요 아니면 심화과정?인건요
@@박건영-k3u 모든 방향으로 자유롭게 이동할 수 있는 조이스틱에서는 벌어지지 않는 문제이지만 키보드는 8방향으로 입력이 제한되어 있고, 전후좌우를 제외한 대각방향은 키 조합으로 이동이 이루어지기 때문에 동시 입력한 두 방향의 키에서 손을 동시에 떼지 않으면 말씀하신것과 같은 문제가 일어납니다. 키보드에서 이런 문제를 해결하기 위해서는 최근 입력한 이동 방향을 기억해두었다가 입력이 끝났을 때 그 방향 바라보게 하는 등의 후처리가 들어가야 합니다.
12분정도 되는 짧은 영상이지만 차근차근 곱씹어 보면 중요한 내용이 참 많은 것 같네요. 몇 번이나 반복해서 보면서 80% 정도는 이해하고 익힌 것 같습니다. 좋은 영상 정말 감사합니다!! 그런데 좌우로 움직이기, 뒤로 움직이기는 로직을 어떤식으로 구현하면 될까요? lookForward와 lookRight의 값을 기준으로 bool 을 추가해서 animator에 연동하면 될까요?
강의가 유니티 카메라를 다루는 법에 대해 참고가 정말 많이 되었습니다. 다만 궁금한 것이 있어 이렇게 남기게 되었습니다. 다름이 아니라, 카메라 회전을 상하를 못움직이게 한상태로 정면을 바라본 상태에서 캐릭터를 중심으로 회전을 키보드 Q,E 버튼으로 돌게 하려면 어떻게 하면 좋을지 계속 이 코드를 중심으로 다뤄보다가 잘 안되고 어려워서 글을 남기게 되었습니다. 붕괴3rd 라는 게임이 있는데, 그 게임에서 화면의 시점이 pc버전을 기준으로 Q, E 가 캐릭터를 기준으로 회전하는데 이 기법을 이 코드로 적용하면서 바꿔나가는건 무리수인지 아니면 아예 처음부터 다른 코드로 다시 짜야되는건지 궁금합니다.
영상에서 작성한 코드로도 말씀하신 대로 충분히 수정이 가능합니다. LookAround() 함수를 보면 아래와 같이 회전값을 추출할 떄 마우스 값을 가져와서 사용하는 것을 볼 수 있습니다. private void LookAround() { // 마우스 이동 값 검출 Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); // ... 생략 } 이 때 위/아래 회전 없이 Q, E로 좌/우 회전을 시킨다고 하셨으니 매개변수로 카메라가 회전할 방향을 가져오고 그 값을 "Mouse X"의 위치에 넣어주고 "Mouse Y"에는 0을 넣어줍니다. private void LookAround(float rotationDir) { // 마우스 이동 값 검출 Vector2 mouseDelta = new Vector2(rotationDir, 0f); // ... 생략 } 그리고 Update() 함수를 보면 LookAround() 함수를 매개변수 없이 호출 중인데 여기에 Q, E 키의 입력상태에 따라서 rotDir의 값을 바꿔서 LookAround() 함수의 매개변수로 넣어주면 됩니다. void Update() { float rotDir = 0f; if (Input.GetKey(KeyCode.Q)) { rotDir -= 1f; } if (Input.GetKey(KeyCode.E)) { rotDir += 1f;} LookAround(rotDir); Move(); } 아마 이렇게 해보면 원하시는 기능이 작동할 거라고 생각합니다. 그리고 회전 방향과 속도는 rotDir의 값을 어떻게 주느냐에 따라 달라질 겁니다.
@@wergia 일단 해봤는데, 카메라가 캐릭터를 공전하는 걸로 3인칭으로 보는걸 생각했는데, 자전하는것 같습니다. 혹시 플레이어 주변을 원으로 그리면서 공전하게 한다면 좀더 추가해야될게 있을까요? 그리고 그 코드를 써봤는데 Move()함수에 문제가 있어서 캐릭터 이동이랑 같이 쓰니 좀 꼬이네요. WASD를 누르면 캐릭터의 이동에 상관없이 카메라가 앞으로갑니다.(캐릭터를 추월합니다.) 그래서 일단 지우고 다른걸로 테스트중인데 일단 다른점을 꼽자면 애니메이터에서 뒷걸음과 옆걸음에 관한걸 설정한건 아닌상태로 진행했습니다. 제가 애니메이션을 전부 설정을 안해서 그런걸까요...?
@@user-te1tp4lt9g 카메라가 자전한다는 것은 카메라가 캐릭터 주변으로 원을 그리지 않고 카메라만 제자리에서 바라보는 방향만 바뀐다는 뜻이겠죠? 음 영상에서 1:49 쯤에 기능을 만드는 과정을 보면 카메라를 단독으로 두지 않고 중심을 캐릭터 쪽에 맞춘 Camera Arm이라는 게임오브젝트를 만들고 그 아래에 카메라를 두는 것을 볼 수 있습니다. 이 카메라 암 오브젝트를 회전시키면 카메라가 캐릭터를 중심으로 회전할 겁니다.
그 플레이어 이동이 게임오브젝트 중심으로 움직이는 거 잖아요 블럭에 밀리면 카메라는 계속 앞으로 가지만 플레이어 오브젝트는 블럭에 막혀서 멈춰있다가 옆이나 뒤에 방향을 틀어 이동하게 되면 게임오브젝트 중심으로 플레이어 오브젝트가 뒤 옆으로 순간이동 하듯이 이동되요 이거 결국 못고쳐서 지금은 다른 플레이어 스크립트로 쓰고 있어요
@@wergia 제가받은 캐릭터 애니메이션 자체에 전진하는 기능이 있어서 그런것 같습니다. maximo에서 애니메이션 inplace체크하고 받으니까 얼추 잘 돌아갑니다. 문제는 이제 wsad로 움직이는 도중에 마우스로 시점을 봐꾸면 서서히 카메라좌표가 이상한쪽으로 가는 버그가 발생하네요 ㅠㅠ 어제 하루종일 원인찾다가 결국 해결못하고 에셋스토어에 tps패키지있는거 임포트해서 썼습니다.. (아마 애니메이션 전환쪽에서 뭔가 꼬인거 같아요! 연구좀 해봐야될듯 하네요)
안녕하세요 베르님 문제가 발생하였는데 해결을 못해 질문 드립니다. 플레이어가 이동은 8방향으로 전부 이동이 가능한데 대각선 방향으로 멈추면 바라보는 방향으로 멈추지 않는 현상이 있습니다. 그래서 나름 해결을 해보려고 하였지만 잘 해결이 되지 않아 이렇게 댓글 남깁니다. animator.SetBool("isMove", isMove); if(isMove) { Vector3 lookForward = new Vector3(CameraArm.forward.x, 0f, CameraArm.forward.z).normalized; Vector3 lookRight = new Vector3(CameraArm.right.x, 0f, CameraArm.right.z).normalized; Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x; characterBody.forward = moveDir ; if (moveInput.magnitude != 0) Rotation(); transform.position += moveDir * Time.deltaTime * 5f; } } void Rotation() { MovePos.Set(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); Quaternion q = Quaternion.LookRotation(CameraArm.TransformDirection(MovePos)); if (MovePos == Vector3.zero) transform.rotation = q; } 여기서 어느 코드에 문제가 있는지 알 수 있을까요??
우선 새해 복 많이 받으시고 하시는 모든 일들이 좋은 결과가 있으시길 바랍니다. 좋은 강의 늘 감사합니다. 조금 시간은 걸리지만 프로그램을 구상하고 구현하는데 많은 공부가 되고 있습니다. 본 강의를 들으면 사소한 문제가 발생하면 다시 지우고 다시 따라 써보고 하고 있습니다. 카메라의 회전을 "오른쪽마우스"를 누르고 있을 때로 구현 하고 싶은데. 시도해 본 방법 1 private void LookAround() { if(input.GetMounseDown(1))
캐릭터가 뒤로 이동할 때 뒷걸음질하는 애니메이션을 실행되게 하려면 10:37 처럼 이동시 캐릭터가 바라보는 방향을 카메라 방향으로 고정시키고 캐릭터의 이동 방향에 따라 각 방향의 애니메이션을 재생시켜주면 됩니다. 이 때 각 방향의 이동 애니메이션을 자연스럽게 섞이게 만들기 위해서 애니메이션 블랜드( ruclips.net/video/U5YQBpKYhvI/видео.html )를 사용하면 좋습니다.
우선 카메라가 벽을 뚫고 지나가는 문제는 카메라 암에 콜라이더를 달거나 카메라 뒤 방향으로 레이캐스트를 쏴서 거리를 측정한 뒤 충돌한 물체가 있다면 카메라의 위치를 앞으로 당기는 식으로 파고드는 문제를 해결할 수 있습니다. 그리고 벽에 충돌한 상태에서 카메라가 흔들리는 문제는 이동 처리인 Move 함수를 Update 함수가 아닌 FixedUpdate 함수로 옮겨서 처리해보세요. FixedUpdate 함수는 유니티 엔진에서 물리 계산과 동일한 시점에 코드를 실행하기 때문에 콜라이더와 충돌했을 때 타이밍이 어긋나지 않아서 떨림이 사라질 겁니다.
벡터 영상에서 가볍게 다루고 지나간 적이 있습니다. 오일러 각은 Vector3로 회전을 표현하는 방법입니다. 기본적으로 유니티에서는 Quaternion이라는 클래스로 오브젝트의 회전을 표현하는데 이 쿼터니언 방식은 값으로 회전을 유추하거나 계산하는게 어렵기 때문에 간단한 방식인 오일러 방식으로 변환해서 사용하는 겁니다. ruclips.net/video/BHhndhjcTsw/видео.html
Vector3 lookForward = new Vector3(CameraArm.forward.x, 0f, CameraArm.forward.z).normalized; Vector3 lookRight = new Vector3(CameraArm.right.x, 0f, CameraArm.right.z).normalized; 이 코드 부분이 이해가 안되는데 혹시 설명해주실수 있으신가요..
@@astragoldn5780 1인칭과 3인칭을 오갈 수 있는 게임에서는 보통 1인칭용 모델링과 3인칭용 모델을 따로 사용합니다. 1인칭 모드로 바뀌면 팔만 있는 모델을 사용해서 몸이 카메라를 가리지 않도록하고 3인칭 모드로 바뀌면 팔만 있는 모델을 숨기고 몸 전체 모델링을 보여주는 방식으로 말이죠.
일단 간단하게 설명드리자면 캐릭터와 지면을 높이가 2인 캡슐 콜라이더를 이용해서 바닥을 뚫지 못하게 했을 때, 캡슐의 중심에서 바닥으로 레이캐스트를 쏘면 높이가 거의 1일겁니다. 하지만 내리막길이나 오르막길에서는 캡슐 콜라이더 바닥면의 굴곡때문에 그 높이가 1보다 크게 됩니다. 그 때 캐릭터의 몸체를 조금 더 눌러준다면 캐릭터가 좀 더 자연스럽게 경사면을 움직일 수 있게 될 겁니다. 다음에 기회가 되면 영상에서도 한 번 다뤄보도록 하겠습니다.
스크립트 에디터에서 발생하는 명시적인 에러인가요? 아니면 코드 진행이나 동작이 의도와는 다르게 발생하는 논리적인 에러인가요? 우선 대영님이 옮기신 코드가 완벽하게 복사해서 옮긴 코드라고 가정했을 때, animator.setBool("isMove", isMove); 부분에서 에러가 발생하는 문제는 SetBool 함수 호출시 S가 대문자여야 하는데 소문자로 쓰셔서 그럴 수 있다고 생각됩니다. 실제 코드에서 SetBool로 틀리지 않고 쓰셨다면 그 외의 부분을 봐야겠죠. 애니메이션이 제대로 동작하지 않는다고 하셨으니 애니메이터에 파라미터로 선언된 isMove와 SetBool 함수로 호출하는 "isMove" 사이에 둘 중 하나에 오타가 있지는 않은지, 애니메이터의 트랜지션 세팅이 제대로 되어 있는지 확인해야 할 것 같습니다.
자식 오브젝트로 넣었을때 기즈모가 카메라로 이동하는 분은 유니티 최상단 메뉴 바로 아래에 있는 Pivot or Center이라고 적혀있는 토글버튼을 눌러 Pivot에 놓으면 됩니다.
감사합니다......... 이것 때문에 한참을 고민했네요
추가로 Pivot or Center 아이콘은 보통 씬 바로 아래 네모에 대각선 선분 하나 그려져 있는 아이콘입니당.
Input을 Vector2 형태로 받는 건 생각도 못했는데 정말 대단하세요!!
translate하고 오일러만 써서 움직이는거에 좀더 섬세한 동작을 위해 여러가지 생각을하다가 오늘 영상 보았는데 ...
하 진짜 개비스콘 한통먹은 느낌입니다. 너무 감사합니다.. 이전에는 정말 인위적인 방향보간이었는데.. 감사합니다!
11:36 캐릭터가 이렇게 하늘 떠 다니는데 안떠다니고, 벽이나 이런거에 막히게 하는 방법이 없나요..? Rigidbody,Capshule 콜라이더 사용해봤구, 캐릭터 컨트롤러도 사용해봤는데 계속 공중에 떠있고, 통과 합니다 ㅠㅠ
Rigidbody 컴포넌트를 추가하고 Use Gravity 옵션을 켜보세요.
찬찬히 따라 하면서 많이 배웠습니다. 감사합니다.
베르님 정말 감사합니다! 설명도 깔끔하고 댓글 피드백도 잘해주셔서 매우 큰 도움 됐습니다 ㅎㅎ
진짜 다시봐도 추천 1000001번 누르고 싶네요 ㅜㅜ
게임켜서 움직여보면서 작동방식 기록하고 구현하려고 하루 종일 별짓다해보고 있었는데 그 다음날 이 영상보고 명쾌하게 해결되었습니다. 많은 시간 절약했습니다. 많이 배웠습니다. 감사합니다. 좋아요 처음 눌러보네요.
다른 게임을 분석하면서 만들어보는 것도 중요하죠!
질문 있습니다
2:55 에
1.빈 오브젝트만들고
2.오브젝트를 캐릭터 머리 높이에 맞추고
3.카메라를 오브젝트에 넣었더니
시점이 오브젝트(캐릭터머리)기준으로 도는게아니라 카메라기준으로 돌고있습니다 혹시 해결방법 아십니까?
cameraArm프로퍼티에 CameraArm 오브젝트를 넣어주셨나요?
@@wergia 다른방법으로 해결하엿습니다 답변감사합니다..
@@KuRung. 저도 똑같은데 어떻게 해결하셨나요 혹시?
다운로드에 애니메이션은 없나용..?
prefab 만 있는데 prefab 도 똑같은 Boxman@ 만 4개가 있네요 뒤에 붙은 run , attack 이런건 무슨 차이인가요?
진짜 진짜 감사합니다 베르님 도움이 많이 됐어요
여러번 해서 드디어 6:09 이부분에서 스크립트가 들어가는데 characterBody 랑 camereArm 이 나오지 않습니다 왜이럴까요,,
프로퍼티가 인스펙터에서 안보이는 경우는 보통 셋 중에 하나입니다.
1. 코드에 에러가 있을 경우
2. 해당 프로퍼티를 선언할 때 public으로 선언하지 않은 경우
3. 해당 프로퍼티를 private으로 선언하고 [SerializeField] 어트리뷰트를 붙이지 않은 경우
세 가지 경우를 한 번 확인 해보면 좋을 것 같습니다.
@@wergia 막 입문자라 무작정 코드 베껴 쓰는데 오타난 부분이 있어서 수정했더니 the script don't inherit a native class that can manage a script 라고 뜹니다
안터넷에서 찾아봐도 답이 안나와서 벌써 코드만 다시쓰기 여러번 했네요,, (유니티 2020 최신버전 씁니다)
@@helloworld06 그럼 .cs 파일의 이름과 클래스의 이름도 완전히 일치하나요?
그 외에도 문제가 없는데 계속 에러가 뜬다면
forum.unity.com/threads/the-script-dont-inherit-a-native-class-that-can-manage-a-script.1011988/
유니티 포럼의 해달 스레드에서 유니티 2020의 버그인 것 같다는 내용은 발견했습니다.
먼저 새로 프로젝트를 생성해서 같은 문제가 발생하는지 테스트하고, 만약 같은 문제가 발생한다면 유니티 2019로 버전을 낮춰서 해보시길 권해드립니다.
@@wergia 파일 이름이 일치하는데도 문제가 발생해서 2019 버전으로 시도 해봤는데 2019 버전에서는 이름이 같지 않다고 뜹니다 이름은 같은데 말이죠..
@@wergia 2d게임도 만드려 보려 만드는데 거기도 변수가 안나오네요
많은 도움이 되었습니다. 감사합니다.
혹시 1:17 에서부터 에니메이터 컨트롤러가 없고 직접 추가해도 아바타부분에서 아무것도 선택할수 없는건 어떻게 해결할 수 있을까요?
애니메이션이 있은 FBX 모델링을 씬에 올리면 자동으로 애니메이터 컨트롤러 컴포넌트가 붙은 상태로 올라가는 것으로 알고 있습니다.
FBX 파일을 다시 임포트해서 올려보시는건 어떨까요?
@@wergia 해결이 안되서 다른 소스 들고와서 해결 했습니당! 혹시 카메라 회전 감도를 변경하려면 어떤 값에 손대야 할까요? 막 바꿔봤더니 카메라가 맘대로 왔다갔다하네요 ㄷㄷㄷ..
@@조인서-h6z 캐릭터컨트롤러 클래스의 LookAround 함수에서
Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
이렇게 마우스 델타를 구하는 부분에서
Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X") * sensitivity, Input.GetAxis("Mouse Y") * sensitivity);
이렇게 감도 값을 곱해주면 됩니다.
좌우 감도와 상하 감도를 따로 주고 싶으면
Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X") * HorizontalSensitivity, Input.GetAxis("Mouse Y") * VerticalSensitivity);
이렇게 변수를 따로 곱해줘도 됩니다.
대각선 방향키를 입력할 때 normalized가 적용이 안되어 이동속도가 늘어나길레 moveDir에도 normalized를 추가하였는데
게임을 실행하고 이동하다 방향키에서 손을 떼었을때 즉시 멈추는게 아니라 조금 더 이동하다 멈추네요
이걸 해결할 방법은 없을까요
Vector3 LookForward = new Vector3(CameraPoint.forward.x, 0f, CameraPoint.forward.z).normalized;
Vector3 lookRight = new Vector3(CameraPoint.right.x, 0f, CameraPoint.right.z).normalized;
Vector3 moveDir = (LookForward * moveInput.y + lookRight * moveInput.x).normalized;
CharaBody.forward = moveDir;
transform.position += moveDir * Time.deltaTime * MoveSpeed;
normalized 대신에 ClampMagnitude 함수를 사용해서 이동 벡터의 길이를 제한해보세요
transform.position += Vector3.ClampMagnitude(moveDir, 1f) * Time.deltaTime * 5f;
질문 몇 개 있습니다. 그대로 따라서했는데 메인이 Empty 오브젝트여서 예를들어 캐릭터가 벽에 충돌한상태로 W키를 누르면 Empty오브젝트만 앞으로 가서 카메라랑 캐릭터랑 뒤틀립니다.
이럴 경우에는 Empty 오브젝트 기준이아닌 캐릭터 기준으로 해야하나요??
또 만약 게임을 제작하다보면 카메라를 돌렸을 때, 벽속에 들어가는 현상이 있는데 이럴땐 카메라에 콜라이더를 넣어서 처리하나요?
1. 앞으로 가서 벽에 부딪히면 충돌체가 없는 카메라만 앞으로 이동하고 캐릭터는 멈춰서 틀어진다는 뜻인가요?
제가 만든 방식은
빈 게임오브젝트 + 충돌체 + 캐릭터 컨트롤러
ㄴ 캐릭터 모델링
ㄴ 카메라 암
ㄴ 카메라
이런 구조로 실제 충돌처리는 빈 게임 오브젝트가 해서 카메라와 캐릭터가 틀어지지 않는 방식으로 했습니다.
2. 카메라가 벽에 들어가지 않게 하는 방법은 여러가지가 있습니다. 카메라에 콜라이더를 넣어서 처리하는 방법도 있고
캐릭터에서 카메라가 있는 방향으로 Raycast라는 충돌감지 광선을 쏴서 감지된 거리가 캐릭터와 카메라 사이의 거리보다 짧으면 카메라를 당겨주는 방식도 사용할 수 있습니다.
@@wergia
답변 감사드립니당
1번에 질문했던 빈 오브젝트 밀림현상은 빈 오브젝트에 콜라이더 적용을 안하고 캐릭터에 적용하고 있었네요
캐릭터 콜라이더 제거하고 빈오브젝트에 적용하니까 안 밀립니다
2번 레이케스트는 함 알아봐야겠네요 ㅋㅋ 좋은 강의 감사드려요
@@박홍준-m1i 네 앞으로도 좋은 강의로 계속 찾아뵙겠습니다!ㅎㅎ
베르님 두번째 기능으로 제작했을때 부모 게임 오브젝트의 rotation값이 Vector3.zero가 아니었을 경우 이동 각도가 카메라 기준이되서 이상하게 움직이던데 하루종일 고민해도 해결방법을 못찾겠네요.
혹시 방법 알고계신가요?
3:04 2020버전에서는 자식 게임 오브젝트로 만들어도 영상처럼 캐릭터를 기준으로 회전이 되질 않네요ㅠㅠㅠ
2020에서 한 번 테스트 해봐야겠네요!
@@wergia 2019버전은 잘 되는데 왜 2020부터는 안 될까요ㅠㅠ
유니티 상단 메뉴 바로 밑에 Pivot or Center를 선택할 수 있는 버튼이 있습니다. 해당 버튼을 Pivot에 놓으면 영상처럼 부모 오브젝트를 기준으로 회전이 됩니다.
안녕하세요 베르님 항상 신세지고 있습니다
다름이 아니라 궁금한 점이 있어 여쭤보려합니다
Vector3 lookRight = new Vector3(cameraArm.right.x, 0f, cameraArm.right.z).normalized;에서
Vector3 lookRight = new Vector3(cameraArm.right.x, cameraArm.right.y, cameraArm.right.z).normalized; 로 변경해도 캐릭터가 위로 이동하지 않던데 이유가 무엇인가요?
Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x; 에서 두 벡터값을 더하므로 결국엔 moveDir의 y값에 right쪽에 카메라암의y값이 들어가는것이 아닌가요?
forward에서는 0f로 해줘야 캐릭터가 위로 향하지 않는데 right는 0f로 하지않아도 캐릭터가 위로 향하지 않는 이유가 궁금합니다.
Vector3 lookRight = new Vector3(cameraArm.right.x, cameraArm.right.y, cameraArm.right.z).normalized; 로 코드를 변경해도 캐릭터가 위아래로 움직이지 않는 이유는 우선 Right 값은 Roll 회전이 발생하지 않는 이상 수평을 유지하기 때문입니다. Pitch와 Yaw 회전만 있으면 객체의 right는 기울어지지 않고 수평을 유지합니다.
Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x; 에서 lookRight * moveInput.x를 처리하는 부분은 카메라 암의 y값이 들어가는게 아니라 플레이어의 좌우 입력 값의 크기와 캐릭터의 오른쪽 방향을 곱해서 좌우 움직임을 얼마나 보이게 만들지를 결정하는 겁니다.
@@wergia 이해했습니다 감사합니다!
@@wergia 안녕하세요 베르님. 한가지 더궁금한게 있습니다. 카메라가 벽을 통과하는 문제는 어떻게 해결해야 하나요? 카메라암에 콜라이더를 부착하라고 댓글에 말씀해주신걸 봤는데 아래 함수를 무브 함수에 추가해봤는데 잘안되서 질문드립니다.
if(Physics.Raycast(CameraArmBox.center, Vector3.back, out hit, 3f))
{
CharCamera.transform.position += Vector3.forward * Time.deltaTime * 5f;
}
else
{
CharCamera.transform.position = originPos * Time.deltaTime * 5f;
} 여기서 정상적으로 통과하지 못하게하려면 어떻게 수정해야하나요? OriginPos는 카메라의 처음 시작 포지션값이고 CameraArmBox는 카메라암의 박스콜라이더이고 CharCamer는 SerializeField처리한 카메라입니다 도저히 알수가없어 질문합니다.. 답변부탁드리겠습니다.
@@소환사자리비움 우선 RayCast를 쏘는 부분이나 RayCast를 쏴서 동작하는 맞은 위치를 검출했을 때와 못했을 때로 구분해서 처리하는 방향은 맞습니다.
다만 if(Physics.Raycast(CameraArmBox.center, Vector3.back, out hit, 3f))에서 레이캐스트를 사용하는 위치나 방향이 조금 잘못된것 같네요
우선 CameraArmBox가 어디를 중심으로 배치된 것인지 모르니 기존 코드에 있는 cameraArm을 기준으로 사용하는게 좋을 것 같습니다.
그리고 레이캐스트를 사용하는 방향으로 Vector3.back을 넣으셨는데 이 back은 cameraArm이 바라보는 방향 기준의 Back이 아니라 월드 중심 좌표가 기준이기 때문에 올바른 방향이 아닙니다.
그렇기 때문에 -cameraArm.forward를 사용해야 카메라 암이 바라보는 방향의 뒤를 구할 수 있습니다.
그리고 레이캐스트가 맞았을 때, CharCamera.transform.position += Vector3.forward * Time.deltaTime * 5f; 이런식으로 좌표를 더하고 있는데 이렇게 되면 카메라의 위치가 계속 더해져서 아예 다른 위치로 가게될 겁니다.
카메라의 위치를 정하기 위해서는 우선 레이캐스트로 구한 hit에서 맞은 거리를 hit.distance로 구할 수 있는데, 지금 카메라의 위치를 정할 때 로컬 좌표 중에 Z 값만 이용해서 사용하고 있기 때문에,
CharCamera.transform.localPosition = new Vector3(0f, 0f, -hit.distance); 정도로 구하면될 것 같습니다.
@@wergia 감사합니다! 시도해보겠습니다
10:12 에 lookright를 구하는 이유와 y 값을 0으로 구하는 이유가 궁금합니다
lookforward는 y를 캠의 y값으로 하면 플레이어가 위 아래로도 움직이기 때문에 0를 하는건 알겠는데 lookright는 캠의 y값으로 해도 문제가 없어보이더라고요
네, 그 부분은 사실 camArm.right를 그대로 써도 문제없을 겁니다. 아마 빠르게 작업한다고 앞의 코드를 복사해서 그렇게 된 것 같네요.
@@wergia 다행이네요 감사합니다
@@wergia 혹시 캐릭터의 forward를 moveDir로 해놓고
대각선으로 움직인 뒤 멈추면 캐릭터가 회전하지 않나요?
왼쪽 앞 대각선으로 움직이다 멈춘다 하면 캐릭터 보는 방향이 대각선이 아니라 앞이나 왼쪽으로 회전하고 멈추네요
제가 잘못된건가요 아니면 심화과정?인건요
@@박건영-k3u 모든 방향으로 자유롭게 이동할 수 있는 조이스틱에서는 벌어지지 않는 문제이지만 키보드는 8방향으로 입력이 제한되어 있고, 전후좌우를 제외한 대각방향은 키 조합으로 이동이 이루어지기 때문에 동시 입력한 두 방향의 키에서 손을 동시에 떼지 않으면 말씀하신것과 같은 문제가 일어납니다.
키보드에서 이런 문제를 해결하기 위해서는 최근 입력한 이동 방향을 기억해두었다가 입력이 끝났을 때 그 방향 바라보게 하는 등의 후처리가 들어가야 합니다.
@@wergia 여기서 더 들어가야 원하는게 되는거군요 답변 감사합니다
제발 이 3인칭 점프 강좌좀 내주시면 안될까요.😢😢
영상 잘 봤습니다, 다만 3인칭 게임중 마우스 휠 올리고 내리는 것으로 줌인 줌아웃 하는 기능이 있는데 이건 어떻게 구현할수 있나요?
유니티 씬 창에서 마우스 휠로 줌인 줌아웃 하는거 말하는겁니다..
ruclips.net/video/0AxnfPg_zSg/видео.html
이 영상 참고해보시면 될 것 같아요
@@wergia 감삼다!
따라하면서 벡터, 쿼터니언, 오일러... 추가적으로 공부하느라 정신이 아찔했습니다. 덕분에 많이 배워갑니다
고딩 때 기하벡터 좀 제대로 해놓을껄 ㄷㄷㄷ;
저는 문송합니다 ㅜㅜ
상세한 설명, 잘 배웠네요
베르님 혹시 rigidbody에 의한 이동은 카메라가 같이 이동하지 않는데 해결 방법이 있을까요??
collider벽에 비비고 있으면 카메라가 다른곳으로 가버립니다 ㅠㅠ
카메라가 rigidbody로 움직이는 오브젝트를 따라가도록 하면 어떨까요?
@@wergia 베르님 cameraArm.postion = characterBody.postion 이렇게 하라는 말씀인가요?? 이렇게 하면 카메라 위치가 이상하게되는데 어떤식으로 카메라가 오브젝트를 따라가도록 할까요??
missingcomponentexception there is no 'animator' attached to the.....이렇게 뜨는데 해결 방법이 있을까요??
게임 오브젝트에 Animator 컴포넌트가 붙어있지 않다는 에러입니다. 해당 오브젝트에 Animator 컴포넌트를 붙여주세요.
12분정도 되는 짧은 영상이지만 차근차근 곱씹어 보면 중요한 내용이 참 많은 것 같네요. 몇 번이나 반복해서 보면서 80% 정도는 이해하고 익힌 것 같습니다. 좋은 영상 정말 감사합니다!! 그런데 좌우로 움직이기, 뒤로 움직이기는 로직을 어떤식으로 구현하면 될까요? lookForward와 lookRight의 값을 기준으로 bool 을 추가해서 animator에 연동하면 될까요?
이동 방향 벡터를 매개변수로 해서 애니메이션 블랜딩을 걸어주시면 됩니다.
더 많은 질문이나 베르의 게임 개발 유튜브와 관련된 활동을 위한 디스코드 채널도 있습니다. 아래의 링크를 통해 방문하실 수 있습니다.
discord.gg/tqmRTy4pgk
제 캐릭터가 큐브같은 콜라이더가 적용된 물체랑 부딪힌 상태로 앞으로 가면 플레이어는 가만히있는데 카메라가 앞으로 이동해버려서 시점이 어긋나는데 이런건 어떻게 해결해주어야 할까요?
카메라가 캐릭터의 자식 오브젝트로 되어있나요?
@@wergia 네! Character의 자식오브젝트로 CameraArm이있고 그 아래에 Main Camera가 있는 상태에요
예를들면 박스맨과 큐브가 부딪히게되면 박스맨은 큐브에 부딫혀서 멈춰있는데 그 상태에서 제가 W를 계속 누른다면 카메라만 앞으로 가게되는 현상이에요 어떻게 고치면 좋을까요?
@@mogu_m0gu 혹시나 해결방안이 될까 의견을 내봅니다
새로운 스크립트를 생성하고 CameraArm을 Character에게 고정되어 움직이도록 코드를 짜보는건 어떨까요
public Transform target;
public Vector3 offset;
void Update()
{
transform.position = target.position + offset;
}
스크립트를 CameraArm에 집어넣고 Target에 Character 오브젝트를 집어넣고 Offset에 CameraArm을 고정시키고싶은 좌표를 설정한 후 실행하시면
Character 오브젝트가 벽에 부딪혀 이동하지 못하여도 CameraArm에 넣어둔 스크립트로 Character에 위치가 고정되어있어 카메라 혼자 여행다니지 않을껍니다
@@Krispy_Donuts 답변 감사합니다 ㅎ 제가 유니티에 대한 이해도가 아직 좀 낮아서 발생한거였어요 콜라이더 이리저리 만지다가 해결하긴 했는데 써주신 아이디어도 정말 좋은방법인거같아요. 감사합니다
강의가 유니티 카메라를 다루는 법에 대해 참고가 정말 많이 되었습니다.
다만 궁금한 것이 있어 이렇게 남기게 되었습니다.
다름이 아니라, 카메라 회전을 상하를 못움직이게 한상태로 정면을 바라본 상태에서 캐릭터를 중심으로 회전을
키보드 Q,E 버튼으로 돌게 하려면 어떻게 하면 좋을지 계속 이 코드를 중심으로 다뤄보다가 잘 안되고 어려워서 글을 남기게 되었습니다.
붕괴3rd 라는 게임이 있는데, 그 게임에서 화면의 시점이 pc버전을 기준으로 Q, E 가 캐릭터를 기준으로 회전하는데 이 기법을
이 코드로 적용하면서 바꿔나가는건 무리수인지 아니면 아예 처음부터 다른 코드로 다시 짜야되는건지 궁금합니다.
영상에서 작성한 코드로도 말씀하신 대로 충분히 수정이 가능합니다.
LookAround() 함수를 보면 아래와 같이 회전값을 추출할 떄 마우스 값을 가져와서 사용하는 것을 볼 수 있습니다.
private void LookAround()
{
// 마우스 이동 값 검출
Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
// ... 생략
}
이 때 위/아래 회전 없이 Q, E로 좌/우 회전을 시킨다고 하셨으니 매개변수로 카메라가 회전할 방향을 가져오고 그 값을 "Mouse X"의 위치에 넣어주고 "Mouse Y"에는 0을 넣어줍니다.
private void LookAround(float rotationDir)
{
// 마우스 이동 값 검출
Vector2 mouseDelta = new Vector2(rotationDir, 0f);
// ... 생략
}
그리고 Update() 함수를 보면 LookAround() 함수를 매개변수 없이 호출 중인데 여기에 Q, E 키의 입력상태에 따라서 rotDir의 값을 바꿔서 LookAround() 함수의 매개변수로 넣어주면 됩니다.
void Update()
{
float rotDir = 0f;
if (Input.GetKey(KeyCode.Q)) { rotDir -= 1f; }
if (Input.GetKey(KeyCode.E)) { rotDir += 1f;}
LookAround(rotDir);
Move();
}
아마 이렇게 해보면 원하시는 기능이 작동할 거라고 생각합니다.
그리고 회전 방향과 속도는 rotDir의 값을 어떻게 주느냐에 따라 달라질 겁니다.
@@wergia 일단 해봤는데, 카메라가 캐릭터를 공전하는 걸로 3인칭으로 보는걸 생각했는데,
자전하는것 같습니다.
혹시 플레이어 주변을 원으로 그리면서 공전하게 한다면 좀더 추가해야될게 있을까요?
그리고 그 코드를 써봤는데 Move()함수에 문제가 있어서 캐릭터 이동이랑 같이 쓰니 좀 꼬이네요.
WASD를 누르면 캐릭터의 이동에 상관없이 카메라가 앞으로갑니다.(캐릭터를 추월합니다.)
그래서 일단 지우고 다른걸로 테스트중인데
일단 다른점을 꼽자면 애니메이터에서 뒷걸음과 옆걸음에 관한걸 설정한건 아닌상태로 진행했습니다.
제가 애니메이션을 전부 설정을 안해서 그런걸까요...?
좀더 첨부하면 캐릭터가 자전하는게 아니라 카메라가 자전하네요
@@user-te1tp4lt9g 카메라가 자전한다는 것은 카메라가 캐릭터 주변으로 원을 그리지 않고 카메라만 제자리에서 바라보는 방향만 바뀐다는 뜻이겠죠?
음 영상에서 1:49 쯤에 기능을 만드는 과정을 보면 카메라를 단독으로 두지 않고 중심을 캐릭터 쪽에 맞춘 Camera Arm이라는 게임오브젝트를 만들고 그 아래에 카메라를 두는 것을 볼 수 있습니다.
이 카메라 암 오브젝트를 회전시키면 카메라가 캐릭터를 중심으로 회전할 겁니다.
@@wergia 감사합니다 다시한번 확인해 보겠습니다.
선생님 제가 tps 만드는데 일반 이동시엔 이동방향으로 바라보고 조준시엔 카메라 방향 바라보게 만들었는데 이렇게 만들고 벡터 slerp로 돌리니까 조준하다 조준 풀고 뒤로 걸으면 y축회전을 안하고 x z축 회전을 해버리는데 이건 어떻게 고정 시켜야 할까요??
해결했습니다 좋은강의 감사합니다
답변 드리기 전에 먼저 해결해버리셨군요! 실력 상승 속도가 굉장하십니다!
지금 계속 야근에 주말 근무 중이라 답변이 어렵네요ㅜㅜ
안녕하세요 베르님!
영상 보면서 따라하는데 2분 57초 부분에서 빈 게임오브젝트에 카메라를 자식으로 넣었는데, 오브젝트를 선택하니까 카메라만 회전이 되는데 설정이 잘못된걸까요?
어디서 확인이 가능할까요??
카메라만 회전 된다는게 카메라 중심으로 회전이 된다는 뜻인가요?
@@wergia 네 맞아요 베르님!!!ㅠ 일단 캐릭터에 자식으로 넣어서 따라다니게는 만들었는데 영상처럼 캐릭터 중심으로 위아래로 보면 부자연스럽네요ㅠ
@@월억부부 설명만으로는 파악이 어렵네요. wedevpublic@gmail.com으로 영상이나 프로젝트 보내주시면 제대로 답변 드릴 수 있을 것 같아요.
플레이어를 움직이며 큐브에 닿으면 플레이어가 밀리면서 이동이 이상해져요 이거 해결방안이 있을까요?
어떤 방식으로 이상해지나요?
그 플레이어 이동이 게임오브젝트 중심으로 움직이는 거 잖아요 블럭에 밀리면 카메라는 계속 앞으로 가지만 플레이어 오브젝트는 블럭에 막혀서 멈춰있다가 옆이나 뒤에 방향을 틀어 이동하게 되면 게임오브젝트 중심으로 플레이어 오브젝트가 뒤 옆으로 순간이동 하듯이 이동되요 이거 결국 못고쳐서 지금은 다른 플레이어 스크립트로 쓰고 있어요
고칠수 있으면 쓰고 싶은데 고칠방법이 있을까요?
특정시점의 카메라 x,y,z 각도를 변수에 담아놓고 싶은데요. Vector3 변수이름; 이나 int 등등의 종류로 변수를 선언해도 변수 = 카메라의 각도; 로 변수에 각도값을 담으면 오류가 떠요ㅠㅠ
transform.rotation을 저장하려고 하신건가요? rotation은 Quaternion 타입입니다. Quaternion 타입의 변수를 선언해서 저장해보세요.
이동시에 캐릭터 이동속도랑, 카메라 이동속도가 다른속도로 움직이는데 원인이 뭘까요? 박스맨이 아닌, 에셋스토어에서 BasicBandit 모델 사용중입니다.
카메라를 캐릭터의 자식 오브젝트로 만드셨나요?
@@wergia 제가받은 캐릭터 애니메이션 자체에 전진하는 기능이 있어서 그런것 같습니다. maximo에서 애니메이션 inplace체크하고 받으니까 얼추 잘 돌아갑니다.
문제는 이제 wsad로 움직이는 도중에 마우스로 시점을 봐꾸면 서서히 카메라좌표가 이상한쪽으로 가는 버그가 발생하네요 ㅠㅠ 어제 하루종일 원인찾다가 결국 해결못하고 에셋스토어에 tps패키지있는거 임포트해서 썼습니다..
(아마 애니메이션 전환쪽에서 뭔가 꼬인거 같아요! 연구좀 해봐야될듯 하네요)
안녕하세요 베르님 문제가 발생하였는데 해결을 못해 질문 드립니다.
플레이어가 이동은 8방향으로 전부 이동이 가능한데 대각선 방향으로 멈추면 바라보는 방향으로 멈추지 않는 현상이 있습니다.
그래서 나름 해결을 해보려고 하였지만 잘 해결이 되지 않아 이렇게 댓글 남깁니다.
animator.SetBool("isMove", isMove);
if(isMove)
{
Vector3 lookForward = new Vector3(CameraArm.forward.x, 0f, CameraArm.forward.z).normalized;
Vector3 lookRight = new Vector3(CameraArm.right.x, 0f, CameraArm.right.z).normalized;
Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x;
characterBody.forward = moveDir ;
if (moveInput.magnitude != 0)
Rotation();
transform.position += moveDir * Time.deltaTime * 5f;
}
}
void Rotation()
{
MovePos.Set(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
Quaternion q = Quaternion.LookRotation(CameraArm.TransformDirection(MovePos));
if (MovePos == Vector3.zero)
transform.rotation = q;
}
여기서 어느 코드에 문제가 있는지 알 수 있을까요??
캐릭터의 방향을 잡아주는 characterBody.forward = moveDir;를 if (moveInput.magnitude != 0) 조건문 안으로 넣어서 입력이 있는 상황에서만 방향을 변경하도록 해주세요.
그래도 같은 현상이네요... ㅜㅜ
다 완료가 됬는데 움직일때 카메라가 부드럽지 않고 끊기면서 움직이는데 어떡하나요?
움직임을 처리하는 함수를 FixedUpdate 함수로 옮겨보세요!
우선 새해 복 많이 받으시고 하시는 모든 일들이 좋은 결과가 있으시길 바랍니다.
좋은 강의 늘 감사합니다. 조금 시간은 걸리지만 프로그램을 구상하고 구현하는데 많은 공부가 되고 있습니다.
본 강의를 들으면 사소한 문제가 발생하면 다시 지우고 다시 따라 써보고 하고 있습니다.
카메라의 회전을 "오른쪽마우스"를 누르고 있을 때로 구현 하고 싶은데.
시도해 본 방법 1
private void LookAround()
{
if(input.GetMounseDown(1))
혼자 질문하고 혼자 해결하고....
private void Update()
{
if (Input.GetMouseButton(1))
{
LookAround();
}
Move();
}
선샌님 옆으로 움직일때랑 뒤로 움직일때 애니메이션 넣으려고 하는데 어떻게 해야하나요?
현직 프로이신거 같아요.
나름 현업으로 일하고는 있지만 프로급인지는 모르겠네요 ㅜㅜ
move 함수말고 물리적으로 (rigid) 움직임 구현하려는데 여기서 많이 뜯어 고쳐야겠죠..?
Move 함수에 transform.position 대신에 물리로 움직이도록 만들어주면 되겠죠...?
유니티의 카메라 스크립트는 어떻게 짜신건가요? 전 이해가 좀 안가는데
정확히 어떤 부분이 이해가 안되시는 건가요?
@@wergia 그 3인칭 카메라 스크립트는 어떻게 짜신 건가요?
혼자서 짜신건가요?
마지막에서 카메라를 멀리두고 움직이면 플레이어가 돌아요
w에서 손을떼면 캐릭터가 특정방향으로 무조건 틀어져요..ㅜㅜ 해결할방법 없을까요
characterBody.forward = moveDir; 할 때,
if(moveInput.magnitude != 0f)
{
characterBody.forward = moveDir;
}
이렇게 움직임 입력이 0이 아닐 때만 방향처리하도록 만들어주면 됩니다.
@@wergia 우와 감사합니다!!ㅜㅜㅜ
질문이 있습니다
구르기 시스템을 만드는 중인데
구르는 도중에는 플레이어가 다른 방향으로 못 움직이게 하고 싶은데
어떻게 해야할까요?
이동방향을 구할 때 lookRight는 왜구하는건가요
lookRight를 구해둬야 A키나 D키 등 좌우 이동키를 입력했을 때 좌우 이동을 할 수 있기 때문입니다.
가만히잇어도 런 애니메이션이 계속 재생되는데 해결법 아시나요?
애니메이터 컨트롤러에서 런 애니메이션이 디폴트 스테이트로 설정되어 있지 않나요?
깃허브 링크가 404로 나오네요...
다시 올려주실 수 있으신가요?
다운로드 가능한 링크로 수정했습니다! 알려주셔서 감사합니다!
혹시 캐릭터가 뒤로갈때는 캐릭터 방향이 바뀌는게 아니라 뒷걸음질하는 애니메이션이 실행되게하려면 어떻게해야 할까요
캐릭터가 뒤로 이동할 때 뒷걸음질하는 애니메이션을 실행되게 하려면 10:37 처럼 이동시 캐릭터가 바라보는 방향을 카메라 방향으로 고정시키고
캐릭터의 이동 방향에 따라 각 방향의 애니메이션을 재생시켜주면 됩니다.
이 때 각 방향의 이동 애니메이션을 자연스럽게 섞이게 만들기 위해서 애니메이션 블랜드( ruclips.net/video/U5YQBpKYhvI/видео.html )를 사용하면 좋습니다.
@@wergia 영상에 나와있었네요 감사합니다!
transform.forward가 뭔지 모르겠습니다.
해당 게임오브젝트의 정면을 의미합니다.
와 개 지린다
베르님 다름이 아니라 카메라 감도가 너무낮은데 좀 높일수 있나여?
LookAround 함수에서 cameraArm.rotation을 이렇게 바꿔주고 있는데
cameraArm.rotation = Quaternion.Euler(camAngle.x - mouseDelta.y, camAngle.y + mouseDelta.x, camAngle.z);
이거를
cameraArm.rotation = Quaternion.Euler(camAngle.x - mouseDelta.y, camAngle.y + mouseDelta.x * sensitity, camAngle.z);
이렇게 화면 회전에 sesitivity 값을 곱해서 조정해주면 될거에요
감사합니다 ㅎ
왐마 마크 3인칭시점 배그시점 가능하네요
완전 가능!
@@wergia 또 하나의 초신성이 탄생합니다
"빛나는 현상이 마치 새로운 별이 태어나는 것처럼 보이기에 신성이라는 명칭이 붙었지만, 실제로는 수명이 다한 별이 폭발하며 엄청난 에너지를 내뿜는 것이다."
빠른 사망각
혹시 벽이랑 닿았을때 계속 앞으로가는키 누르면 카메라가 흔들린다거나 가끔씩 벽도 뚫리는데 이런건 어떻게 해결해야할까요
우선 카메라가 벽을 뚫고 지나가는 문제는 카메라 암에 콜라이더를 달거나 카메라 뒤 방향으로 레이캐스트를 쏴서 거리를 측정한 뒤 충돌한 물체가 있다면 카메라의 위치를 앞으로 당기는 식으로 파고드는 문제를 해결할 수 있습니다.
그리고 벽에 충돌한 상태에서 카메라가 흔들리는 문제는 이동 처리인 Move 함수를 Update 함수가 아닌 FixedUpdate 함수로 옮겨서 처리해보세요.
FixedUpdate 함수는 유니티 엔진에서 물리 계산과 동일한 시점에 코드를 실행하기 때문에 콜라이더와 충돌했을 때 타이밍이 어긋나지 않아서 떨림이 사라질 겁니다.
euler를 처음 봤어요! 혹시 관련 영상 있을까요??
벡터 영상에서 가볍게 다루고 지나간 적이 있습니다.
오일러 각은 Vector3로 회전을 표현하는 방법입니다. 기본적으로 유니티에서는 Quaternion이라는 클래스로 오브젝트의 회전을 표현하는데 이 쿼터니언 방식은 값으로 회전을 유추하거나 계산하는게 어렵기 때문에 간단한 방식인 오일러 방식으로 변환해서 사용하는 겁니다.
ruclips.net/video/BHhndhjcTsw/видео.html
Vector3 lookForward = new Vector3(CameraArm.forward.x, 0f, CameraArm.forward.z).normalized;
Vector3 lookRight = new Vector3(CameraArm.right.x, 0f, CameraArm.right.z).normalized;
이 코드 부분이 이해가 안되는데 혹시 설명해주실수 있으신가요..
카메라 방향에서 높이 값을 제거하고 순수하게 캐릭터 위치에서 정면과 오른쪽 방향을 추출해내는 코드입니다.
@@wergia 답변 감사합니다.
마우스 휠로 줌 인 아웃 하다가 1인칭 시점으로 바뀌게 한다거나 가능한가요?
기능을 좀 더 구현하면 가능합니다
@@wergia 줌으로 1인칭 시점으로 바뀌는걸 구현해봤는데...
CharactetBody.forward = moveDir로 하니 옆으로 움직일때 어깨가...
CharactetBody.forward를 일반 TPS 시점으로 움직일때는 moveDir로
무기를 들었을때나 1인칭일때는 lookForward로 바꾸려면 어떻게 해야할까요.
@@astragoldn5780 1인칭과 3인칭을 오갈 수 있는 게임에서는 보통 1인칭용 모델링과 3인칭용 모델을 따로 사용합니다.
1인칭 모드로 바뀌면 팔만 있는 모델을 사용해서 몸이 카메라를 가리지 않도록하고 3인칭 모드로 바뀌면 팔만 있는 모델을 숨기고 몸 전체 모델링을 보여주는 방식으로 말이죠.
@@wergia 멀티 플레이시에는 자신에게만 1인칭+3인칭, 다른 플레이어에게는 3인칭 모델만 보여주는 식인가요?
또 총을 들고 조준할때 같은 상황에서 lookForward로 전환하도록 할수있었으면 합니다.
혹시 오르막길이나 내려막길을 자연스럽게 이동하는법 강의 가능 하신가요? 평면이면 괜찮은데 오르막길을 일 때 이동하면 땅에 박을려고 해서 이동속도가 줄어들어요.
일단 간단하게 설명드리자면 캐릭터와 지면을 높이가 2인 캡슐 콜라이더를 이용해서 바닥을 뚫지 못하게 했을 때, 캡슐의 중심에서 바닥으로 레이캐스트를 쏘면 높이가 거의 1일겁니다.
하지만 내리막길이나 오르막길에서는 캡슐 콜라이더 바닥면의 굴곡때문에 그 높이가 1보다 크게 됩니다.
그 때 캐릭터의 몸체를 조금 더 눌러준다면 캐릭터가 좀 더 자연스럽게 경사면을 움직일 수 있게 될 겁니다.
다음에 기회가 되면 영상에서도 한 번 다뤄보도록 하겠습니다.
벽이 있으면 못 가게 하는 법은 없나여?
캐릭터에서 목적지 방향으로 레이캐스트를 쏴서 벽이 있으면 움직이지 않는 방법으로 처리하면 될 것 같아요
근대 레이캐스트가 뭔가요?
@@daldalgogi 일종의 광선을 쏴서 맞은 위치를 찾아내는 유니티 기능입니다
감사합니다. 카메라 이동 부분이 큰도움이 됐습니다. 그 혹시 카메라 방향으로 캐릭터의 시선처리를 하고싶은데 애니메이션으로 로테이션값이 고정돼있는데 어떻게 방법이 없을까요?
IK라는 기능으로 머리부분쪽을 따로 움직여주시면 됩니다.
@@wergia 아하 IK에 대해서 좀 공부해봐야 겠네욤 감사합니다!
private void Move부분에 에러가 납니다.
private void Move()
{
Vector2 moveInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
bool isMove = moveInput.magnitude != 0;
animator.setBool("isMove", isMove);
if(isMove)
{
Vector3 lookForward = new Vector3(cameraArm.forward.x, 0f, cameraArm.forward.z).normalized;
Vector3 lookRight = new Vector3(cameraArm.right.x, 0f, cameraArm.right.z).normalized;
Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x;
characterBody.forward = lookForward;
transform.position += moveDir * Time.deltaTime * 5f;
}
//Debug.DrawRay(cameraArm.position, new Vector3(cameraArm.forward.x, 0f, cameraArm.forward.z).normalized, Color.red);
}
부분에서
animator.setBool("isMove", isMove);
부터 문제가 있는거 같은데 잘 모르겠습니다.
코딩 외에도 에디터 실행하면 따로 조작하지 않고 가만히 있는데도 걷는 애니메이션이랑 서있는 모습이 반복됩니다.
스크립트 에디터에서 발생하는 명시적인 에러인가요? 아니면 코드 진행이나 동작이 의도와는 다르게 발생하는 논리적인 에러인가요?
우선 대영님이 옮기신 코드가 완벽하게 복사해서 옮긴 코드라고 가정했을 때,
animator.setBool("isMove", isMove);
부분에서 에러가 발생하는 문제는 SetBool 함수 호출시 S가 대문자여야 하는데 소문자로 쓰셔서 그럴 수 있다고 생각됩니다.
실제 코드에서 SetBool로 틀리지 않고 쓰셨다면 그 외의 부분을 봐야겠죠. 애니메이션이 제대로 동작하지 않는다고 하셨으니 애니메이터에 파라미터로 선언된 isMove와 SetBool 함수로 호출하는 "isMove" 사이에 둘 중 하나에 오타가 있지는 않은지, 애니메이터의 트랜지션 세팅이 제대로 되어 있는지 확인해야 할 것 같습니다.
@@wergia SetBool을 잘못 적었네요. 움직이는건 해결 되었습니다.
걸을때 애니메이션도 잘 나오고요. 그런데 서있을때는 아직 걷는 애니메이션이랑 섞여 나옵니다.
Stand에서Run으로가는 연결부분에 Conditions가 설정이 안되있었네요. 애니메이션 부분도 해결했습니다.
혹시 시점 돌리기를 더 빠르게 만들순 없나요?
카메라 회전 속도를 높이는 것 말인가요?
public float rotateSensitivity; 같은 값을 만들어서 인스펙터에 공개해준 다음 카메라를 회전하는 값에 곱해주면 속도를 더 빠르게 할 수도 있고 느리게 할 수도 있어요!
@@wergia 코드 어느 부분에 곱하는 코드를 입력하나요?
@@user-ek9dp4fu1s LookAround 함수에서 cameraArm.rotation을 이렇게 바꿔주고 있는데
cameraArm.rotation = Quaternion.Euler(camAngle.x - mouseDelta.y, camAngle.y + mouseDelta.x, camAngle.z);
이거를
cameraArm.rotation = Quaternion.Euler(camAngle.x - mouseDelta.y, camAngle.y + mouseDelta.x * sensitity, camAngle.z);
이렇게 곱해주면 될 겁니다.
@@wergia 이렇게 하니까 해결이 됐어요! 감사합니다!
@@wergia 베르님! 감사합니다! 저도 이코드 써서 카메라 빨리 돌아가게 해줬는데 양옆으로는 빨라졌는데 위아래로 움직이는게 여전히 느리네요 ㅠ 어디에 값을 더 곱해줘야 될까요?..
혹시 저기에 점프를 추가하려면 어떻게 해야하나요
캐릭터 Ridbody에 AddForce로 힘을 가해주시면 됩니다.
에셋파일에 안들어가요 ㅠ
BoxMan@Attack.FBX 파일을 Assets/BoxMan@Attack.FBX에 복사하지 못했습니다.
UnityEditorInternal.InternalEditorUtility:ProjectWindowDrag(HierarchyProperty, Boolean)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
음... 유니티 에러인 것 같은데 재실행하거나 프로젝트를 새로 만들어서 해도 같은 문제가 발생하나요?
2019.4.16f1 personal은안돼네요
어떤 부분에서 안되시나요?
저는 왜 카메라 회전은 되는대 케릭터 이동이 안 될까요?
움직이는 로직 부분 동작을 확인해보세요
이걸 모바일에 적용하면 실행이 안되겠죠?
카메라가 안움직이는데요..ㅋㅋ
코드 부분에 문제가 없다면 컴포넌트 연결이 잘 되어 있는지 확인해봐야 해요