diff --git a/Assets/01_Scenes/WhaleAdventure_VR/Rooms/CatsRoom.unity b/Assets/01_Scenes/WhaleAdventure_VR/Rooms/CatsRoom.unity index 8aa3cbc1..a66a3c01 100644 --- a/Assets/01_Scenes/WhaleAdventure_VR/Rooms/CatsRoom.unity +++ b/Assets/01_Scenes/WhaleAdventure_VR/Rooms/CatsRoom.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a45a2e4631c5ca5aa368fe8bc42d2deeae12799e34377d20e0a6f4ff393e47a -size 2045764 +oid sha256:6b3bc0f9caed4c6747bf76074ddca0ca6c9e20e620b8e5707f9912db36729a64 +size 2048970 diff --git a/Assets/02_Scripts/Core.meta b/Assets/02_Scripts/Core.meta new file mode 100644 index 00000000..562609f9 --- /dev/null +++ b/Assets/02_Scripts/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47b192809f9e2fc409f9ebeeff62cf64 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/Core/Util.cs b/Assets/02_Scripts/Core/Util.cs new file mode 100644 index 00000000..dd053649 --- /dev/null +++ b/Assets/02_Scripts/Core/Util.cs @@ -0,0 +1,43 @@ +using System; +using System.Threading; +using UnityEngine; + +public static class Util +{ + /// 특정 시간(초) 후에 액션을 실행 + public static async Awaitable RunDelayed(float delay, Action action, CancellationToken token = default) + { + try + { + // 유니티 전용 비동기 대기 + await Awaitable.WaitForSecondsAsync(delay, token); + + // 함수 실행 + action?.Invoke(); + } + catch (OperationCanceledException) + { + // 취소되었을 때의 처리 (필요 시) + } + } + + /// 다음 프레임에 액션을 실행 + public static async Awaitable RunNextFrame(Action action, CancellationToken token = default) + { + try + { + await Awaitable.EndOfFrameAsync(token); + action?.Invoke(); + } + catch (OperationCanceledException) { } + } + + public static float NormalizeAngle(float angle) + { + while (angle > 180) + angle -= 360; + while (angle < -180) + angle += 360; + return angle; + } +} diff --git a/Assets/02_Scripts/Core/Util.cs.meta b/Assets/02_Scripts/Core/Util.cs.meta new file mode 100644 index 00000000..d50964d4 --- /dev/null +++ b/Assets/02_Scripts/Core/Util.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 414cb910207b7644a8bbb9be341333df \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/CatsRoom/RhythmManager.cs b/Assets/02_Scripts/Managers/CatsRoom/RhythmManager.cs index b1f3b77c..5a103cee 100644 --- a/Assets/02_Scripts/Managers/CatsRoom/RhythmManager.cs +++ b/Assets/02_Scripts/Managers/CatsRoom/RhythmManager.cs @@ -19,6 +19,10 @@ public class RhythmManager : MonoBehaviour [Header("효과음")] [SerializeField] private AudioClip _hitSfx; // 내려칠 때마다 재생 (판정과 무관, 헛침 포함) + [Header("오토플레이 (아이템)")] + [SerializeField] private bool _autoPlay; // 켜지면 모든 노트를 판정선 도달 순간 자동 Perfect 처리 + [SerializeField] private RhythmStick[] _autoPlaySticks; // 인덱스 = Note.Lane. 오토플레이 시 자동으로 휘두를 스틱들 + [SerializeField] private GameObject StartButtonObj; // 모든 타이밍의 기준. 오디오 클럭(dspTime) 기반이라 리드인 동안 음수(-leadTime→0)로 흐른다 @@ -40,6 +44,8 @@ public class RhythmManager : MonoBehaviour public event Action OnScoreChanged; // 점수/콤보가 바뀔 때 (실시간 HUD) public event Action OnSongFinished; // 곡이 끝났을 때 (결과창) + private RhythmCat[] _rhythmCats; + private void Awake() { _songTimeProvider = () => SongTime; // 한 번만 만들어 모든 노트가 공유 @@ -51,6 +57,8 @@ private void Start() InputManager.Instance.OnKey_Left_Event += OnPlayerInput; InputManager.Instance.OnKey_Right_Event += OnPlayerInput; + + _rhythmCats = FindObjectsByType(FindObjectsSortMode.None); } private void Update() @@ -65,6 +73,59 @@ private void Update() } SpawnDueNotes(); + + if (_autoPlay) + { + DriveAutoPlaySticks(); // 다가오는 노트에 맞춰 스틱을 들었다 내림 (판정 전에 호출) + AutoHitDueNotes(); // 판정선 도달한 노트 자동 Perfect + } + } + + // 오토플레이: 레인별로 가장 임박한 노트에 맞춰 스틱을 휘두름 + private void DriveAutoPlaySticks() + { + if (_autoPlaySticks == null) return; + + for (int lane = 0; lane < _autoPlaySticks.Length; lane++) + { + RhythmStick stick = _autoPlaySticks[lane]; + if (stick == null) continue; + + // 이 레인에서 아직 안 친(미래의) 노트 중 가장 가까운 타격 시각 + float nextHit = float.PositiveInfinity; + foreach (RhythmNoteInstance note in _activeNotes) + { + int noteLane = Mathf.Clamp(note.Lane, 0, _autoPlaySticks.Length - 1); + if (noteLane != lane) continue; + if (note.HitTime < SongTime) continue; // 이미 지난(곧 처리될) 노트 제외 + if (note.HitTime < nextHit) nextHit = note.HitTime; + } + + stick.Drive(nextHit - SongTime); // 다가오는 노트 없으면 +∞ → 대기 자세 + } + } + + // 오토플레이: 판정선에 도달한(HitTime을 지난) 노트를 자동으로 Perfect 처리 + private void AutoHitDueNotes() + { + // 뒤에서부터 순회해야 처리한 노트를 안전하게 리스트에서 제거할 수 있다 + for (int i = _activeNotes.Count - 1; i >= 0; i--) + { + RhythmNoteInstance note = _activeNotes[i]; + if (SongTime < note.HitTime) continue; // 아직 판정선 도달 전이면 건너뜀 + + // 수동 입력과 동일한 연출: 내려치는 효과음 + 히트 이펙트 + if (_hitSfx != null && SoundManager.Instance != null) + SoundManager.Instance.PlaySFX(_hitSfx); + + if (note.TryGetComponent(out RhythmProjectile projectile)) + projectile.Detonate(); + + _activeNotes.RemoveAt(i); + Destroy(note.gameObject); + + ApplyJudge(Result.Perfect); // 시간차 ≈ 0 → 항상 Perfect + } } // SongTime 기준으로 소환할 때가 된 노트들을 순서대로 생성 @@ -87,6 +148,9 @@ public void ChangeSong() _audioSource.clip = _currentChart.SongClip; } + // 오토플레이 아이템 사용: 곡 시작 전(또는 도중)에 호출하면 남은 노트가 전부 자동 Perfect + public void EnableAutoPlay() => _autoPlay = true; + // 곡 재생 + 채보 로드 public void StartSong() { @@ -110,6 +174,11 @@ public void StartSong() //BGM·환경음을 낮춰 리듬게임 소리만 들리게 if (SoundManager.Instance != null) SoundManager.Instance.EnterMinigameMode(); + + for(int i=0;i<_rhythmCats.Length;i++) + { + _rhythmCats[i].Dance(i*1f); + } } // 곡 정지 + 주변음 복구 @@ -120,9 +189,20 @@ public void StopSong() _audioSource.Stop(); _isPlaying = false; + if (_autoPlay && _autoPlaySticks != null) // 곡 끝나면 들려있던 스틱 대기 자세로 복귀 + foreach (RhythmStick stick in _autoPlaySticks) + if (stick != null) stick.ResetPose(); + + _autoPlay = false; // 아이템 효과는 한 곡만 — 곡이 끝나면 자동 해제 + if (SoundManager.Instance != null) SoundManager.Instance.ExitMinigameMode(); OnSongFinished?.Invoke(Score); // 결과창 표시 + + for(int i=0;i<_rhythmCats.Length;i++) + { + _rhythmCats[i].DanceStop(); + } } // 노트가 판정선을 지나쳐 스스로 Miss 처리될 때 호출 (노트는 이미 자기 파괴됨) diff --git a/Assets/02_Scripts/Npcs.meta b/Assets/02_Scripts/Npcs.meta new file mode 100644 index 00000000..3de82c8d --- /dev/null +++ b/Assets/02_Scripts/Npcs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b32bc9c54d149494f80435205fe281ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/Npcs/RhythmCat.cs b/Assets/02_Scripts/Npcs/RhythmCat.cs new file mode 100644 index 00000000..f336239f --- /dev/null +++ b/Assets/02_Scripts/Npcs/RhythmCat.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +public class RhythmCat : MonoBehaviour +{ + Animator anim; + + private void Awake() + { + anim = GetComponent(); + } + + public void Dance(float delay) + { + _ = Util.RunDelayed(delay,()=>{anim.SetBool("Dance",true);},this.destroyCancellationToken); + } + + public void DanceStop() + { + anim.SetBool("Dance",false); + } +} diff --git a/Assets/02_Scripts/Npcs/RhythmCat.cs.meta b/Assets/02_Scripts/Npcs/RhythmCat.cs.meta new file mode 100644 index 00000000..bc4b6aca --- /dev/null +++ b/Assets/02_Scripts/Npcs/RhythmCat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c9cd0b46988c9bf4f927ad5d9cb2f5ed \ No newline at end of file diff --git a/Assets/02_Scripts/Rhythm/RhythmNoteInstance.cs b/Assets/02_Scripts/Rhythm/RhythmNoteInstance.cs index 3158ea78..183f56d7 100644 --- a/Assets/02_Scripts/Rhythm/RhythmNoteInstance.cs +++ b/Assets/02_Scripts/Rhythm/RhythmNoteInstance.cs @@ -4,6 +4,7 @@ public class RhythmNoteInstance : MonoBehaviour { [HideInInspector] public float HitTime; // 이 노트의 도달 시각 + [HideInInspector] public int Lane; // 이 노트의 레인 (오토플레이 스틱 매칭용) [SerializeField] private float _missWindow = 0.15f; // 판정선을 이만큼 지나면 자동 Miss @@ -14,13 +15,14 @@ public class RhythmNoteInstance : MonoBehaviour private Action _onMiss; // 지나쳐서 Miss 났을 때 통지 // 스폰 시 목적지·타이밍 주입 (B 방식) - public void Setup(Vector3 start, Vector3 target, float spawnTime, float hitTime, + public void Setup(Vector3 start, Vector3 target, float spawnTime, float hitTime, int lane, Func songTime, Action onMiss = null) { _start = start; _target = target; _spawnTime = spawnTime; HitTime = hitTime; + Lane = lane; _songTime = songTime; _onMiss = onMiss; diff --git a/Assets/02_Scripts/Rhythm/RhythmNoteSpawner.cs b/Assets/02_Scripts/Rhythm/RhythmNoteSpawner.cs index 135d05cf..00a83fbe 100644 --- a/Assets/02_Scripts/Rhythm/RhythmNoteSpawner.cs +++ b/Assets/02_Scripts/Rhythm/RhythmNoteSpawner.cs @@ -34,7 +34,7 @@ public class LaneVisual Vector3 target = _judgmentLine.position + worldOffset; RhythmNoteInstance instance = Instantiate(prefab, start, origin.rotation, transform); - instance.Setup(start, target, spawnTime, note.Time, songTime, onMiss); + instance.Setup(start, target, spawnTime, note.Time, note.Lane, songTime, onMiss); return instance; } } diff --git a/Assets/02_Scripts/Rhythm/RhythmStick.cs b/Assets/02_Scripts/Rhythm/RhythmStick.cs new file mode 100644 index 00000000..99cd4420 --- /dev/null +++ b/Assets/02_Scripts/Rhythm/RhythmStick.cs @@ -0,0 +1,99 @@ +using UnityEngine; + +// 오토플레이용 스틱 포즈 드라이버. +// 매니저가 매 프레임 Drive(dt)를 호출하면 dt(타격까지 남은 시간)에 따라 회전을 세팅한다. +// 모션: 대기 → (윈드업) 위로 들기 → (스트라이크) 내려치며 대기 자세보다 _strikeOvershoot 만큼 더 깊이 → +// (팔로스루) 대기 자세로 부드럽게 복귀. +// 노트는 타격 순간 파괴돼 그 뒤 dt가 끊기므로, 팔로스루만 Time.deltaTime으로 스틱이 자체 처리한다. +public class RhythmStick : MonoBehaviour +{ + [Tooltip("들어올릴 때 회전할 로컬 축 (예: 손목 꺾이는 축)")] + [SerializeField] private Vector3 _raiseAxis = Vector3.right; + + [Tooltip("대기 자세에서 위로 들어올리는 각도(도)")] + [SerializeField] private float _raiseAngle = 50f; + + [Tooltip("타격 시 대기 자세보다 더 깊이 내려가는 각도(도)")] + [SerializeField] private float _strikeOvershoot = 10f; + + [Tooltip("타격 몇 초 전부터 들어올리기 시작하는지")] + [SerializeField] private float _windupTime = 0.1f; + + [Tooltip("내려치는 데 걸리는 시간(초). _windupTime 보다 작아야 한다")] + [SerializeField] private float _strikeTime = 0.04f; + + [Tooltip("타격 후 대기 자세로 되돌아오는 시간(초)")] + [SerializeField] private float _recoverTime = 0.08f; + + private Quaternion _restRot; // 대기 자세 + private Quaternion _raisedRot; // 들어올린 자세 + private Quaternion _overshootRot; // 타격 시 더 깊이 내려간 자세 + + private bool _armed; // 내려치는 중 → 다음 프레임 타격 예정 + private bool _recovering; // 타격 후 복귀 중 + private float _recoverElapsed; + private Quaternion _recoverFrom; // 복귀 시작 회전(스냅 방지) + + private void Awake() + { + _restRot = transform.localRotation; + Vector3 axis = _raiseAxis.normalized; + _raisedRot = _restRot * Quaternion.AngleAxis(_raiseAngle, axis); + _overshootRot = _restRot * Quaternion.AngleAxis(-_strikeOvershoot, axis); // 반대 방향 = 더 내려감 + } + + // dt = 다음 타격까지 남은 시간(초). 다가오는 노트가 없으면 +∞. + public void Drive(float dt) + { + // 1) 임박한 스윙(윈드업~타격)이 최우선 + if (dt > 0f && dt <= _windupTime) + { + _recovering = false; + _armed = true; // 곧 타격함 + + if (dt > _strikeTime) + { + // 들어올리는 구간: dt가 _windupTime→_strikeTime 으로 줄며 rest→raised + float u = Mathf.InverseLerp(_windupTime, _strikeTime, dt); + transform.localRotation = Quaternion.Slerp(_restRot, _raisedRot, Mathf.SmoothStep(0f, 1f, u)); + } + else + { + // 내려치는 구간: dt가 _strikeTime→0 으로 줄며 raised→overshoot (dt=0에 가장 깊이) + float s = Mathf.InverseLerp(_strikeTime, 0f, dt); + transform.localRotation = Quaternion.Slerp(_raisedRot, _overshootRot, Mathf.SmoothStep(0f, 1f, s)); + } + return; + } + + // 2) 방금 타격이 끝났다면(노트 파괴로 dt가 끊김) 팔로스루 시작 + if (_armed) + { + _armed = false; + _recovering = true; + _recoverElapsed = 0f; + _recoverFrom = transform.localRotation; // 현재 위치에서 복귀(스냅 방지) + } + + // 3) 팔로스루: 현재 → 대기 자세로 부드럽게 + if (_recovering) + { + _recoverElapsed += Time.deltaTime; + float r = _recoverTime > 0f ? Mathf.Clamp01(_recoverElapsed / _recoverTime) : 1f; + transform.localRotation = Quaternion.Slerp(_recoverFrom, _restRot, Mathf.SmoothStep(0f, 1f, r)); + if (r >= 1f) _recovering = false; + return; + } + + // 4) 평상시 대기 자세 + transform.localRotation = _restRot; + } + + // 즉시 대기 자세로 되돌림 (오토플레이 종료 시 호출) + public void ResetPose() + { + _armed = false; + _recovering = false; + transform.localRotation = _restRot; + } +} diff --git a/Assets/02_Scripts/Rhythm/RhythmStick.cs.meta b/Assets/02_Scripts/Rhythm/RhythmStick.cs.meta new file mode 100644 index 00000000..78d720b0 --- /dev/null +++ b/Assets/02_Scripts/Rhythm/RhythmStick.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6ae74de6faba37f4ca52b1c6177a98bf \ No newline at end of file diff --git a/Assets/04_Models/Characters/Cat/Animations.meta b/Assets/04_Models/Characters/Cat/Animations.meta new file mode 100644 index 00000000..420c4a07 --- /dev/null +++ b/Assets/04_Models/Characters/Cat/Animations.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3fc82ffc3f0eea409091054b85d9eac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/04_Models/Characters/Cat/Animations/CatAnimController.controller b/Assets/04_Models/Characters/Cat/Animations/CatAnimController.controller new file mode 100644 index 00000000..4d5e846f --- /dev/null +++ b/Assets/04_Models/Characters/Cat/Animations/CatAnimController.controller @@ -0,0 +1,159 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-7037429233185517977 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Dance + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 7364389275174809312} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-6722103551222370508 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 7364389275174809312} + m_Position: {x: 560, y: 60, z: 0} + - serializedVersion: 1 + m_State: {fileID: -2066135457659248307} + m_Position: {x: 310, y: 60, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -2066135457659248307} +--- !u!1101 &-4038710398895558165 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: Dance + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -2066135457659248307} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-2066135457659248307 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -7037429233185517977} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 0} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: CatAnimController + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: Dance + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -6722103551222370508} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1102 &7364389275174809312 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Dance + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4038710398895558165} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 510ba0cd20bbf4f41b2d9227ab2c397e, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Assets/04_Models/Characters/Cat/Animations/CatAnimController.controller.meta b/Assets/04_Models/Characters/Cat/Animations/CatAnimController.controller.meta new file mode 100644 index 00000000..b50c67a5 --- /dev/null +++ b/Assets/04_Models/Characters/Cat/Animations/CatAnimController.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7faadcc5b471ee64f966a1c28ba20fd3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/04_Models/Characters/Cat/Animations/Dance.anim b/Assets/04_Models/Characters/Cat/Animations/Dance.anim new file mode 100644 index 00000000..56f878c6 --- /dev/null +++ b/Assets/04_Models/Characters/Cat/Animations/Dance.anim @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbce30939df9130542fead3f6b4962bbdaf920fdfc1788620b4be7739cd09e5c +size 5056 diff --git a/Assets/04_Models/Characters/Cat/Animations/Dance.anim.meta b/Assets/04_Models/Characters/Cat/Animations/Dance.anim.meta new file mode 100644 index 00000000..f3794ecb --- /dev/null +++ b/Assets/04_Models/Characters/Cat/Animations/Dance.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 510ba0cd20bbf4f41b2d9227ab2c397e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/04_Models/Characters/Cat/Prefabs/Cat1.prefab b/Assets/04_Models/Characters/Cat/Prefabs/Cat1.prefab index 4cd23123..3dea56dc 100644 --- a/Assets/04_Models/Characters/Cat/Prefabs/Cat1.prefab +++ b/Assets/04_Models/Characters/Cat/Prefabs/Cat1.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38b0a661b322a551a154b00cf3f70488f21f04588c6146536dcb49efc08d89d4 -size 2884 +oid sha256:21d496c8736694b1effaed2437485be8042ad8fa86e73ed234e0525da44de68c +size 3912 diff --git a/Assets/04_Models/Characters/Cat/Prefabs/Cat2.prefab b/Assets/04_Models/Characters/Cat/Prefabs/Cat2.prefab index 034b8edb..06a0713b 100644 --- a/Assets/04_Models/Characters/Cat/Prefabs/Cat2.prefab +++ b/Assets/04_Models/Characters/Cat/Prefabs/Cat2.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19ccacd6c9949ec04e08a06b00189f4e0c2e8978cfd7de9c3815e80376e2688f -size 4354 +oid sha256:a091456c59093a141f8d409486f64e4153ae824a2b409f6743813c0b54342a02 +size 5377 diff --git a/Assets/04_Models/Characters/Cat/Prefabs/Cat3.prefab b/Assets/04_Models/Characters/Cat/Prefabs/Cat3.prefab index 4756b8cf..0216f4e1 100644 --- a/Assets/04_Models/Characters/Cat/Prefabs/Cat3.prefab +++ b/Assets/04_Models/Characters/Cat/Prefabs/Cat3.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a468bf1e9ec30b44ec8efb71ed53545ea31d1630bb5279404d0ee7076ffb8869 -size 4355 +oid sha256:9744b14d808ae88397c40c57957f694ba9e3b527c67923f61bd02508ab78e4e8 +size 5379 diff --git a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick.prefab b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick.prefab deleted file mode 100644 index 275e174b..00000000 --- a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick.prefab +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:347949b2523f90fbd074226cb453a3c07e6cd8921846b25311e4024e44418656 -size 2470 diff --git a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick2.prefab b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick2.prefab deleted file mode 100644 index 0f894bbc..00000000 --- a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick2.prefab +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f83e33ec907238a72211fbfa9a135b4676be91d21892e91b7b1ceb934e4f24d -size 2722 diff --git a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_L.prefab b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_L.prefab new file mode 100644 index 00000000..b99dfdd9 --- /dev/null +++ b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_L.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46fa70e0ec4a93a04c54db18729e0f3a74948888683a778433c8108e141ad28a +size 5027 diff --git a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick.prefab.meta b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_L.prefab.meta similarity index 74% rename from Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick.prefab.meta rename to Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_L.prefab.meta index b07009d1..c85dc332 100644 --- a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick.prefab.meta +++ b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_L.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 64d706dccf193ad4c9250a92f1782af8 +guid: 21e36439b68755f47b8a18f88c2b9ce4 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_R.prefab b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_R.prefab new file mode 100644 index 00000000..b3223051 --- /dev/null +++ b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_R.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6322a7474b4723490275663c47be5db522590c38587d6e57f3cdde8699dd602 +size 4427 diff --git a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick2.prefab.meta b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_R.prefab.meta similarity index 74% rename from Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick2.prefab.meta rename to Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_R.prefab.meta index c762371b..35396dd3 100644 --- a/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick2.prefab.meta +++ b/Assets/04_Models/Objects/WoodStick/Prefabs/WoodStick_R.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6df6ce53099740a4da7e7770a360c63d +guid: 0512f7f1e7eb45543b2be9babcb46989 PrefabImporter: externalObjects: {} userData: