diff --git "a/Day5/5-2.\355\224\204\353\246\254\355\214\271\352\260\234\353\205\220\352\263\274\355\231\234\354\232\251.md" "b/Day5/5-2.\355\224\204\353\246\254\355\214\271\352\260\234\353\205\220\352\263\274\355\231\234\354\232\251.md" index 6b678dc..eadb625 100644 --- "a/Day5/5-2.\355\224\204\353\246\254\355\214\271\352\260\234\353\205\220\352\263\274\355\231\234\354\232\251.md" +++ "b/Day5/5-2.\355\224\204\353\246\254\355\214\271\352\260\234\353\205\220\352\263\274\355\231\234\354\232\251.md" @@ -31,7 +31,7 @@ - 프리팹을 씬으로 다시 끌어오면 **인스턴스(Instance)** 생성됨 - 여러 개의 인스턴스를 만들어도 원본 프리팹과 연결 유지됨 -- 코드로 인스턴스화하기 1 +- 코드로 인스턴스화하기 1(런타임 프리팹 인스턴스화) ```csharp using UnityEngine; public class InstantiationExample : MonoBehaviour @@ -47,8 +47,6 @@ public class InstantiationExample : MonoBehaviour } } ``` -- 코드로 인스턴스화하기 2: List 사용(설명 필요)
-🔩 List_Prefab 씬 ### ③ 수정하기 diff --git "a/Day5/5-4.Light\352\265\254\354\204\261\354\235\264\355\225\264(Point,Spot).md" "b/Day5/5-4.Light\352\265\254\354\204\261\354\235\264\355\225\264(Point,Spot).md" index 6a0ac15..6b0f744 100644 --- "a/Day5/5-4.Light\352\265\254\354\204\261\354\235\264\355\225\264(Point,Spot).md" +++ "b/Day5/5-4.Light\352\265\254\354\204\261\354\235\264\355\225\264(Point,Spot).md" @@ -64,6 +64,13 @@ Unity에는 여러 조명 타입이 있으며, 대표적으로 아래 세 가지 2. 다양한 오브젝트에 그림자 옵션 추가 (Mesh Renderer > Cast/Receive Shadows) 3. Light > Realtime / Baked / Mixed 설정 실험 +### 🎮 baked light 설정법 +1. light의 모드를 baked로 변경 +2. 빛을 받을 오브젝트를 contibute illumination로 설정 +3. light 창의 generate light 클릭 + +오브젝트나 빛을 움직이면 다시 generate 해야 함 + ### 🌃 장면 구성 예시 - 어두운 방 안 → 천장에 Point Light diff --git "a/Day5/5-5.Material\354\240\234\354\236\221\354\213\244\354\212\265(PBR\352\270\260\353\260\230).md" "b/Day5/5-5.Material\354\240\234\354\236\221\354\213\244\354\212\265(PBR\352\270\260\353\260\230).md" index ee8839b..ebf7afd 100644 --- "a/Day5/5-5.Material\354\240\234\354\236\221\354\213\244\354\212\265(PBR\352\270\260\353\260\230).md" +++ "b/Day5/5-5.Material\354\240\234\354\236\221\354\213\244\354\212\265(PBR\352\270\260\353\260\230).md" @@ -52,22 +52,32 @@ --- ## 3. 🧪 텍스처 적용 실습 -**🔩 PBR 씬. 텍스쳐 없이, 텍스쳐 있이** +**🔩 LightTest씬. PBR 씬. 텍스쳐 없이, 텍스쳐 있이** 1. [cc0textures.com](https://ambientcg.com/) 또는 [polyhaven.com](https://polyhaven.com/)에서 PBR 텍스처 세트 다운로드 2. Unity로 임포트 후, 각각 슬롯에 드래그하여 적용: - Albedo → Base Map - - Normal → Normal Map (압축 해제 후 Fix 버튼 클릭) - - Metallic / Roughness → Mask Map 또는 별도 연결 + - Normal → Normal Map (Texture Type을 Normal map으로 변경) + - dx용 normal map일 경우, opengl용으로 값을 뒤집어주는 과정이 필요 + - dx용 normal map은 움푹 들어간 느낌임. + - [ ![텍스트](https://europe1.discourse-cdn.com/unity/optimized/4X/b/8/3/b83fc6ae3eb5a4022e82c545a268be5d4689bf71_2_1035x517.jpeg) ]( https://europe1.discourse-cdn.com/unity/optimized/4X/b/8/3/b83fc6ae3eb5a4022e82c545a268be5d4689bf71_2_1035x517.jpeg ) + - Height -> Height Map, Ao -> OCClusion Map + - Metallic / Roughness → Unity는 Metalic과, Roughness를 뒤집은 Smoothness가 합쳐져있는걸 쓰기 때문에, 먼저 합쳐주는 과정 필요 3. Metallic/Smoothness 값 조절하며 결과 확인 +💡 Normal map을 뒤집고, metallc과 roughness를 합치는 데 유용한 프로그램 +- https://github.com/Fidifis/TextureMerge/releases +- zip 압축 풀어서 사용 + +💡 Texture 임포트 시 `sRGB` 체크 해제 필요 (Metallic 등) + --- ## 4. 🧱 씬에 적용 - 3D 오브젝트(Plane, Cube, Wall 등)에 머티리얼 드래그 - 조명 변경 후 반사/음영 변화 확인 -- 카메라 위치 및 포스트 프로세싱으로 최종 효과 연출 +- 카메라 위치로 최종 효과 연출 --- @@ -81,9 +91,6 @@ --- ## 💡 팁 - -- Texture 임포트 시 `sRGB` 체크 해제 필요 (Metallic 등) -- Roughness → Smoothness 변환 필요할 수 있음 (Photoshop 또는 Unity MaskMap 사용) - URP 사용 시 Shader Graph로 커스텀 셰이더도 가능 --- diff --git "a/Day5/5-7.\354\213\244\354\212\265_3DPlayground\354\224\254\352\265\254\354\204\261.md" "b/Day5/5-7.\354\213\244\354\212\265_3DPlayground\354\224\254\352\265\254\354\204\261.md" index a1f67ba..ff1458f 100644 --- "a/Day5/5-7.\354\213\244\354\212\265_3DPlayground\354\224\254\352\265\254\354\204\261.md" +++ "b/Day5/5-7.\354\213\244\354\212\265_3DPlayground\354\224\254\352\265\254\354\204\261.md" @@ -34,7 +34,6 @@ - 반복적으로 사용할 오브젝트들을 **Prefab**으로 저장 - 예시: - `Obstacle01` (큐브 + 머티리얼) - - `PickUpItem` (회전하는 구체) 👉 `Assets/Prefabs/` 폴더에 정리 diff --git "a/Day5/5-8.FPSController\354\241\260\354\236\221\354\213\244\354\212\265.md" "b/Day5/5-8.FPSController\354\241\260\354\236\221\354\213\244\354\212\265.md" index b42c5b7..6f781ba 100644 --- "a/Day5/5-8.FPSController\354\241\260\354\236\221\354\213\244\354\212\265.md" +++ "b/Day5/5-8.FPSController\354\241\260\354\236\221\354\213\244\354\212\265.md" @@ -153,6 +153,7 @@ public class FPSController : MonoBehaviour - 3D 플레이그라운드 유니티 화면(씬뷰+게임뷰+pbr material 하나 인스펙터) 스크린샷 1장만 - velog 글 링크 하나 +- 플레이 데모 영상 하나 ## 💡 팁 diff --git a/Day6/6-1.RigidbodyvsCharacterController.md b/Day6/6-1.RigidbodyvsCharacterController.md index dbf55e0..fde7f41 100644 --- a/Day6/6-1.RigidbodyvsCharacterController.md +++ b/Day6/6-1.RigidbodyvsCharacterController.md @@ -5,14 +5,14 @@ --- ## 🧠 학습 목표 - +dd - Rigidbody와 Character Controller의 차이를 명확히 이해한다. - 각각의 장단점과 사용 시나리오를 비교한다. - 실제 프로젝트에서 어떤 컨트롤러를 사용할지 판단할 수 있다. --- -🔩예시 씬: rigidbody, characterController 값들, 함수설명 +🔩예시 씬: rigidbody, characterController 값들, 함수설명. playerController.cs로 ## 1. Rigidbody란? @@ -23,7 +23,12 @@ ### ✅ 특징 - 실제 물리 법칙을 시뮬레이션함 - 외부 힘(Force, Torque) 적용 가능 -- 이동/회전은 `AddForce()` 등으로 수행(함수설명) +- 이동/회전은 `AddForce()`, `MovePosition()`, `velocity` 등으로 수행(함수설명) + +### 예시코드 +```chsarp +rb.MovePosition(rb.position + move * moveSpeed * Time.deltaTime); +``` --- @@ -75,7 +80,6 @@ ## 5. 사용 팁 - 두 컴포넌트를 동시에 사용하면 충돌 문제가 발생하므로 **둘 중 하나만 사용**! -- Rigidbody를 사용할 경우 **이동은 Force로**, Character Controller는 **Move() 함수 사용** - 캐릭터의 발 아래에 `Ground Check` 로직 추가 시 안정성 향상 --- diff --git "a/Day6/6-2.Trigger&Collider\355\231\234\354\232\251.md" "b/Day6/6-2.Trigger&Collider\355\231\234\354\232\251.md" index d6f4eae..51585e7 100644 --- "a/Day6/6-2.Trigger&Collider\355\231\234\354\232\251.md" +++ "b/Day6/6-2.Trigger&Collider\355\231\234\354\232\251.md" @@ -19,9 +19,33 @@ - `Is Trigger` 체크 해제 시, **충돌 처리** 전용 ```csharp -void OnCollisionEnter(Collision collision) { +// 충돌 시 한번만: 충돌체 둘 중 하나에 rigidbody 있어야 함 +void OnCollisionEnter(Collision collision) +{ Debug.Log("충돌 발생: " + collision.gameObject.name); } + +// 충돌 할 때마다: 충돌체 둘 중 하나에 rigidbody 있어야 함 +private void OnCollisionStay(Collision collision) +{ + +} + +// 충돌 할 때마다: 충돌체 둘 중 하나에 CharacterController 있어야 함 +void OnControllerColliderHit(ControllerColliderHit hit) +{ + Debug.Log("충돌 발생: " + hit.gameObject.name); +} + +void OnCollisionStay(Collision collision) +{ + if(collision.gameObject.tag == "Player") + { + Debug.Log("충돌"); + rb.AddForce(force * collision.transform.forward); + } +} + ``` --- @@ -33,7 +57,9 @@ void OnCollisionEnter(Collision collision) { - 물리적 충돌 없이 겹쳐지는 순간을 감지 ```csharp -void OnTriggerEnter(Collider other) { +// 트리거에 들어왔을 때 +void OnTriggerEnter(Collider other) +{ Debug.Log("트리거 진입: " + other.name); } ``` diff --git "a/Day6/6-3.Cinemachine\354\271\264\353\251\224\353\235\274\354\213\234\354\212\244\355\205\234.md" "b/Day6/6-3.Cinemachine\354\271\264\353\251\224\353\235\274\354\213\234\354\212\244\355\205\234.md" index 679d17f..05d7aae 100644 --- "a/Day6/6-3.Cinemachine\354\271\264\353\251\224\353\235\274\354\213\234\354\212\244\355\205\234.md" +++ "b/Day6/6-3.Cinemachine\354\271\264\353\251\224\353\235\274\354\213\234\354\212\244\355\205\234.md" @@ -11,7 +11,7 @@ - 다양한 Virtual Camera와 Blend 설정으로 장면 전환 효과를 연출한다. --- -🔩예시 씬 +🔩예시 씬. CM_Scene ## 1. Cinemachine이란? @@ -49,6 +49,8 @@ ## 4. 실습 예시: 플레이어 추적 카메라 +5일차에 만든 fps controller 활용 + 1. Main Camera에 Cinemachine Brain 추가 2. Hierarchy > Cinemachine > Create Virtual Camera 3. Virtual Camera 선택 후: diff --git "a/Day6/6-6.\354\213\244\354\212\265_3D\353\257\270\354\205\2302\354\242\205\354\240\234\354\236\221(\354\240\220\355\224\204,\354\210\230\354\247\221).md" "b/Day6/6-6.\354\213\244\354\212\265_3D\353\257\270\354\205\2302\354\242\205\354\240\234\354\236\221(\354\240\220\355\224\204,\354\210\230\354\247\221).md" index 1c78f09..b744bd5 100644 --- "a/Day6/6-6.\354\213\244\354\212\265_3D\353\257\270\354\205\2302\354\242\205\354\240\234\354\236\221(\354\240\220\355\224\204,\354\210\230\354\247\221).md" +++ "b/Day6/6-6.\354\213\244\354\212\265_3D\353\257\270\354\205\2302\354\242\205\354\240\234\354\236\221(\354\240\220\355\224\204,\354\210\230\354\247\221).md" @@ -22,18 +22,187 @@ - 땅에 닿아 있을 때만 점프 가능 - 점프 쿨타임 또는 중복 점프 방지 -### 🛠️ 주요 구성 요소 -- `Cinemachine`으로 시점 구현. -- `Rigidbody` 사용 시 점프: `AddForce` 또는 `velocity` 제어 -- `CharacterController` 사용 시 점프: 점프 직접 구현 필요 +### 🛠️ 주요 구성 요소 1: 3인칭 시점 + +- `Cinemachine`의 `FreeLockCamera`로 3인칭 시점 구현.(샘플로 만든 씬 보여줘서 어떻게 3인칭 시점이 작동하면 되는가 보여주기+캐릭터 게임오브젝트 구성요소) +```csharp +private float rotationVelocity; + +private void Rotate() +{ + // FreeLockCamera + // Follow, Look at을 Player로 + // top, middle, bottom rig의 Body > X/Y/Z Damping을 전부 0으로.(카메라가 늦게 따라가는거 방지) + // 필요에 따라, Y, X axis invert + // 필요에 따라, Orbit rig 설정 + + // 대상이 될 카메라의 y축 각도 + float targetRotation = Camera.main.transform.eulerAngles.y; + // 현재 캐릭터의 y축 각도를 대상 각도(targetRotation)를 향해 mouseSensitivity 속도로 회전시켜준다. + float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref rotationVelocity, 1/mouseSensitivity); + // 구해진 rotation을 Quaternion.Euler에 y축 각도로 넣어주고 transform.rotation에 적용 + transform.rotation = Quaternion.Euler(0, rotation, 0); +} +``` +- `Rigidbody` 사용 시 이동: +```csharp +// 키보드 이동 +Vector3 move = transform.right * moveX + transform.forward * moveZ; + +rb.MovePosition(rb.position + move * moveSpeed * Time.fixedDeltaTime); +``` + +
+3인칭 시점 구현 답 확인 + +```csharp +//FixedUpdate 내부의 3인칭 시점 구현 답 +// 키보드 이동 +Vector3 move = transform.right * moveX + transform.forward * moveZ; + +rb.MovePosition(rb.position + move * moveSpeed * Time.fixedDeltaTime); + +if (move != Vector3.zero) +{ + Rotate(); + Quaternion moveRotation = Quaternion.LookRotation(move); + childObj.transform.rotation = moveRotation; +} +``` + +
+ +
+3인칭 시점 구현 답(최종 전체 코드) + +```csharp +using Cinemachine; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PalyerControllerThirdAns : MonoBehaviour +{ + public float moveSpeed = 5f; + public float mouseSensitivity = 100f; + public GroundChecker groundChecker; // 아래 GroundChecker.cs 코드도 있음. + public float jumpForce; + + public CinemachineFreeLook freeLockCamera; + + public GameObject childObj; + + private Rigidbody rb; + + private float rotationVelocity; + + private float moveX; + private float moveZ; + + void Start() + { + rb = GetComponent(); + Cursor.lockState = CursorLockMode.Locked; + } + + void Update() + { + moveX = Input.GetAxis("Horizontal"); + moveZ = Input.GetAxis("Vertical"); + if (groundChecker.IsGrounded() && Input.GetButtonDown("Jump")) + { + //Debug.Log("그라운드 점프"); + rb.AddForce(Vector3.up * jumpForce, ForceMode.VelocityChange); + } + } + + void FixedUpdate() + { + Vector3 move = transform.right * moveX + transform.forward * moveZ; + //rb.velocity = move * moveSpeed + Vector3.up * rb.velocity.y; + //rb.AddForce(move * moveSpeed); // 마찰력으로 인해 이동 안됨 + + rb.MovePosition(rb.position + move * moveSpeed * Time.fixedDeltaTime); + + if (move != Vector3.zero) + { + Rotate(); + Quaternion moveRotation = Quaternion.LookRotation(move); + childObj.transform.rotation = moveRotation; + } + } + + private void Rotate() + { + // 대상이 될 카메라의 y축 각도 + float targetRotation = Camera.main.transform.eulerAngles.y; + // 현재 캐릭터의 y축 각도를 대상 각도(targetRotation)를 향해 mouseSensitivity 속도로 회전시켜준다. + float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref rotationVelocity, 1 / mouseSensitivity); + // 구해진 rotation을 Quaternion.Euler에 y축 각도로 넣어주고 transform.rotation에 적용 + transform.rotation = Quaternion.Euler(0, rotation, 0); + } +} +``` + +
+ +### 🛠️ 주요 구성 요소 2: 점프 +- `Rigidbody` 사용 시 점프: `AddForce. 모드는 ForceMode.VelocityChange` 또는 `velocity` 제어 + - rigidbody에서 rotation freeze 필요 +- `CharacterController` 사용 시 점프: 물리 직접 구현 필요 +- 지면에 있을 때만 점프가 가능하게 해야 함. +- 점프 키 입력 감지 함수 공통: `Input.GetButtonDown("Jump")` - 점프 후 사운드 재생, 이펙트 연동도 확장 가능 +### 💡 주의할 점 +- `FixedUpdate`에서 이동과 카메라 이동을 구현 해야 카메라 떨림 발생안함. +- `Update`에서 점프를 구현해야 함. 그렇지 않으면, 점프 키 씹힘 문제 발생 가능. + ### 💡 지면 판정 팁 `isGrounded` 플래그 처리. 아래는 그 방법들 -- `OnCollisionEnter` -- `Physics.Raycast` -- `Physics.Boxcast` +- `OnCollisionEnter`: 가장 간단함. but, 플레이어의 옆과 부딪혀도 지면판정함. +- `Physics.Raycast` : 위의 문제 없음. but, 급낙하 문제 +[ ![텍스트](https://velog.velcdn.com/images/nagi0101/post/d2bb6519-dc90-4a91-9b1c-d8fc8d6b646c/image.png) ]( https://velog.velcdn.com/images/nagi0101/post/d2bb6519-dc90-4a91-9b1c-d8fc8d6b646c/image.png ) + +- `Physics.Boxcast` : 위 2개 문제 해결. GroundChecker.cs 예시 +```csharp +using UnityEngine; + +public class GroundChecker : MonoBehaviour +{ + [Header("Boxcast Property")] + [SerializeField] private Vector3 boxSize; + [SerializeField] private float maxDistance; + [SerializeField] private LayerMask groundLayer; + + [Header("Debug")] + [SerializeField] private bool drawGizmo; + + private void OnDrawGizmos() + { + if (!drawGizmo) return; + + Gizmos.color = Color.cyan; + Gizmos.DrawCube(transform.position - transform.up * maxDistance, boxSize); + } + + public bool IsGrounded() + { + /* BoxCast 매개변수들 + 1. Box Ray를 발사할 시작점 + 2. Box 크기의 절반 + 3. Box Ray를 발사할 방향 + 4. Box의 회전값 + 5. Box Ray가 갈 수 있는 최대 거리 + 6. Box Ray와 충돌 판정이 가능한 Layer들 + */ + return Physics.BoxCast(transform.position, boxSize / 2.0f, -transform.up, transform.rotation, maxDistance, groundLayer); + } + +} +``` +🎯 `BoxCast` 설명글: http://theeye.pe.kr/archives/2764 🎯 `CharacterController`는 특히, 중력 직접 구현 시, `isGrounded`일 경우, 중력값 누적을 멈춰야 함. 급낙하 방지 위함. @@ -57,14 +226,16 @@ ## 3. 확장 아이디어 +- 아이템 수집 시, 소리 출력 - 제한 시간 내 아이템 수집 게임 +- 캐릭터 모델 및 캐릭터 애니메이션 삽입 - 특정 개수 이상 수집 시 다음 스테이지 전환 - 점프 미션과 수집 미션을 혼합한 퍼즐 구성 --- ## ✅ 완료 체크리스트 - +- [ ] 3인칭 시점 기능 정상 작동 - [ ] 캐릭터 점프 기능 정상 작동 - [ ] 중복 점프 방지 로직 포함 - [ ] 아이템 충돌 → 사라짐 구현 @@ -72,12 +243,14 @@ - [ ] 플레이어 Prefab 정리 완료 ## ✅ 산출물 -- 점프액션+아이템 수집 게임 유니티 화면(씬+게임뷰+캐릭터 조작 스크립트 코드 인스펙터 화면)을 캡쳐한 사진 1장만 +- 점프+아이템 수집 3인칭 게임 데모 영상 +- 점프+아이템 수집 3인칭 게임 유니티 화면(씬+게임뷰+캐릭터 조작 스크립트 코드 인스펙터 화면)을 캡쳐한 사진 1장만 - 간단한 게임설명이 같이 들어간 velog글 링크 하나. --- ## 🔗 참고 자료 +- 무료 효과음 사이트: https://soundeffect-lab.info/sound/button/ - [Unity Manual - Rigidbody](https://docs.unity3d.com/Manual/class-Rigidbody.html) - [Unity Docs - OnTriggerEnter](https://docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html) diff --git "a/Day7/7-1.\354\204\261\353\212\245\353\266\204\354\204\235\352\260\234\353\205\220(Profiler).md" "b/Day7/7-1.\354\204\261\353\212\245\353\266\204\354\204\235\352\260\234\353\205\220(Profiler).md" index 97b46f3..7ce5f02 100644 --- "a/Day7/7-1.\354\204\261\353\212\245\353\266\204\354\204\235\352\260\234\353\205\220(Profiler).md" +++ "b/Day7/7-1.\354\204\261\353\212\245\353\266\204\354\204\235\352\260\234\353\205\220(Profiler).md" @@ -1,3 +1,4 @@ +# 이거 말고 Animator ㄱ? # 🔍 성능 분석 개념 (Profiler) > Unity Profiler를 통해 게임의 성능 병목을 분석하고, 최적화를 위한 기초적인 분석 방법을 익힙니다. @@ -84,6 +85,11 @@ Unity Profiler는 게임 실행 중 다양한 성능 데이터를 시각적으 --- +## 💡 AI 사용 시 주의점 +ai가 주는 코드 한줄한줄 무슨 코드인지 이해하고, 잘못된 코드인지 아닌지 확인하고 써야한다. ai 코드 그냥 무조건 맞겠지 하고 계속 갖다붙이면 나중에 코드 규모 커질 때 언젠가 뻑이 가고, 그때 고칠려하면 굉장히 힘듬. + +--- + ## 💡 GitKraken - GUI로 간편하게 Git 작업을 할 수 있는 프로그램 - Git 히스토리를 한 눈에 편하게 볼 수 있음. @@ -100,8 +106,8 @@ Unity Profiler는 게임 실행 중 다양한 성능 데이터를 시각적으 --- ## 📦 산출물 +- 최종 게임 데모 영상 - 만든 최종 게임 유니티 화면(씬+게임뷰) 스크린샷 하나 -- profiler성능분석 ai 답변 스크린샷 하나 - 게임설명 velog 링크 하나 --- diff --git "a/Day7/7-9. \354\225\240\353\213\210\353\251\224\354\235\264\354\205\230 \354\240\201\354\232\251\355\225\230\352\270\260.md" "b/Day7/7-9. \354\225\240\353\213\210\353\251\224\354\235\264\354\205\230 \354\240\201\354\232\251\355\225\230\352\270\260.md" new file mode 100644 index 0000000..d81e28f --- /dev/null +++ "b/Day7/7-9. \354\225\240\353\213\210\353\251\224\354\235\264\354\205\230 \354\240\201\354\232\251\355\225\230\352\270\260.md" @@ -0,0 +1,76 @@ +# 🔍 애니메이션 적용하기 + +> mixamo를 사용해 어제 만든 3인칭 게임에 모델과 애니메이션을 적용해봅시다. + +--- + +## 🎯 학습 목표 + +- Animator, Animation Controller로 애니메이션 적용하기 +- 코드로 애니메이션 상태 전환하기 + +--- + +## 1. Animator란? + +모델에 애니메이션을 적용하기 위한 컴포넌트 + +Animator Controller와 같이 써야함 + +--- + +## 2. 사용 방법 + +### 2-1. 애니메이션 파일 추출하기(일단은 idle) +1. mixamo.com 에 접속 +2. 로그인 +3. Characters 클릭 +4. 가져오고 싶은 모델 선택 +5. Animations 클릭 +6. 가져오고 싶은 애니메이션들 검색하기(ex: idle, walk, jump) +7. In place 체크박스가 있는 경우 체크 +8. DOWNLOAD 클릭 +9. Format을 fbx for Unity로 변경. +10. DOWNLOAD 클릭 +10. 다운로드한 fbx파일을 유니티의 프로젝트 뷰로 옮기기 +11. 프로젝트 뷰에서 다운로드한 파일 클릭 +12. Animation 탭 클릭 +13. 쭉 아래로 내려서 Loop Time 체크 +14. Apply 버튼 클릭 후 완료될 때 까지 대기 +15. 다운로드한 파일 좌측 삼각형 클릭해서 세부 파일들 보기 +16. 세모 모양 세부 파일 클릭 +17. 컨트롤 + D를 눌러 그 세모 모양 세부 파일 복사 + +### 2-2. 애니메이션 적용하기(일단은 idle) +1. 다운로드한 파일을 Hierarchy의 적용하고 싶은 곳에 넣기(새로운 모델 오브젝트가 생성됨) +2. 텍스쳐가 적용이 안된 경우, 그 fbx 파일 클릭 후 animation탭으로 이동 후, extract texture, extract material 클릭해서 적용 +3. 새로운 모델 오브젝트 클릭 후, Add Component로 Animator 가져오기 +4. 프로젝트 뷰에 마우스 우클릭 후, Create > Animator Controller 클릭해서, Animator Controller 생성하기 +5. 생성한 Animator Controller를 Animator 컴포넌트의 Controller 부분에 드래그 앤 드롭. +6. Animator Controller 더블 클릭하면, Animator 탭이 새로 열림 +7. 추출한 애니메이션 파일을 Animator 탭에 가져다 놓기(애니메이션 상태가 하나 생성됨) +8. Entry 마우스 우클릭 > Make Transition 클릭. +9. 생성된 화살표를 가져다놓은 애니메이션 상태에 커서 올린 다음, 클릭 +10. 게임 실행 눌러서 애니메이션 실행되는지 확인 + +### 2-3. 애니메이션 간 상태 변환 하기(idle, walk, jump 연결을 예시로) +1. 1-2, 2-2의 1~7과정을 추가로 적용하고 싶은 애니메이션들에 대해서도 진행. +2. 각 애니메이션 상태 별 transition(화살표) 연결하기(2-2의 8번 과정 참고. 화살표 출발점에서 화살표 끝점으로 애니메이션 상태가 변환되는거임) +3. Animation 탭의 Parameter 부분에 사용할 전환 조건들을 추가. walk, jump를 예시로 들면, 아래 2개 조건 추가 + - isWalking(bool형) + - jumpTrigger(Trigger형): Trigger형은 상태전환이 완료되고 바로 false로 바뀌는 bool형이라고 생각하면 됨. +4. transition(화살표)별 전환 방법 설정하기: 화살표 클릭 후, 아래 설정들 하기 + - Has Exit Time: 전환 조건이 만족되더라도, 이 애니메이션 실행이 모두 완료되고 나서 전환하겠다. + - Setting > Transition Duration: 한 애니메이션에서 다른 애니메이션으로 전환하는 딜레이(길게할수록 한 애니메이션에서 다른 애니메이션으로 끊기지 않고 자연스럽게 연결됨) + - Conditions: 3의 Parameter로 추가한 조건들을 실제로 애니메이션 상태전환 조건으로 설정하는 부분. +4. 코드에서 적절히 Condition들을 변환해주기: + - animator.SetTrigger("jumpTrigger"); + - animator.SetBool("isWalking", true); + - animator.SetBool("isWalking", false); +5. 잘 되는지 테스트 + +--- + +## 🔗 참고 자료 + +- [Unity Animation 튜토리얼. 자동번역 켜기](https://youtube.com/playlist?list=PLwyUzJb_FNeTQwyGujWRLqnfKpV-cj-eO&si=hkfuZ6CT_IO6E_2w) diff --git "a/Day8/8-1.\355\217\254\355\212\270\355\217\264\353\246\254\354\230\244\352\265\254\354\241\260\354\204\244\352\263\204.md" "b/Day8/8-1.\355\217\254\355\212\270\355\217\264\353\246\254\354\230\244\352\265\254\354\241\260\354\204\244\352\263\204.md" index 5efee1b..ed51b4b 100644 --- "a/Day8/8-1.\355\217\254\355\212\270\355\217\264\353\246\254\354\230\244\352\265\254\354\241\260\354\204\244\352\263\204.md" +++ "b/Day8/8-1.\355\217\254\355\212\270\355\217\264\353\246\254\354\230\244\352\265\254\354\241\260\354\204\244\352\263\204.md" @@ -32,6 +32,9 @@ | 역할 분담 | 기획/프로그래밍/아트 등 | | 회고 | 문제 해결 경험 및 배운 점 | +### 💡주의할 점 +노션 링크 공유 시, `링크가 있는 모든 사용자`가 접근 가능한 설정으로 공유 해야 함. + --- ## 2. GitHub 구조 예시 @@ -41,7 +44,6 @@ unity-portfolio/ ├── README.md ├── Builds/ │ └── MacOS_Build.app/ -├── Assets/ ├── Docs/ │ └── Screenshots/ ├── Devlog/ @@ -55,17 +57,9 @@ unity-portfolio/ --- -## 3. Velog / Blog 작성 예시 - -- `[Unity Devlog] 점프 로직 최적화 후기` -- `[DemoDay 회고] 발표를 마치고 느낀 점` -- `[협업] GitHub Project Board 실전 활용기` - ---- - ## 4. 체크리스트 -- [ ] GitHub Or Notion / Blog 2곳 동시 정리 +- [ ] GitHub Or Notion 정리 - [ ] 썸네일 이미지 및 영상 첨부 - [ ] README 구조화 (섹션별 정리) - [ ] 코드 일부 첨부 및 주요 기능 스크린샷 @@ -82,9 +76,10 @@ unity-portfolio/ ## 📦 산출물 - 만든 최종 게임 유니티 화면(씬+게임뷰) 스크린샷 하나 - 짧은 시연 영상 하나 -- 포트폴리오 Notion or Github 주소 제출(Devlog 주소 1개 이상) +- 포트폴리오 Notion or Github 주소 제출 - 발표할 사람만: 최종 발표용 PDF or Google Slides +#### 💡 노션 링크 공유 시, `링크가 있는 모든 사용자`가 접근 가능한 설정으로 공유 해야 함. --- ## 💡 팁 diff --git "a/PPTs/\354\234\240\353\213\210\355\213\260_2\354\243\274\354\260\250_\352\260\225\354\235\230.pptx" "b/PPTs/\354\234\240\353\213\210\355\213\260_2\354\243\274\354\260\250_\352\260\225\354\235\230.pptx" index 8555712..94f497b 100644 Binary files "a/PPTs/\354\234\240\353\213\210\355\213\260_2\354\243\274\354\260\250_\352\260\225\354\235\230.pptx" and "b/PPTs/\354\234\240\353\213\210\355\213\260_2\354\243\274\354\260\250_\352\260\225\354\235\230.pptx" differ