23 Commits
Author SHA1 Message Date
ThomasCharester 855108d88b Сцена геймплея, дебажные зоны 2025-11-21 20:41:43 +03:00
ThomasCharester 388773129d CoreGameplay 2025-11-21 20:27:11 +03:00
ThomasCharester 5da64a7b3d Меню, дверь, цвет 2025-11-19 14:45:45 +03:00
ThomasCharester c4ab11488b Ещё модели 2025-11-19 12:53:09 +03:00
ThomasCharester cb968d782b Освещение, модели, текстуры 2025-11-18 20:07:45 +03:00
ThomasCharester 522f51be3f Текстуры модели и пр 2025-11-18 15:02:12 +03:00
ThomasCharester d3fbd4c5c3 Артём хуесос 2025-11-15 19:11:30 +03:00
ThomasCharester 5b09068b0c Merge branch 'SoundManager' into PlayerAnimator 2025-11-15 18:31:13 +03:00
ThomasCharester ddb76a5b93 Игрок теперь играется 2025-11-15 18:30:31 +03:00
ThomasCharester 0f708ff4cb Merge branch 'movement-dev' into PlayerAnimator 2025-11-15 17:14:16 +03:00
ThomasCharester 721d5ebf9c Небольшие изменения, реально незначительные 2025-11-15 14:02:16 +03:00
MrTorex 3bb99aaf1e Фикс приколов с камерой 2025-11-15 13:59:32 +03:00
MrTorex a2acea39dc temp 2025-11-15 13:33:44 +03:00
ThomasCharester 5c1fd1510d Merge branch 'SoundManager' into Dev 2025-11-15 01:15:01 +03:00
ThomasCharester e128ee59f9 Чистка мусора 2025-11-15 01:14:11 +03:00
ThomasCharester 5c81bde5db Приемлемое воспроизведение музыки 2025-11-15 01:12:33 +03:00
MrTorex d1aad440f5 Осталось пофиксить толка бак с камерай 2025-11-14 15:02:33 +03:00
MrTorex 0e1c274677 Продолжение багфикса 2025-11-14 13:12:49 +03:00
MrTorex dbabd847c1 bugfix no 1 2025-11-12 20:04:06 +03:00
MrTorex 874280741c Допил наклонов полноценный 2025-11-11 19:48:37 +03:00
MrTorex 177464cc09 Я ЛЮБЛЮ ПУЛ 2025-11-11 15:00:49 +03:00
MrTorex f8448ba922 just for syncing changes 2025-11-10 22:16:36 +03:00
MrTorex 0e188efe59 Инишиал механика наклона при залазании на стены
Нуждается в доработке (как минимум чтобы вращалось в правильную сторону), но вроде-как выглядит прикольно
2025-10-29 15:00:25 +03:00
332 changed files with 22959 additions and 3439 deletions

No files matched your search

@@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: d447fc60305c17a17bf20948ab295a45 m_DefaultGroup: d447fc60305c17a17bf20948ab295a45
m_currentHash: m_currentHash:
serializedVersion: 2 serializedVersion: 2
Hash: 7ed5aa0308ed28c84409cb70340524a8 Hash: db97f0adbdaa5d76ea9341571ea44391
m_OptimizeCatalogSize: 0 m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 0 m_BuildRemoteCatalog: 0
m_CatalogRequestsTimeout: 0 m_CatalogRequestsTimeout: 0
@@ -30,6 +30,11 @@ MonoBehaviour:
m_ReadOnly: 0 m_ReadOnly: 0
m_SerializedLabels: [] m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0 FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 1d4767c722c05b5d6b96bb226d378c65
m_Address: Assets/Resources_moved/Prefabs/Player/ArmsMesh.prefab
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 1d7110a045075b22fa27d62bd5f2784e - m_GUID: 1d7110a045075b22fa27d62bd5f2784e
m_Address: 357_shot1 m_Address: 357_shot1
m_ReadOnly: 0 m_ReadOnly: 0
@@ -90,6 +95,11 @@ MonoBehaviour:
m_ReadOnly: 0 m_ReadOnly: 0
m_SerializedLabels: [] m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0 FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 751890caa1647ec6689f24933fbcb770
m_Address: "Prefabs/Furniture/\u0442\u0440\u0443\u0431\u0430"
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7c5caf3ceee44f71588860c5c1fbdbe0 - m_GUID: 7c5caf3ceee44f71588860c5c1fbdbe0
m_Address: Audio/Dispatcher/take_damage3 m_Address: Audio/Dispatcher/take_damage3
m_ReadOnly: 0 m_ReadOnly: 0
@@ -100,6 +110,11 @@ MonoBehaviour:
m_ReadOnly: 0 m_ReadOnly: 0
m_SerializedLabels: [] m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0 FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 81844a99f5b786b41b831174f8fb6d3a
m_Address: Prefabs/Player/CharacterController
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 82c71411174bfa86ca1f676b9d389f94 - m_GUID: 82c71411174bfa86ca1f676b9d389f94
m_Address: bastard! m_Address: bastard!
m_ReadOnly: 0 m_ReadOnly: 0
@@ -1,14 +1,23 @@
using System.Globalization;
using System.Reflection.Emit;
using Code.App.StateMachine; using Code.App.StateMachine;
using Code.Audio; using Code.Audio;
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
using Code.Gameplay.Camera.CameraStates;
using Code.Gameplay.Character.Core;
using Code.Gameplay.Orders.Order;
using Code.Gameplay.Orders.Order;
using Code.Gameplay.Player; using Code.Gameplay.Player;
using Code.Input; using Code.Input;
using Code.Scenes; using Code.Scenes;
using Code.Scenes.SceneEnvironments; using Code.Scenes.SceneEnvironments;
using Code.StateMachine; using Code.StateMachine;
using Code.UI; using Code.UI;
using Code.UI.Panels;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
using Reflex.Core;
using Reflex.Extensions; using Reflex.Extensions;
using Reflex.Injectors;
using UnityEngine; using UnityEngine;
using UnityEngine.InputSystem; using UnityEngine.InputSystem;
using UnityEngine.SceneManagement; using UnityEngine.SceneManagement;
@@ -16,13 +25,15 @@ using UnityEngine.SceneManagement;
namespace Code.App.AppStates namespace Code.App.AppStates
{ {
public class GameplayState : BaseState<AppStateMachineContext> public class GameplayState : BaseState<AppStateMachineContext>
{ {
// DEBUG
private Transform _testSFXTransform;
// DEBUG
private PlayerHealth _playerHealth; private PlayerHealth _playerHealth;
private PlayerMoney _playerMoney; private PlayerMoney _playerMoney;
private IScoreService _scoreService;
private IOrderService _orderService;
private CharacterProvider _playerCharacter;
public GameplayState(AppStateMachineContext context) : base(context) public GameplayState(AppStateMachineContext context) : base(context)
{ {
@@ -39,68 +50,103 @@ namespace Code.App.AppStates
Context.AudioService.TransitToSnapshot(AudioSnapshotState.Peaceful); Context.AudioService.TransitToSnapshot(AudioSnapshotState.Peaceful);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug1, GiveHealth); Context.InputService.EnableMap(ActionMappings.Gameplay);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug3, GiveMoney);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug2, LooseHealth); Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug1, GiveOrderDEBUG);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug4, LooseMoney); Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug2, RecieveOrderDEBUG);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug5, PlayDebugSFX); Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug3, DeliverOrderDEBUG);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug4, RoomPassedDEBUG);
Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug5, Tube);
// Context.InputService.DebugBindAction((int)ActionMappings.Debug, (int)DebugActions.Debug6, PlayDebugDispatcher);
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
WaitForSceneToLoad(); WaitForSceneToLoad();
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
} }
private async UniTask WaitForPlayerCharacterLoad() => _playerCharacter = await Context.PlayerFactory.CreatePlayer();
private async UniTaskVoid WaitForSceneToLoad() private async UniTaskVoid WaitForSceneToLoad()
{ {
await Context.SceneLoaderService.LoadSceneAsyncAwaitable((int)SceneIds.Gameplay);
await UniTask.WhenAll( await UniTask.WhenAll(
Context.SceneLoaderService.LoadSceneAsyncAwaitable((int)SceneIds.MovementDev),
Context.UIService.AsyncSwitchPanelTo(UIPanel.Gameplay), Context.UIService.AsyncSwitchPanelTo(UIPanel.Gameplay),
// TODO
Context.AudioFactory.WarmGameplayMusic(), Context.AudioFactory.WarmGameplayMusic(),
Context.AudioFactory.WarmSFX() Context.AudioFactory.WarmSFX(),
Context.AudioFactory.WarmDispatcher(),
// TODO
WaitForPlayerArmsToInitialize(),
WaitForPlayerCharacterLoad()
); );
MusicInitialize();
Context.AudioService.PlayRandomPeacefulMusicUntilHumanityWillBeDestroyedForTheySins(); Container sceneContainer = SceneManager.GetActiveScene().GetSceneContainer();
Context.AudioService.PlayRandomActionMusicUntilHumanityWillBeDestroyedForTheySins();
var sceneEnvironment = ((GameplaySceneEnvironment)SceneManager.GetActiveScene() GameplaySceneEnvironment sceneEnvironment = SceneEnvironmentVariables(sceneContainer);
.GetSceneContainer().Resolve<CurrentSceneEnvironment>());
_testSFXTransform = sceneEnvironment.debugSfxTarget; PlayerInitialize(sceneEnvironment);
((GameplayPanel)Context.UIService.CurrentPanel).Initialize(_playerMoney, _playerHealth); UIInitialize();
Context.CameraStateMachine.SwitchState(CameraMode.FirstPerson); CameraInitialize();
Context.InputService.EnableMap(ActionMappings.Gameplay);
InputServiceInitialize();
GameplayServicesInitialize(sceneContainer);
_tickEnabled = true;
Context.UIService.LoadingScreen.Hide(); Context.UIService.LoadingScreen.Hide();
} }
private void PlayDebugSFX(InputAction.CallbackContext context) private async UniTask WaitForPlayerArmsToInitialize() => _armsMesh = await Context.PlayerFactory.CreateArms(Context.CameraStateMachine.Camera.transform);
{
Context.AudioService.PlaySFX(SFXSounds.Crowbar, _testSFXTransform.position);
}
private void GiveHealth(InputAction.CallbackContext context)
{
_playerHealth.GetDamage(-1);
}
private void LooseHealth(InputAction.CallbackContext context) private void OrderGiven(float time)
{ {
_playerHealth.GetDamage(1);
} }
private void OrderRecieved(float time)
private void GiveMoney(InputAction.CallbackContext context)
{ {
_playerMoney.GiveMoney(100); Context.AudioService.PlayDispatcher((DispatcherSounds)Random.Range((int)DispatcherSounds.Recieve1,(int)DispatcherSounds.Recieve2));
((GameplayPanel)(Context.UIService.CurrentPanel)).SummonDispatcher();
} }
private void OrderDelivered(int score, float time)
private void LooseMoney(InputAction.CallbackContext context) {
{ if(time < 0f) Context.AudioService.PlayDispatcher((DispatcherSounds)Random.Range((int)DispatcherSounds.Late1,(int)DispatcherSounds.Late2));
_playerMoney.LooseMoney(100); _playerMoney.GiveMoney(score);
((GameplayPanel)(Context.UIService.CurrentPanel)).CloseDispatcher();
} }
// DEBUG // DEBUG
private void GiveOrderDEBUG(InputAction.CallbackContext context)
{
_orderService.OrderGive();
}
private void RecieveOrderDEBUG(InputAction.CallbackContext context)
{
_orderService.OrderRecieved();
}
private void DeliverOrderDEBUG(InputAction.CallbackContext context)
{
_orderService.OrderDelivered();
}
private void RoomPassedDEBUG(InputAction.CallbackContext context)
{
_orderService.RoomPassed();
}
private OrderDispenser _debugTube;
private void Tube(InputAction.CallbackContext context)
{
_debugTube.ThrowOrder();
}
// DEBUG
private bool _tickEnabled;
public override void Tick() public override void Tick()
{ {
if (!_tickEnabled) return;
// TODO ГРЯЗь
_gameplayPanel.Timer.text = ((int)_orderService.DecreaseTimer(Time.deltaTime)).ToString(CultureInfo.CurrentCulture);
} }
private void EndGame() private void EndGame()
@@ -114,16 +160,71 @@ namespace Code.App.AppStates
_playerHealth = null; _playerHealth = null;
_playerMoney = null; _playerMoney = null;
Context.InputService.DisableMap(ActionMappings.Gameplay); _tickEnabled = false;
Context.AudioService.GladlyAskToStopGameplayMusic(Context.AudioFactory.ReleaseGameplayMusic);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug1, GiveHealth); Context.PlayerFactory.ReleasePlayer(_playerCharacter);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug3, GiveHealth); _playerCharacter = null;
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug2, LooseHealth); Context.PlayerFactory.ReleaseArms(_armsMesh);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug4, LooseMoney); _armsMesh = null;
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug5, PlayDebugSFX);
Context.InputService.DisableMap(ActionMappings.Gameplay);
Context.AudioService.GladlyAskToStopMusic(MusicType.Action, callback: Context.AudioFactory.ReleaseActionMusic);
Context.AudioService.GladlyAskToStopMusic(MusicType.Peaceful, callback: Context.AudioFactory.ReleasePeacefulMusic);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug1, GiveOrderDEBUG);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug2, RecieveOrderDEBUG);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug3, DeliverOrderDEBUG);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug4, RoomPassedDEBUG);
Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug5, Tube);
// Context.InputService.DebugUnbindAction((int)ActionMappings.Debug, (int)DebugActions.Debug6, PlayDebugDispatcher);
base.ExitState(); base.ExitState();
} }
private void InputServiceInitialize()
{
Context.InputService.EnableMap(ActionMappings.Gameplay);
}
private void CameraInitialize()
{
Context.CameraStateMachine.SwitchState(CameraMode.FirstPerson);
((BaseCameraState)Context.CameraStateMachine.CurrentBaseState).SetFollowTransform(_playerCharacter.GetFollowTransform());
}
private GameplayPanel _gameplayPanel;
private ArmsMeshProvider _armsMesh;
private void UIInitialize()
{
_gameplayPanel = (GameplayPanel)Context.UIService.CurrentPanel;
_gameplayPanel.Initialize(_playerMoney, _playerHealth);
}
private void MusicInitialize()
{
Context.AudioService.PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType.Peaceful);
Context.AudioService.PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType.Action);
}
private void PlayerInitialize(GameplaySceneEnvironment sceneEnvironment)
{
_playerCharacter.Teleport(sceneEnvironment.playerSpawnPoint.position, sceneEnvironment.playerSpawnPoint.rotation);
_playerCharacter.PlayerAnimator.SetAnimator(_armsMesh.ArmsAnimator);
}
private void GameplayServicesInitialize(Container sceneContainer)
{
_scoreService = sceneContainer.Resolve<IScoreService>();
_orderService = sceneContainer.Resolve<IOrderService>();
_orderService.OnOrderGiven += OrderGiven;
_orderService.OnOrderRecieved += OrderRecieved;
_orderService.OnOrderDelivered += OrderDelivered;
}
private GameplaySceneEnvironment SceneEnvironmentVariables(Container sceneContainer)
{
var sceneEnvironment = (GameplaySceneEnvironment)sceneContainer.Resolve<CurrentSceneEnvironment>();
_debugTube = sceneEnvironment.debugTube;
return sceneEnvironment;
}
} }
} }
@@ -2,11 +2,13 @@ using Code.App.StateMachine;
using Code.Audio; using Code.Audio;
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
using Code.Gameplay.Camera.CameraStates; using Code.Gameplay.Camera.CameraStates;
using Code.Gameplay.Door;
using Code.Input; using Code.Input;
using Code.Scenes; using Code.Scenes;
using Code.Scenes.SceneEnvironments; using Code.Scenes.SceneEnvironments;
using Code.StateMachine; using Code.StateMachine;
using Code.UI; using Code.UI;
using Code.UI.Panels;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
using Reflex.Extensions; using Reflex.Extensions;
using UnityEngine; using UnityEngine;
@@ -24,11 +26,14 @@ namespace Code.App.AppStates
{ {
Context.UIService.LoadingScreen.Show(); Context.UIService.LoadingScreen.Show();
Context.CameraStateMachine.SwitchState(CameraMode.Static); Context.CameraStateMachine.SwitchState(CameraMode.UltraStatic);
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
WaitForSceneToLoad(); WaitForSceneToLoad();
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
} }
private CinematicDoorOpening _damnDoor = new();
private async UniTaskVoid WaitForSceneToLoad() private async UniTaskVoid WaitForSceneToLoad()
{ {
await UniTask.WhenAll( await UniTask.WhenAll(
@@ -37,20 +42,23 @@ namespace Code.App.AppStates
Context.AudioFactory.WarmMenuMusic() Context.AudioFactory.WarmMenuMusic()
); );
Context.AudioService.TransitToSnapshot(AudioSnapshotState.Peaceful); Context.AudioService.TransitToSnapshot(AudioSnapshotState.Menu);
Context.AudioService.PlayRandomMenuMusicUntilHumanityWillBeDestroyedForTheySins(); Context.AudioService.PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType.Menu);
((MainMenuPanel)Context.UIService.CurrentPanel).startButton.onClick.AddListener(StartGame);
((MainMenuPanel)Context.UIService.CurrentPanel).exitButton.onClick.AddListener(ExitGame);
var hui = ((MainMenuEnvironment)SceneManager.GetActiveScene() var hui = ((MainMenuEnvironment)SceneManager.GetActiveScene()
.GetSceneContainer().Resolve<CurrentSceneEnvironment>()); .GetSceneContainer().Resolve<CurrentSceneEnvironment>());
_damnDoor.DamnDoor = hui.damnDoor;
((StaticState)Context.CameraStateMachine.CurrentBaseState).LookTarget = _damnDoor.DamnDoor.SetPhysics(false);
hui.cameraTarget; _damnDoor.DoorLight = hui.doorLight;
((BaseCameraState)Context.CameraStateMachine.CurrentBaseState).SetFollowTransform(hui.cameraPosition);
var menuPanel = (MainMenuPanel)Context.UIService.CurrentPanel;
menuPanel.startButton.button.onClick.AddListener(StartGame);
menuPanel.exitButton.button.onClick.AddListener(ExitGame);
menuPanel.CinematicDoorOpening = _damnDoor;
((UltraStaticState)Context.CameraStateMachine.CurrentBaseState).SetFollowTransform(hui.cameraPosition);
Context.UIService.LoadingScreen.Hide(); Context.UIService.LoadingScreen.Hide();
Context.InputService.EnableMap(ActionMappings.MainMenu); Context.InputService.EnableMap(ActionMappings.MainMenu);
@@ -74,7 +82,7 @@ namespace Code.App.AppStates
public override void ExitState() public override void ExitState()
{ {
Context.InputService.DisableMap(ActionMappings.MainMenu); Context.InputService.DisableMap(ActionMappings.MainMenu);
Context.AudioService.GladlyAskToStopMenuMusic(Context.AudioFactory.ReleaseMenuMusic); Context.AudioService.GladlyAskToStopMusic(MusicType.Menu, callback: Context.AudioFactory.ReleaseMenuMusic);
base.ExitState(); base.ExitState();
} }
@@ -1,9 +1,9 @@
using System.Threading.Tasks;
using Code.App.StateMachine; using Code.App.StateMachine;
using Code.Audio; using Code.Audio;
using Code.Configs; using Code.Configs;
using Code.Constants; using Code.Constants;
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
using Code.Gameplay.Orders.Order;
using Code.Gameplay.Player; using Code.Gameplay.Player;
using Code.Input; using Code.Input;
using Code.Scenes; using Code.Scenes;
@@ -14,7 +14,6 @@ using Cysharp.Threading.Tasks;
using Reflex.Core; using Reflex.Core;
using Reflex.Injectors; using Reflex.Injectors;
using UnityEngine; using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.InputSystem; using UnityEngine.InputSystem;
namespace Code.App namespace Code.App
@@ -68,20 +67,27 @@ namespace Code.App
staticDataService.Load(); staticDataService.Load();
containerBuilder.AddSingleton(staticDataService, typeof(IStaticDataService)); containerBuilder.AddSingleton(staticDataService, typeof(IStaticDataService));
containerBuilder.AddSingleton(staticDataService.InputConfig.inputActionAsset, typeof(InputActionAsset)); containerBuilder.AddSingleton(staticDataService.InputConfig.inputActionAsset, typeof(InputActionAsset));
containerBuilder.AddSingleton(staticDataService.InputConfig, typeof(InputConfig)); containerBuilder.AddSingleton(staticDataService.InputConfig, typeof(InputConfig));
containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig)); containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig));
containerBuilder.AddSingleton(staticDataService.PlayerConfig, typeof(PlayerConfig)); containerBuilder.AddSingleton(staticDataService.PlayerConfig, typeof(PlayerConfig));
containerBuilder.AddSingleton(staticDataService.CharacterConfig, typeof(CharacterConfig)); containerBuilder.AddSingleton(staticDataService.CharacterConfig, typeof(CharacterConfig));
containerBuilder.AddSingleton(staticDataService.UIConfig, typeof(UIConfig)); containerBuilder.AddSingleton(staticDataService.UIConfig, typeof(UIConfig));
containerBuilder.AddSingleton(staticDataService.AudioMixerConfig, typeof(AudioMixerConfig)); containerBuilder.AddSingleton(staticDataService.AudioMixerConfig, typeof(AudioMixerConfig));
containerBuilder.AddSingleton(staticDataService.SoundtrackListConfig, typeof(SoundtrackListConfig)); containerBuilder.AddSingleton(staticDataService.SoundtrackListConfig, typeof(SoundtrackListConfig));
containerBuilder.AddSingleton(staticDataService.SFXListConfig, typeof(SFXListConfig)); containerBuilder.AddSingleton(staticDataService.SFXListConfig, typeof(SFXListConfig));
containerBuilder.AddSingleton(staticDataService.DispatcherSoundListConfig, typeof(DispatcherSoundListConfig)); containerBuilder.AddSingleton(staticDataService.DispatcherSoundListConfig, typeof(DispatcherSoundListConfig));
containerBuilder.AddSingleton(staticDataService.EnemiesSoundListConfig, typeof(EnemiesSoundListConfig)); containerBuilder.AddSingleton(staticDataService.EnemiesSoundListConfig, typeof(EnemiesSoundListConfig));
containerBuilder.AddSingleton(staticDataService.OrderServiceConfig, typeof(OrderServiceConfig));
containerBuilder.AddSingleton(staticDataService.OrderBoxConfig, typeof(OrderBoxConfig));
} }
private bool _onAudioLoaded;
private AppStateMachine _appStateMachine; private AppStateMachine _appStateMachine;
private void Bootstrap(Container container) private void Bootstrap(Container container)
@@ -94,12 +100,12 @@ namespace Code.App
AttributeInjector.Inject(cameraStateMachine.StateMachineContext, container); AttributeInjector.Inject(cameraStateMachine.StateMachineContext, container);
cameraStateMachine.Initialize(); cameraStateMachine.Initialize();
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
BootstrapFinish(container); BootstrapFinish(container);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
} }
private async UniTaskVoid BootstrapFinish(Container container) private async UniTaskVoid BootstrapFinish(Container container)
{ {
// container.Resolve<IAudioFactory>();
var loadingScreen = GameObject.FindWithTag(Tags.LoadingScreen); var loadingScreen = GameObject.FindWithTag(Tags.LoadingScreen);
DontDestroyOnLoad(loadingScreen); DontDestroyOnLoad(loadingScreen);
@@ -1,3 +1,4 @@
using Code.Gameplay.Orders.Order;
using Code.Scenes; using Code.Scenes;
using Code.Scenes.SceneEnvironments; using Code.Scenes.SceneEnvironments;
using Reflex.Core; using Reflex.Core;
@@ -12,6 +13,8 @@ namespace Code.App.SceneInstallers
public void InstallBindings(ContainerBuilder containerBuilder) public void InstallBindings(ContainerBuilder containerBuilder)
{ {
containerBuilder.AddScoped(typeof(GameplaySceneEnvironment), typeof(CurrentSceneEnvironment)); containerBuilder.AddScoped(typeof(GameplaySceneEnvironment), typeof(CurrentSceneEnvironment));
containerBuilder.AddScoped(typeof(ScoreService), typeof(IScoreService));
containerBuilder.AddScoped(typeof(OrderService), typeof(IOrderService));
containerBuilder.OnContainerBuilt += Initialize; containerBuilder.OnContainerBuilt += Initialize;
} }
@@ -18,6 +18,17 @@ namespace Code.Audio
{ {
Absolutely, Absolutely,
AbsolutelyNot, AbsolutelyNot,
AhFreeman AhFreeman,
Recieve1,
Recieve2,
TakeDamage1,
TakeDamage2,
TakeDamage3,
TakeDamage4,
Late1,
Late2,
Late3,
Late4,
Late5
} }
} }
@@ -30,9 +30,7 @@ namespace Code.Audio
private AsyncOperationHandle<IList<AudioClip>> _enemiesHandle; private AsyncOperationHandle<IList<AudioClip>> _enemiesHandle;
private AsyncOperationHandle<IList<AudioClip>> _dispatcherHandle; private AsyncOperationHandle<IList<AudioClip>> _dispatcherHandle;
public List<AudioClip> PeacefulMusic { get; private set; } = new(); public Dictionary<MusicType, List<AudioClip>> MusicDictionary { get; private set; } = new();
public List<AudioClip> ActionMusic { get; private set; } = new();
public List<AudioClip> MenuMusic { get; private set; } = new();
public List<AudioClip> SFXAudios { get; private set; } = new(); public List<AudioClip> SFXAudios { get; private set; } = new();
public List<AudioClip> EnemiesAudios { get; private set; } = new(); public List<AudioClip> EnemiesAudios { get; private set; } = new();
public List<AudioClip> DispatcherAudios { get; private set; } = new(); public List<AudioClip> DispatcherAudios { get; private set; } = new();
@@ -41,7 +39,7 @@ namespace Code.Audio
SoundtrackListConfig soundtrackListConfig, SoundtrackListConfig soundtrackListConfig,
SFXListConfig sfxListConfig, SFXListConfig sfxListConfig,
EnemiesSoundListConfig enemiesSoundListConfig, EnemiesSoundListConfig enemiesSoundListConfig,
DispatcherSoundListConfig dispatcherSoundListConfig//, CharacterSoundListConfig characterSoundListConfig DispatcherSoundListConfig dispatcherSoundListConfig
) )
{ {
AudioMixer = audioMixerConfig.audioMixerAsset; AudioMixer = audioMixerConfig.audioMixerAsset;
@@ -53,59 +51,52 @@ namespace Code.Audio
_SFX = sfxListConfig.SFX; _SFX = sfxListConfig.SFX;
_enemies = enemiesSoundListConfig.enemies; _enemies = enemiesSoundListConfig.enemies;
_dispatcher = dispatcherSoundListConfig.dispatcher; _dispatcher = dispatcherSoundListConfig.dispatcher;
// _character = characterSoundListConfig.character;
MusicDictionary.Add(MusicType.Menu, new ());
MusicDictionary.Add(MusicType.Peaceful, new ());
MusicDictionary.Add(MusicType.Action, new ());
} }
// public async UniTask<AudioMixer> CreateMixer()
// {
// AudioMixer audioMixer = (await Addressables.InstantiateAsync(_audioMixerPrefab).ToUniTask()).GetComponent<AudioMixer>();
//
// return audioMixer;
// }
public async UniTask LoadAudioSourcePrefab(Action<GameObject> callback) => public async UniTask LoadAudioSourcePrefab(Action<GameObject> callback) =>
callback?.Invoke(await Addressables.LoadAssetAsync<GameObject>(_audioSourcePrefab)); callback?.Invoke(await Addressables.LoadAssetAsync<GameObject>(_audioSourcePrefab));
public async UniTask WarmGameplayMusic( ) public async UniTask WarmGameplayMusic( )
{ {
_actionMusicHandle = Addressables.LoadAssetsAsync<AudioClip>(_actionSoundtrack, OnActionTrackLoaded, Addressables.MergeMode.None); _actionMusicHandle = Addressables.LoadAssetsAsync<AudioClip>(_actionSoundtrack, OnActionTrackLoaded, Addressables.MergeMode.Union);
_peacefulMusicHandle = Addressables.LoadAssetsAsync<AudioClip>(_peacefulSoundtrack, OnPeacefulTrackLoaded, Addressables.MergeMode.None); _peacefulMusicHandle = Addressables.LoadAssetsAsync<AudioClip>(_peacefulSoundtrack, OnPeacefulTrackLoaded, Addressables.MergeMode.Union);
await UniTask.WhenAll(_actionMusicHandle.ToUniTask(), _peacefulMusicHandle.ToUniTask()); await UniTask.WhenAll(_actionMusicHandle.ToUniTask(), _peacefulMusicHandle.ToUniTask());
} }
public void ReleaseActionMusic()
public void ReleaseGameplayMusic()
{ {
ActionMusic.Clear(); MusicDictionary[MusicType.Action].Clear();
_actionMusicHandle.Release(); _actionMusicHandle.Release();
}
PeacefulMusic.Clear(); public void ReleasePeacefulMusic()
{
MusicDictionary[MusicType.Peaceful].Clear();
_peacefulMusicHandle.Release(); _peacefulMusicHandle.Release();
} }
public async UniTask WarmMenuMusic( ) public async UniTask WarmMenuMusic( )
{ {
_menuMusicHandle = Addressables.LoadAssetsAsync<AudioClip>(_menuSoundtrack, OnMenuTrackLoaded, Addressables.MergeMode.None); _menuMusicHandle = Addressables.LoadAssetsAsync<AudioClip>(_menuSoundtrack, OnMenuTrackLoaded, Addressables.MergeMode.Union);
// foreach (var assetReference in _menuSoundtrack) MenuMusic.Add(await assetReference.LoadAssetAsync<AudioClip>()); // foreach (var assetReference in _menuSoundtrack) MenuMusic.Add(await assetReference.LoadAssetAsync<AudioClip>());
await _menuMusicHandle.ToUniTask(); await _menuMusicHandle.ToUniTask();
} }
public void ReleaseMenuMusic() public void ReleaseMenuMusic()
{ {
MenuMusic.Clear(); MusicDictionary[MusicType.Menu].Clear();
// foreach (var assetReference in _menuSoundtrack) assetReference.ReleaseAsset(); // foreach (var assetReference in _menuSoundtrack) assetReference.ReleaseAsset();
_menuMusicHandle.Release(); _menuMusicHandle.Release();
} }
public async UniTask WarmSFX( ) public async UniTask WarmSFX( )
{ {
_SFXHandle = Addressables.LoadAssetsAsync<AudioClip>(_SFX, OnSFXLoaded, Addressables.MergeMode.None); _SFXHandle = Addressables.LoadAssetsAsync<AudioClip>(_SFX, OnSFXLoaded, Addressables.MergeMode.Union);
await _SFXHandle.ToUniTask(); await _SFXHandle.ToUniTask();
} }
public void ReleaseSFX() public void ReleaseSFX()
{ {
SFXAudios.Clear(); SFXAudios.Clear();
@@ -113,7 +104,7 @@ namespace Code.Audio
} }
public async UniTask WarmEnemies( ) public async UniTask WarmEnemies( )
{ {
_enemiesHandle = Addressables.LoadAssetsAsync<AudioClip>(_enemies, OnEnemiesLoaded, Addressables.MergeMode.None); _enemiesHandle = Addressables.LoadAssetsAsync<AudioClip>(_enemies, OnEnemiesLoaded, Addressables.MergeMode.Union);
await _enemiesHandle.ToUniTask(); await _enemiesHandle.ToUniTask();
@@ -127,7 +118,7 @@ namespace Code.Audio
public async UniTask WarmDispatcher( ) public async UniTask WarmDispatcher( )
{ {
_dispatcherHandle = Addressables.LoadAssetsAsync<AudioClip>(_dispatcher, OnDispatcherLoaded, Addressables.MergeMode.None); _dispatcherHandle = Addressables.LoadAssetsAsync<AudioClip>(_dispatcher, OnDispatcherLoaded, Addressables.MergeMode.Union);
await _dispatcherHandle.ToUniTask(); await _dispatcherHandle.ToUniTask();
@@ -139,17 +130,17 @@ namespace Code.Audio
_dispatcherHandle.Release(); _dispatcherHandle.Release();
} }
private void OnMenuTrackLoaded(AudioClip audioClip)
{
MusicDictionary[MusicType.Menu].Add(audioClip);
}
private void OnActionTrackLoaded(AudioClip audioClip) private void OnActionTrackLoaded(AudioClip audioClip)
{ {
ActionMusic.Add(audioClip); MusicDictionary[MusicType.Action].Add(audioClip);
} }
private void OnPeacefulTrackLoaded(AudioClip audioClip) private void OnPeacefulTrackLoaded(AudioClip audioClip)
{ {
PeacefulMusic.Add(audioClip); MusicDictionary[MusicType.Peaceful].Add(audioClip);
}
private void OnMenuTrackLoaded(AudioClip audioClip)
{
MenuMusic.Add(audioClip);
} }
private void OnSFXLoaded(AudioClip audioClip) private void OnSFXLoaded(AudioClip audioClip)
{ {
+79 -146
View File
@@ -22,9 +22,9 @@ namespace Code.Audio
private AudioSource _peacefulMusicSource; private AudioSource _peacefulMusicSource;
private AudioMixerGroup _masterGroup, private AudioMixerGroup _masterGroup,
_musicGroup, // _musicGroup,
_actionMusicGroup, // _actionMusicGroup,
_peacefulMusicGroup, // _peacefulMusicGroup,
_SFXGroup, _SFXGroup,
_creaturesGroup, _creaturesGroup,
_dispatcherGroup, _dispatcherGroup,
@@ -34,7 +34,7 @@ namespace Code.Audio
private readonly AudioSourcePool _audioSourcePool = new(); private readonly AudioSourcePool _audioSourcePool = new();
private Dictionary<AudioSnapshotState, AudioMixerSnapshot> _snapshots = new(); private Dictionary<AudioSnapshotState, AudioMixerSnapshot> _snapshots = new();
public AudioService(IAudioFactory audioFactory) public AudioService(IAudioFactory audioFactory)
{ {
_audioFactory = audioFactory; _audioFactory = audioFactory;
@@ -44,112 +44,94 @@ namespace Code.Audio
{ {
// _mixer = await _audioFactory.CreateMixer(); // _mixer = await _audioFactory.CreateMixer();
_mixer = _audioFactory.AudioMixer; _mixer = _audioFactory.AudioMixer;
_masterGroup = _mixer.FindMatchingGroups(AudioGroups.MasterGroup)[0]; _masterGroup = _mixer.FindMatchingGroups(AudioGroups.MasterGroup)[0];
_actionMusicGroup = _mixer.FindMatchingGroups(AudioGroups.ActionMusicGroup)[0]; // _actionMusicGroup = _mixer.FindMatchingGroups(AudioGroups.ActionMusicGroup)[0];
_peacefulMusicGroup = _mixer.FindMatchingGroups(AudioGroups.PeacefulMusicGroup)[0]; // _peacefulMusicGroup = _mixer.FindMatchingGroups(AudioGroups.PeacefulMusoup)[0];
// _musicGroup = _mixer.FindMatchingGroups(AudioGroups.MusicGroup)[0];
_musicAudioGroups.Add(MusicType.Menu, _mixer.FindMatchingGroups(AudioGroups.MenuMusicGroup)[0]);
_musicAudioGroups.Add(MusicType.Action, _mixer.FindMatchingGroups(AudioGroups.ActionMusicGroup)[0]);
_musicAudioGroups.Add(MusicType.Peaceful, _mixer.FindMatchingGroups(AudioGroups.PeacefulMusicGroup)[0]);
_cancellationTokenSources.Add(MusicType.Menu, new());
_cancellationTokenSources.Add(MusicType.Action, new());
_cancellationTokenSources.Add(MusicType.Peaceful, new());
_musicAudioSources.Add(MusicType.Menu, null);
_musicAudioSources.Add(MusicType.Action, null);
_musicAudioSources.Add(MusicType.Peaceful, null);
_SFXGroup = _mixer.FindMatchingGroups(AudioGroups.SFXGroup)[0]; _SFXGroup = _mixer.FindMatchingGroups(AudioGroups.SFXGroup)[0];
_musicGroup = _mixer.FindMatchingGroups(AudioGroups.MusicGroup)[0];
_creaturesGroup = _mixer.FindMatchingGroups(AudioGroups.CreaturesGroup)[0]; _creaturesGroup = _mixer.FindMatchingGroups(AudioGroups.CreaturesGroup)[0];
_dispatcherGroup = _mixer.FindMatchingGroups(AudioGroups.DispatcherMusicGroup)[0]; _dispatcherGroup = _mixer.FindMatchingGroups(AudioGroups.DispatcherMusicGroup)[0];
_courierGroup = _mixer.FindMatchingGroups(AudioGroups.CourierMusicGroup)[0]; _courierGroup = _mixer.FindMatchingGroups(AudioGroups.CourierMusicGroup)[0];
_enemiesGroup = _mixer.FindMatchingGroups(AudioGroups.EnemiesMusicGroup)[0]; _enemiesGroup = _mixer.FindMatchingGroups(AudioGroups.EnemiesMusicGroup)[0];
_snapshots[AudioSnapshotState.None] = _mixer.FindSnapshot(AudioGroups.NoneSnapshot);
_snapshots[AudioSnapshotState.Peaceful] = _mixer.FindSnapshot(AudioGroups.PeacefulSnapshot); _snapshots[AudioSnapshotState.Peaceful] = _mixer.FindSnapshot(AudioGroups.PeacefulSnapshot);
_snapshots[AudioSnapshotState.Action] = _mixer.FindSnapshot(AudioGroups.ActionSnapshot); _snapshots[AudioSnapshotState.Action] = _mixer.FindSnapshot(AudioGroups.ActionSnapshot);
_snapshots[AudioSnapshotState.None] = _mixer.FindSnapshot(AudioGroups.NoneSnapshot); _snapshots[AudioSnapshotState.Menu] = _mixer.FindSnapshot(AudioGroups.MenuSnapshot);
await _audioFactory.LoadAudioSourcePrefab(_audioSourcePool.Initialize); await _audioFactory.LoadAudioSourcePrefab(_audioSourcePool.Initialize);
}
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
private Dictionary<MusicType, CancellationTokenSource> _cancellationTokenSources = new();
private Dictionary<MusicType, AudioSource> _musicAudioSources = new();
private Dictionary<MusicType, AudioMixerGroup> _musicAudioGroups = new();
public async UniTaskVoid PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType musicType)
{
if(!_musicAudioSources[musicType])
{
_musicAudioSources[musicType] = _audioSourcePool.GetSource();
_musicAudioSources[musicType].spatialBlend = 0f;
_musicAudioSources[musicType].outputAudioMixerGroup = _musicAudioGroups[musicType];
}
_musicAudioSources[musicType].resource =
_audioFactory.MusicDictionary[musicType][
Random.Range(0, _audioFactory.MusicDictionary[musicType].Count)];
_musicAudioSources[musicType].Play();
// await UniTask.WaitUntilValueChanged(_musicAudioSources[musicType],
// _ => !_musicAudioSources[musicType].isPlaying,
// cancellationToken: _cancellationTokenSources[musicType].Token);
await UniTask.NextFrame();
// Debug.Log($"Playing {musicType}");
var (isCanceled, _) = await UniTask.WaitUntilValueChanged(_musicAudioSources[musicType],
_ => !_musicAudioSources[musicType].isPlaying,
cancellationToken: _cancellationTokenSources[musicType].Token).SuppressCancellationThrow();
// Debug.Log($"Finished {musicType}");
if (isCanceled)
{
// Debug.Log($"Cancelled {musicType}");
_cancellationTokenSources[musicType].Dispose();
_cancellationTokenSources[musicType] = new();
_audioSourcePool.ReleaseSource(_musicAudioSources[musicType]);
_musicAudioSources[musicType] = null;
return;
}
PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(musicType);
}
InitializeMusicSources(); public async UniTaskVoid GladlyAskToStopMusic(MusicType musicType, AudioSnapshotState audioSnapshotState = AudioSnapshotState.None, float time = 1f, Action callback = null)
}
private void InitializeMusicSources()
{ {
_actionMusicSource = _audioSourcePool.GetSource(); TransitToSnapshot(audioSnapshotState, time);
_actionMusicSource.outputAudioMixerGroup = _actionMusicGroup;
_actionMusicSource.spatialBlend = 0f; await UniTask.WaitForSeconds(time);
_peacefulMusicSource = _audioSourcePool.GetSource(); _cancellationTokenSources[musicType].Cancel();
_peacefulMusicSource.outputAudioMixerGroup = _peacefulMusicGroup;
_peacefulMusicSource.spatialBlend = 0f;
}
public void PlayRandomGameplayMusic() callback?.Invoke();
{
_peacefulMusicSource.resource = _audioFactory.PeacefulMusic[Random.Range(0, _audioFactory.PeacefulMusic.Count)];
_actionMusicSource.resource =
_audioFactory.ActionMusic[Random.Range(0, _audioFactory.ActionMusic.Count)];
_peacefulMusicSource.Play();
_actionMusicSource.Play();
}
public void PlayRandomMenuMusic()
{
TransitToSnapshot(AudioSnapshotState.Peaceful);
_peacefulMusicSource.resource = _audioFactory.MenuMusic[Random.Range(0, _audioFactory.MenuMusic.Count)];
_peacefulMusicSource.Play();
}
private CancellationTokenSource _menuMusicTokenSource = new();
public async UniTaskVoid PlayRandomMenuMusicUntilHumanityWillBeDestroyedForTheySins()
{
TransitToSnapshot(AudioSnapshotState.Peaceful);
_peacefulMusicSource.resource = _audioFactory.MenuMusic[Random.Range(0, _audioFactory.MenuMusic.Count)];
_peacefulMusicSource.Play();
await UniTask.WaitUntilValueChanged(_peacefulMusicSource, _ => _peacefulMusicSource.isPlaying, cancellationToken: _menuMusicTokenSource.Token);
if (_menuMusicTokenSource.IsCancellationRequested)
{
_menuMusicTokenSource.Dispose();
_menuMusicTokenSource = new();
return;
}
PlayRandomMenuMusicUntilHumanityWillBeDestroyedForTheySins();
}
private CancellationTokenSource _peacefulMusicTokenSource = new();
public async UniTaskVoid PlayRandomPeacefulMusicUntilHumanityWillBeDestroyedForTheySins()
{
TransitToSnapshot(AudioSnapshotState.Peaceful);
_peacefulMusicSource.resource = _audioFactory.PeacefulMusic[Random.Range(0, _audioFactory.PeacefulMusic.Count)];
_peacefulMusicSource.Play();
await UniTask.WaitUntilValueChanged(_peacefulMusicSource, _ => _peacefulMusicSource.isPlaying, cancellationToken: _peacefulMusicTokenSource.Token);
if (_peacefulMusicTokenSource.IsCancellationRequested)
{
_peacefulMusicTokenSource.Dispose();
_peacefulMusicTokenSource = new();
return;
}
PlayRandomPeacefulMusicUntilHumanityWillBeDestroyedForTheySins();
}
private CancellationTokenSource _actionMusicTokenSource = new();
public async UniTaskVoid PlayRandomActionMusicUntilHumanityWillBeDestroyedForTheySins()
{
TransitToSnapshot(AudioSnapshotState.Action);
_actionMusicSource.resource = _audioFactory.ActionMusic[Random.Range(0, _audioFactory.ActionMusic.Count)];
_actionMusicSource.Play();
await UniTask.WaitUntilValueChanged(_actionMusicSource, _ => _actionMusicSource.isPlaying, cancellationToken: _actionMusicTokenSource.Token);
if (_actionMusicTokenSource.IsCancellationRequested)
{
_actionMusicTokenSource.Dispose();
_actionMusicTokenSource = new();
return;
}
PlayRandomActionMusicUntilHumanityWillBeDestroyedForTheySins();
} }
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
public void StopMusic() public void StopMusic()
{ {
@@ -162,58 +144,7 @@ namespace Code.Audio
TransitToSnapshot(AudioSnapshotState.None); TransitToSnapshot(AudioSnapshotState.None);
_peacefulMusicSource.Stop(); _peacefulMusicSource.Stop();
_actionMusicSource.Stop(); _actionMusicSource.Stop();
callback?.Invoke();
}
public async UniTaskVoid GladlyAskToStopMenuMusic(Action callback = null)
{
TransitToSnapshot(AudioSnapshotState.None);
await UniTask.WaitForSeconds(1f);
_peacefulMusicSource.Stop();
_menuMusicTokenSource.Cancel();
callback?.Invoke();
}
public async UniTaskVoid GladlyAskToStopGameplayMusic(Action callback = null)
{
TransitToSnapshot(AudioSnapshotState.None);
await UniTask.WaitForSeconds(1f);
_actionMusicSource.Stop();
_peacefulMusicSource.Stop();
_actionMusicTokenSource.Cancel();
_peacefulMusicTokenSource.Cancel();
callback?.Invoke();
}
public async UniTaskVoid GladlyAskToStopActionMusic(Action callback = null)
{
TransitToSnapshot(AudioSnapshotState.None);
await UniTask.WaitForSeconds(1f);
_actionMusicSource.Stop();
_actionMusicTokenSource.Cancel();
callback?.Invoke();
}
public async UniTaskVoid GladlyAskToStopPeacefulMusic(Action callback = null)
{
TransitToSnapshot(AudioSnapshotState.None);
await UniTask.WaitForSeconds(1f);
_peacefulMusicSource.Stop();
_peacefulMusicTokenSource.Cancel();
callback?.Invoke(); callback?.Invoke();
} }
@@ -227,10 +158,12 @@ namespace Code.Audio
{ {
_audioSourcePool.PlayOneShot(_audioFactory.SFXAudios[(int)sfxId], position, _SFXGroup); _audioSourcePool.PlayOneShot(_audioFactory.SFXAudios[(int)sfxId], position, _SFXGroup);
} }
public void PlayEnemy(EnemiesSounds enemySoundId, Vector3 position) public void PlayEnemy(EnemiesSounds enemySoundId, Vector3 position)
{ {
_audioSourcePool.PlayOneShot(_audioFactory.EnemiesAudios[(int)enemySoundId], position, _enemiesGroup); _audioSourcePool.PlayOneShot(_audioFactory.EnemiesAudios[(int)enemySoundId], position, _enemiesGroup);
} }
public void PlayDispatcher(DispatcherSounds dispatcherSoundId) public void PlayDispatcher(DispatcherSounds dispatcherSoundId)
{ {
_audioSourcePool.PlayShizo(_audioFactory.DispatcherAudios[(int)dispatcherSoundId], _dispatcherGroup); _audioSourcePool.PlayShizo(_audioFactory.DispatcherAudios[(int)dispatcherSoundId], _dispatcherGroup);
@@ -4,6 +4,7 @@ namespace Code.Audio
{ {
None, None,
Peaceful, Peaceful,
Action Action,
Menu
} }
} }
@@ -19,7 +19,7 @@ namespace Code.Audio
_pool = new ObjectPool<AudioSource>( _pool = new ObjectPool<AudioSource>(
createFunc: CreateItem, createFunc: CreateItem,
// actionOnGet: OnGet, // actionOnGet: OnGet,
// actionOnRelease: OnRelease, actionOnRelease: OnRelease,
actionOnDestroy: OnDestroyItem, actionOnDestroy: OnDestroyItem,
collectionCheck: true, // helps catch double-release mistakes collectionCheck: true, // helps catch double-release mistakes
defaultCapacity: 10, defaultCapacity: 10,
@@ -45,6 +45,7 @@ namespace Code.Audio
// Called when an item is returned to the pool. // Called when an item is returned to the pool.
private void OnRelease(AudioSource source) private void OnRelease(AudioSource source)
{ {
source.Stop();
//source.gameObject.SetActive(false); //source.gameObject.SetActive(false);
} }
@@ -8,16 +8,14 @@ namespace Code.Audio
{ {
public interface IAudioFactory public interface IAudioFactory
{ {
List<AudioClip> PeacefulMusic { get; }
List<AudioClip> ActionMusic { get; }
List<AudioClip> MenuMusic { get; }
List<AudioClip> SFXAudios { get; } List<AudioClip> SFXAudios { get; }
List<AudioClip> EnemiesAudios { get; } List<AudioClip> EnemiesAudios { get; }
List<AudioClip> DispatcherAudios { get; } List<AudioClip> DispatcherAudios { get; }
AudioMixer AudioMixer { get; } AudioMixer AudioMixer { get; }
Dictionary<MusicType, List<AudioClip>> MusicDictionary { get; }
UniTask LoadAudioSourcePrefab(Action<GameObject> callback); UniTask LoadAudioSourcePrefab(Action<GameObject> callback);
UniTask WarmGameplayMusic(); UniTask WarmGameplayMusic();
void ReleaseGameplayMusic(); void ReleaseActionMusic();
UniTask WarmMenuMusic(); UniTask WarmMenuMusic();
void ReleaseMenuMusic(); void ReleaseMenuMusic();
UniTask WarmSFX(); UniTask WarmSFX();
@@ -26,5 +24,6 @@ namespace Code.Audio
void ReleaseEnemies(); void ReleaseEnemies();
UniTask WarmDispatcher(); UniTask WarmDispatcher();
void ReleaseDispatcher(); void ReleaseDispatcher();
void ReleasePeacefulMusic();
} }
} }
@@ -7,20 +7,13 @@ namespace Code.Audio
public interface IAudioService public interface IAudioService
{ {
UniTask Initialize(); UniTask Initialize();
void PlayRandomGameplayMusic(); UniTaskVoid PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType musicType);
UniTaskVoid GladlyAskToStopMusic(MusicType musicType, AudioSnapshotState audioSnapshotState = AudioSnapshotState.None, float time = 1f, Action callback = null);
void StopMusic();
void GladlyAskToStopMusic(Action callback = null);
void TransitToSnapshot(AudioSnapshotState state, float time = 1f); void TransitToSnapshot(AudioSnapshotState state, float time = 1f);
void PlaySFX(SFXSounds sfxId, Vector3 position); void PlaySFX(SFXSounds sfxId, Vector3 position);
void PlayEnemy(EnemiesSounds enemySoundId, Vector3 position); void PlayEnemy(EnemiesSounds enemySoundId, Vector3 position);
void PlayDispatcher(DispatcherSounds dispatcherSoundId); void PlayDispatcher(DispatcherSounds dispatcherSoundId);
void PlayRandomMenuMusic();
UniTaskVoid PlayRandomMenuMusicUntilHumanityWillBeDestroyedForTheySins();
void StopMusic();
void GladlyAskToStopMusic(Action callback = null);
UniTaskVoid GladlyAskToStopMenuMusic(Action callback = null);
UniTaskVoid GladlyAskToStopActionMusic(Action callback = null);
UniTaskVoid GladlyAskToStopPeacefulMusic(Action callback = null);
UniTaskVoid PlayRandomPeacefulMusicUntilHumanityWillBeDestroyedForTheySins();
UniTaskVoid PlayRandomActionMusicUntilHumanityWillBeDestroyedForTheySins();
UniTaskVoid GladlyAskToStopGameplayMusic(Action callback = null);
} }
} }
@@ -0,0 +1,9 @@
namespace Code.Audio
{
public enum MusicType
{
Menu,
Peaceful,
Action
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 74ff08d5f1b741f69e37fc06fb07ae8d
timeCreated: 1763151897
@@ -0,0 +1,12 @@
using UnityEngine;
namespace Code.Configs
{
[CreateAssetMenu(menuName = "Config/Gameplay/OrderBox", fileName = "OrderBoxConfig")]
public class OrderBoxConfig : ScriptableObject
{
public float activationTime;
public AnimationCurve floatingCurve;
public float curveLength;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6af4f53d425a41c78ef889fd7e5c3197
timeCreated: 1763735968
@@ -0,0 +1,11 @@
using UnityEngine;
namespace Code.Configs
{
[CreateAssetMenu(fileName = "OrderServiceConfig", menuName = "Config/Gameplay/OrderServiceConfig")]
public class OrderServiceConfig : ScriptableObject
{
public Vector2 timeBounds;
public float koefRooms, koefOvertime;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ee2550c3e4874575ac3aecadfcc42475
timeCreated: 1763559999
@@ -1,4 +1,5 @@
using UnityEngine; using UnityEngine;
using UnityEngine.AddressableAssets;
namespace Code.Configs namespace Code.Configs
{ {
@@ -6,5 +7,8 @@ namespace Code.Configs
public class PlayerConfig : ScriptableObject public class PlayerConfig : ScriptableObject
{ {
public int maxHealth; public int maxHealth;
public AssetReference characterPrefab;
public AssetReference armsMeshPrefab;
} }
} }
@@ -25,5 +25,7 @@ namespace Code.Constants
public const string PeacefulSnapshot = "Peaceful"; public const string PeacefulSnapshot = "Peaceful";
public const string ActionSnapshot = "Action"; public const string ActionSnapshot = "Action";
public const string NoneSnapshot = "None"; public const string NoneSnapshot = "None";
public const string MenuSnapshot = "Menu";
public const string MenuMusicGroup = "Menu";
} }
} }
@@ -12,6 +12,7 @@ namespace Code.Gameplay.Camera
{ {
Bogdan, Bogdan,
Static, Static,
UltraStatic,
FirstPerson, FirstPerson,
ThirdPerson, ThirdPerson,
Cinematic Cinematic
@@ -10,12 +10,14 @@ namespace Code.Gameplay.Camera
public override void Initialize() public override void Initialize()
{ {
States.Add(CameraMode.Static, new StaticState(StateMachineContext)); States.Add(CameraMode.Static, new StaticState(StateMachineContext));
States.Add(CameraMode.UltraStatic, new UltraStaticState(StateMachineContext));
States.Add(CameraMode.FirstPerson, new FirstPersonState(StateMachineContext)); States.Add(CameraMode.FirstPerson, new FirstPersonState(StateMachineContext));
States.Add(CameraMode.ThirdPerson, new ThirdPersonState(StateMachineContext)); States.Add(CameraMode.ThirdPerson, new ThirdPersonState(StateMachineContext));
CurrentBaseState = States[CameraMode.Static]; CurrentBaseState = States[CameraMode.UltraStatic];
} }
public UnityEngine.Camera Camera => StateMachineContext.Camera;
protected override bool CheckTransitionAllowed(CameraMode nextState) => true; protected override bool CheckTransitionAllowed(CameraMode nextState) => true;
@@ -117,7 +117,7 @@ namespace Code.Gameplay.Camera.CameraStates
protected virtual void HandleRotationInput(float deltaTime, Vector3 rotationInput, out Quaternion targetRotation) protected virtual void HandleRotationInput(float deltaTime, Vector3 rotationInput, out Quaternion targetRotation)
{ {
// Вращение вокруг вертикальной оси (горизонтальный поворот) // Вращение вокруг вертикальной оси (горизонтальный поворот)
var rotationFromInput = Quaternion.Euler(FollowTransform.up * (rotationInput.x * RotationSpeed)); var rotationFromInput = Quaternion.Euler(Vector3.up * (rotationInput.x * RotationSpeed));
PlanarDirection = rotationFromInput * PlanarDirection; PlanarDirection = rotationFromInput * PlanarDirection;
var planarRotation = Quaternion.LookRotation(PlanarDirection, FollowTransform.up); var planarRotation = Quaternion.LookRotation(PlanarDirection, FollowTransform.up);
@@ -0,0 +1,29 @@
using UnityEngine;
namespace Code.Gameplay.Camera.CameraStates
{
public class UltraStaticState : BaseCameraState, ICameraState
{
public UltraStaticState(CameraStateMachineContext context) : base(context) { }
public override void EnterState()
{
Debug.Log("Ultra static State Enter");
base.EnterState();
}
protected override void HandlePosition(float deltaTime, float zoomInput, Quaternion targetRotation)
{
Camera.transform.position = FollowTransform.position;
}
public CameraMode GetCameraMode() => CameraMode.UltraStatic;
protected override void HandleRotationInput(float deltaTime, Vector3 rotationInput,
out Quaternion targetRotation)
{
if(FollowTransform) Camera.transform.rotation = FollowTransform.rotation;
targetRotation = Camera.transform.rotation;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8e4b2fa3af4b4ba78ab79ca154f05fb4
timeCreated: 1763547110
@@ -15,6 +15,12 @@ namespace Code.Gameplay.Character.Controller.Abilities
private readonly float _minWallClimbSpeed; private readonly float _minWallClimbSpeed;
// Пороговый косинус стены // Пороговый косинус стены
public float WallNormalThreshold { get; } public float WallNormalThreshold { get; }
private bool _hasClimbedThisWallSession;
private float _wallClimbCooldownTimer;
private readonly float _wallClimbCooldownDuration = 1.5f;
public bool IsClimbingActive { get; private set; }
// Конструктор механики залазания на стену // Конструктор механики залазания на стену
public WallClimbMechanic(float wallClimbSpeedFactor, float minWallClimbSpeed, float wallDetectionAngleThreshold) public WallClimbMechanic(float wallClimbSpeedFactor, float minWallClimbSpeed, float wallDetectionAngleThreshold)
@@ -26,21 +32,32 @@ namespace Code.Gameplay.Character.Controller.Abilities
} }
// Обработка столкновения при движении (вызывается при ударе о препятствие) // Обработка столкновения при движении (вызывается при ударе о препятствие)
public void OnMovementHit(KinematicCharacterMotor motor, Vector3 hitNormal) public bool TryClimbWall(KinematicCharacterMotor motor, Vector3 hitNormal)
{ {
// Проверяем, что это вертикальная или почти вертикальная поверхность (стена) // Проверяем, что это вертикальная или почти вертикальная поверхность (стена)
var dotWithUp = Vector3.Dot(hitNormal, motor.CharacterUp); var dotWithUp = Vector3.Dot(hitNormal, motor.CharacterUp);
if (Mathf.Abs(dotWithUp) > WallNormalThreshold) return; // Не стена — это пол или потолок
if (Mathf.Abs(dotWithUp) > WallNormalThreshold)
{
// Сбрасываем сессию, если коснулись пола/потолка → выход из "режима стены"
_hasClimbedThisWallSession = false;
return false;
}
// Запрещаем повторное залазание в рамках одной сессии
if (_hasClimbedThisWallSession || _wallClimbCooldownTimer > 0f)
return false;
// Получаем текущую скорость персонажа // Получаем текущую скорость персонажа
var currentVelocity = motor.Velocity; var currentVelocity = motor.Velocity;
// Проекция скорости на направление к стене (отрицательная, если летим в стену) // Проекция скорости на направление к стене (отрицательная, если летим в стену)
var velocityIntoWall = Vector3.Dot(currentVelocity, -hitNormal); var velocityIntoWall = Vector3.Dot(currentVelocity, -hitNormal);
// Если движемся в стену с достаточной скоростью // Если движемся в стену с достаточной скоростью
if (velocityIntoWall > _minWallClimbSpeed) if (velocityIntoWall > _minWallClimbSpeed)
{ {
_wallClimbCooldownTimer = _wallClimbCooldownDuration;
// Преобразуем часть горизонтальной скорости в вертикальную // Преобразуем часть горизонтальной скорости в вертикальную
var verticalBoost = velocityIntoWall * _wallClimbSpeedFactor; var verticalBoost = velocityIntoWall * _wallClimbSpeedFactor;
@@ -49,6 +66,26 @@ namespace Code.Gameplay.Character.Controller.Abilities
// Предотвращаем заземление и повторное применение в этом кадре // Предотвращаем заземление и повторное применение в этом кадре
motor.ForceUnground(); motor.ForceUnground();
_hasClimbedThisWallSession = true;
IsClimbingActive = true;
return true;
}
return false;
}
public void ResetWallClimbSession()
{
_hasClimbedThisWallSession = false;
IsClimbingActive = false;
}
public void TickCooldown(float deltaTime)
{
if (_wallClimbCooldownTimer > 0f)
{
_wallClimbCooldownTimer -= deltaTime;
} }
} }
} }
@@ -17,6 +17,12 @@ namespace Code.Gameplay.Character.Controller.Abilities
private Vector3 _lastWallNormal; private Vector3 _lastWallNormal;
private float _lastWallContactHeight; private float _lastWallContactHeight;
private float _leanFactor; private float _leanFactor;
private float _leanSign;
private Vector3 _leanDirection;
private Vector3 _lastWallContactPoint;
private bool _isLeaningOnWall;
private const float WallProximityThreshold = 0.6f;
public WallLeanMechanic(float maxLeanAngle, float leanSharpness, float heightScale) public WallLeanMechanic(float maxLeanAngle, float leanSharpness, float heightScale)
{ {
@@ -32,29 +38,93 @@ namespace Code.Gameplay.Character.Controller.Abilities
} }
// Вызывается из OnMovementHit // Вызывается из OnMovementHit
public void OnWallContact(Vector3 wallNormal, float contactHeight) public void OnWallContact(KinematicCharacterMotor motor, Vector3 wallNormal, float contactHeight)
{ {
// Только если это действительно стена (не пол/потолок)
var dotWithUp = Vector3.Dot(wallNormal, motor.CharacterUp);
if (Mathf.Abs(dotWithUp) > 0.7f) // ~45°, можно настроить
return;
_lastWallNormal = wallNormal; _lastWallNormal = wallNormal;
_lastWallContactHeight = contactHeight; } _lastWallContactHeight = contactHeight;
_lastWallContactPoint = motor.TransientPosition;
// Пересчитываем направление наклона
_leanDirection = -_lastWallNormal;
_leanDirection = Vector3.ProjectOnPlane(_leanDirection, motor.CharacterUp).normalized;
_leanSign = 1;
// what the fuck
if (_leanDirection.x != 0)
{
switch (_leanDirection.x)
{
case -1 or 1 when motor.CharacterRight.x > 0.1f:
_leanSign = -1;
break;
case -1 or 1 when Mathf.Abs(motor.CharacterRight.x) < 0.1f:
_leanDirection = new Vector3(0, 0, -1);
break;
}
}
else
{
switch (_leanDirection.z)
{
case 1 when Mathf.Abs(motor.CharacterRight.z) < 0.1f:
_leanSign = -1;
break;
case -1 when motor.CharacterRight.z < -0.1f:
case 1 when motor.CharacterRight.z > 0.1f:
_leanDirection = new Vector3(-1, 0, 0);
break;
case -1 when motor.CharacterRight.z > 0.1f:
case 1 when motor.CharacterRight.z < -0.1f:
_leanDirection = new Vector3(1, 0, 0);
break;
}
}
_isLeaningOnWall = true;
}
// Обновление каждый кадр // Обновление каждый кадр
public void UpdateLean(KinematicCharacterMotor motor, float deltaTime) public void UpdateLean(KinematicCharacterMotor motor, float deltaTime)
{ {
if (!_characterTransform) return; if (!_characterTransform) return;
var isGrounded = motor.GroundingStatus.IsStableOnGround;
if (!isGrounded) var currentPosition = motor.TransientPosition;
var isStillNearWall = false;
if (_isLeaningOnWall && _lastWallNormal != Vector3.zero)
{ {
var heightDelta = motor.TransientPosition.y - _lastWallContactHeight; var toWall = currentPosition - _lastWallContactPoint;
var targetLeanFactor = Mathf.Clamp01(heightDelta * _heightScale); var distanceToWallPlane = Mathf.Abs(Vector3.Dot(toWall, _lastWallNormal));
_leanFactor = Mathf.Lerp(_leanFactor, targetLeanFactor, 1f - Mathf.Exp(-_leanSharpness * deltaTime)); isStillNearWall = distanceToWallPlane <= WallProximityThreshold;
} }
else
if (_isLeaningOnWall)
{
var isBelowContactHeight = currentPosition.y < _lastWallContactHeight;
if (!isStillNearWall || isBelowContactHeight)
{
_isLeaningOnWall = false;
}
else
{
var heightDelta = currentPosition.y - _lastWallContactHeight;
var targetLeanFactor = Mathf.Clamp01(heightDelta * _heightScale);
_leanFactor = Mathf.Lerp(_leanFactor, targetLeanFactor, 1f - Mathf.Exp(-_leanSharpness * deltaTime));
}
}
if (!_isLeaningOnWall)
{ {
_leanFactor = Mathf.Lerp(_leanFactor, 0f, 1f - Mathf.Exp(-_leanSharpness * deltaTime)); _leanFactor = Mathf.Lerp(_leanFactor, 0f, 1f - Mathf.Exp(-_leanSharpness * deltaTime));
} }
ApplyLeanRotation(motor); ApplyLeanRotation(motor);
} }
@@ -66,13 +136,11 @@ namespace Code.Gameplay.Character.Controller.Abilities
return; return;
} }
var leanDirection = -_lastWallNormal; if (_leanDirection.sqrMagnitude < 0.01f) return;
leanDirection = Vector3.ProjectOnPlane(leanDirection, motor.CharacterUp).normalized;
if (leanDirection.sqrMagnitude < 0.01f) return; var leanAngle = _leanSign * _leanFactor * _maxLeanAngle;
var leanAxis = Vector3.Cross(motor.CharacterUp, _leanDirection);
var leanAngle = _leanFactor * _maxLeanAngle; var leanRotation = Quaternion.AngleAxis(leanAngle, leanAxis);
var leanRotation = Quaternion.AngleAxis(leanAngle, Vector3.Cross(motor.CharacterUp, leanDirection));
_characterTransform.localRotation = leanRotation; _characterTransform.localRotation = leanRotation;
} }
} }
@@ -33,9 +33,43 @@ namespace Code.Gameplay.Character.Controller
private GroundMovementSystem _groundMovement; private GroundMovementSystem _groundMovement;
private AirMovementSystem _airMovement; private AirMovementSystem _airMovement;
public void SetPosition(Vector3 position) => motor.SetPosition(position);
public void SetRotation(Quaternion rotation) => motor.SetRotation(rotation);
// Инициализация контроллера // Инициализация контроллера
private void Awake() // private void Awake()
// {
// // Инициализация подсистем с параметрами из конфига
// _inputHandler = new CharacterInputHandler(
// _characterConfig.sprintAngleThreshold
// );
// _slideMechanic = new SlideMechanic(
// _characterConfig.slideSpeed,
// _characterConfig.slideDuration,
// _characterConfig.slideCooldown
// );
// _wallClimbMechanic = new WallClimbMechanic(
// _characterConfig.wallClimbSpeedFactor,
// _characterConfig.minWallClimbSpeed,
// _characterConfig.wallDetectionAngleThreshold
// );
// _wallLeanMechanic = new WallLeanMechanic(
// _characterConfig.maxWallLeanAngle,
// _characterConfig.wallLeanSharpness,
// _characterConfig.wallLeanHeightScale
// );
// _groundMovement = new GroundMovementSystem(
// _characterConfig.maxStableMoveSpeed,
// _characterConfig.sprintMoveSpeed,
// _characterConfig.stableMovementSharpness,
// _characterConfig.jumpSpeed
// );
// _airMovement = new AirMovementSystem(_characterConfig.gravity);
// }
[Inject]
private void Construct(CharacterConfig characterConfig)
{ {
_characterConfig = characterConfig;
// Инициализация подсистем с параметрами из конфига // Инициализация подсистем с параметрами из конфига
_inputHandler = new CharacterInputHandler( _inputHandler = new CharacterInputHandler(
_characterConfig.sprintAngleThreshold _characterConfig.sprintAngleThreshold
@@ -62,25 +96,31 @@ namespace Code.Gameplay.Character.Controller
_characterConfig.jumpSpeed _characterConfig.jumpSpeed
); );
_airMovement = new AirMovementSystem(_characterConfig.gravity); _airMovement = new AirMovementSystem(_characterConfig.gravity);
}
// Текущий режим камеры для адаптации поведения
private CameraMode _currentCameraMode = CameraMode.FirstPerson;
// Инициализация контроллера
private void Start()
{
motor.CharacterController = this; // Регистрация этого контроллера в движке motor.CharacterController = this; // Регистрация этого контроллера в движке
_inputHandler.FirstPersonCameraRotation = _inputHandler.FirstPersonCameraRotation =
motor.Transform.rotation; // Начальное вращение совпадает с персонажемс motor.Transform.rotation; // Начальное вращение совпадает с персонажемс
_wallLeanMechanic.SetCharacterTransform(characterTransform); _wallLeanMechanic.SetCharacterTransform(characterTransform);
} }
// Текущий режим камеры для адаптации поведения
private CameraMode _currentCameraMode = CameraMode.FirstPerson;
// Инициализация контроллера
// private void Start()
// {
// motor.CharacterController = this; // Регистрация этого контроллера в движке
// _inputHandler.FirstPersonCameraRotation =
// motor.Transform.rotation; // Начальное вращение совпадает с персонажемс
// _wallLeanMechanic.SetCharacterTransform(characterTransform);
// }
// Обработка и преобразование входных данных от персонажа // Обработка и преобразование входных данных от персонажа
public void SetInputs(ref CharacterInputs inputs) public void SetInputs(ref CharacterInputs inputs)
{ {
// Обновляем таймер перезарядки слайда // Обновляем таймер перезарядки слайда
_slideMechanic.TickCooldown(Time.deltaTime); _slideMechanic.TickCooldown(Time.deltaTime);
_wallClimbMechanic.TickCooldown(Time.deltaTime);
// Если активен слайд - игнорируем весь остальной ввод // Если активен слайд - игнорируем весь остальной ввод
if (_slideMechanic.IsSliding) if (_slideMechanic.IsSliding)
@@ -109,8 +149,7 @@ namespace Code.Gameplay.Character.Controller
// Обновление вращения персонажа на основе входных данных // Обновление вращения персонажа на основе входных данных
public void UpdateRotation(ref Quaternion currentRotation, float deltaTime) public void UpdateRotation(ref Quaternion currentRotation, float deltaTime)
{ {
// ВО ВРЕМЯ СЛАЙДА НЕ ОБНОВЛЯЕМ ВРАЩЕНИЕ - ПЕРСОНАЖ СМОТРИТ ПРЯМО if (_slideMechanic.IsSliding || _wallClimbMechanic.IsClimbingActive) return;
if (_slideMechanic.IsSliding) return;
switch (_currentCameraMode) switch (_currentCameraMode)
{ {
@@ -196,6 +235,11 @@ namespace Code.Gameplay.Character.Controller
{ {
_slideMechanic.EndSlide(); _slideMechanic.EndSlide();
} }
if (motor.GroundingStatus.IsStableOnGround)
{
_wallClimbMechanic.ResetWallClimbSession();
}
} }
// Метод вызывается после обновления персонажа // Метод вызывается после обновления персонажа
@@ -220,13 +264,8 @@ namespace Code.Gameplay.Character.Controller
public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint, public void OnMovementHit(Collider hitCollider, Vector3 hitNormal, Vector3 hitPoint,
ref HitStabilityReport hitStabilityReport) ref HitStabilityReport hitStabilityReport)
{ {
_wallClimbMechanic.OnMovementHit(motor, hitNormal); if (_wallClimbMechanic.TryClimbWall(motor, hitNormal))
_wallLeanMechanic.OnWallContact(motor, hitNormal, motor.TransientPosition.y);
var dotWithUp = Vector3.Dot(hitNormal, motor.CharacterUp);
if (Mathf.Abs(dotWithUp) <= _wallClimbMechanic.WallNormalThreshold)
{
_wallLeanMechanic.OnWallContact(hitNormal, motor.TransientPosition.y);
}
} }
// Обработка отчета о стабильности столкновения // Обработка отчета о стабильности столкновения
@@ -113,7 +113,7 @@ namespace Code.Gameplay.Character.Controller.Input
var cameraForward = cameraRotation * Vector3.forward; var cameraForward = cameraRotation * Vector3.forward;
// Проецируем на горизонтальную плоскость // Проецируем на горизонтальную плоскость
var horizontalForward = Vector3.ProjectOnPlane(cameraForward, motor.CharacterUp).normalized; var horizontalForward = Vector3.ProjectOnPlane(cameraForward, Vector3.up).normalized;
// Если проекция вырождена, используем текущее направление персонажа // Если проекция вырождена, используем текущее направление персонажа
if (horizontalForward.sqrMagnitude < 0.01f) if (horizontalForward.sqrMagnitude < 0.01f)
@@ -0,0 +1,60 @@
using Code.Gameplay.Camera;
using Code.Gameplay.Camera.CameraStates;
using Code.Gameplay.Character.Controller;
using Code.Gameplay.Player;
using Code.Input;
using Reflex.Attributes;
using UnityEngine;
namespace Code.Gameplay.Character.Core
{
public class CharacterProvider : MonoBehaviour
{
[Inject] private CameraStateMachine _cameraStateMachine; // Стейт-машина камеры (нужна для транзакций и т.п.)
[SerializeField] private CustomCharacterController customCharacterController; // Компонент управления персонажем
public CustomCharacterController CustomCharacterController => customCharacterController;
[SerializeField] private Transform cameraFollowPoint; // Точка следования камеры (уровень глаз для FirstPerson)
public Transform GetFollowTransform() => cameraFollowPoint;
[Inject] private IInputService _inputService; // Сервис ввода через DI
[SerializeField] private PlayerAnimator _animator;
public PlayerAnimator PlayerAnimator => _animator;
public void Teleport(Vector3 position, Quaternion rotation)
{
customCharacterController.SetPosition(position);
customCharacterController.SetRotation(rotation);
}
// Обработка ввода для движения персонажа
private void HandleCharacterInput()
{
// Создаем структуру ввода с полной информацией о камере
var inputs = new CharacterInputs();
// Получаем данные движения из Input System
var moveInput = _inputService.MoveInput;
inputs.MoveAxisForward = moveInput.y; // Vertical ось (W/S или Up/Down)
inputs.MoveAxisRight = moveInput.x; // Horizontal ось (A/D или Left/Right)
inputs.JumpPressed = _inputService.JumpPressed; // Прыжки (Space)
inputs.SprintPressed = true;//_inputService.SprintPressed; // Спринт (Shift)
inputs.SlidePressed = _inputService.SlidePressed; // Слайд (Ctrl)
inputs.CameraMode = ((ICameraState)_cameraStateMachine.CurrentBaseState).GetCameraMode();
// Передаем информацию о камере для адаптивного поведения
inputs.CameraRotation = ((BaseCameraState)_cameraStateMachine.CurrentBaseState).GetCameraRotation();
inputs.CameraPlanarDirection = ((BaseCameraState)_cameraStateMachine.CurrentBaseState).GetPlanarDirection();
// Передаем ввод в контроллер персонажа
customCharacterController.SetInputs(ref inputs);
}
// Обновление логики каждый кадр
private void Update()
{
// Обработка ввода для движения в Update (физика)
HandleCharacterInput();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b2d4b8256c1f4b3facf6b8d0a7d5256b
timeCreated: 1763217123
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b7ba7b62b1aa47c48dc82ac8d8e8530e
timeCreated: 1763548306
@@ -0,0 +1,23 @@
using DG.Tweening;
using UnityEngine;
namespace Code.Gameplay.Door
{
public class CinematicDoorOpening
{
public DamnDoor DamnDoor;
public Light DoorLight;
public void PreOpen(bool start)
{
DoorLight.DOColor(start ? Color.yellow : Color.red, 0.2f);
DamnDoor.Petlya.DORotate(new Vector3(0, -40, 0), 1f);
}
public void Close()
{
DamnDoor.Petlya.DORotate(new Vector3(0, 0, 0), 1f);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: deda0339570d44609dd62eafd9c6215f
timeCreated: 1763548908
@@ -0,0 +1,16 @@
using UnityEngine;
namespace Code.Gameplay.Door
{
public class DamnDoor : MonoBehaviour
{
[SerializeField] Rigidbody rigidbody;
[SerializeField] private Transform petlya;
public Transform Petlya => petlya;
public void SetPhysics(bool active)
{
rigidbody.isKinematic = active;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 50a6b5e332704611b19f5a209d4dbffe
timeCreated: 1763548314
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e41c28f7828a44b7bc26d87886064d99
timeCreated: 1763556651
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4911436131e345ada949f2418595bbd8
timeCreated: 1763559099
@@ -0,0 +1,20 @@
namespace Code.Gameplay.Orders.Order
{
public interface IOrderService
{
delegate void OrderProgressDelegate(float time);
event OrderProgressDelegate OnOrderGiven;
event OrderProgressDelegate OnOrderRecieved;
delegate void OrderDeliveredDelegate(int score, float time);
event OrderDeliveredDelegate OnOrderDelivered;
OrderState OrderState { get; }
void RoomPassed();
float DecreaseTimer(float delta);
void OrderGive();
void OrderRecieved();
void OrderDelivered();
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8b4467951c884c8dafeb633020696c24
timeCreated: 1763561686
@@ -0,0 +1,9 @@
namespace Code.Gameplay.Orders.Order
{
public interface IScoreService
{
int Score { get; }
void IncreaseScore(int amount);
void DecreaseScore(int amount);
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 64668c9ef4c441af84c635365cfbb2de
timeCreated: 1763559523
@@ -0,0 +1,68 @@
using System;
using Code.Configs;
using Code.Gameplay.Orders.Order;
using Cysharp.Threading.Tasks;
using Reflex.Attributes;
using UnityEngine;
namespace Code.Gameplay.Orders.Order
{
public class OrderBox : MonoBehaviour
{
[Inject] private IOrderService _orderService;
public Rigidbody rigidbody;
[SerializeField] private bool _pickupMode;
// [SerializeField] private AnimationCurve debugCurve;
//DEBUG
// private void Start()
// {
// _capturedPosition = transform.position;
// _floatingCurve = debugCurve;
// _curveLength = 1f;
// }
// DEBUG
private float _activationTime;
[Inject]
private void Construct(OrderBoxConfig config)
{
_floatingCurve = config.floatingCurve;
_activationTime = config.activationTime;
_curveLength = config.curveLength;
}
public void OnTriggerEnter(Collider other)
{
if (!_pickupMode) return;
_orderService.OrderRecieved();
Destroy(gameObject);
}
public async UniTaskVoid SwitchMode()
{
Debug.LogWarning("Activating");
await UniTask.WaitForSeconds(_activationTime);
Debug.LogWarning("Available");
_pickupMode = true;
rigidbody.isKinematic = true;
_capturedPosition = transform.position;
}
private Vector3 _capturedPosition;
private float _timeForMoving;
private AnimationCurve _floatingCurve;
private float _curveLength;
private void FixedUpdate()
{
if (!_pickupMode) return;
_timeForMoving += Time.fixedDeltaTime;
if (_timeForMoving > _curveLength) _timeForMoving = 0;
transform.position = _capturedPosition + new Vector3(0, _floatingCurve.Evaluate(_timeForMoving), 0);
Debug.Log(transform.position);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 067bc72af86a4fb8ac44d0c1fcfd25d5
timeCreated: 1763573681
@@ -0,0 +1,19 @@
using System;
using Reflex.Attributes;
using UnityEngine;
namespace Code.Gameplay.Orders.Order
{
public class OrderDeliveryTrigger : MonoBehaviour
{
[Inject] private IOrderService _orderService;
private bool _playerEntered;
private void OnTriggerEnter(Collider other)
{
if (_playerEntered) return;
_playerEntered = true;
_orderService.OrderDelivered();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 47fbefab729047e5a11d8761e26f75a6
timeCreated: 1763737623
@@ -0,0 +1,31 @@
using DG.Tweening;
using UnityEngine;
namespace Code.Gameplay.Orders.Order
{
public class OrderDispenser : MonoBehaviour
{
[SerializeField] private Transform hatch;
[SerializeField] private OrderBox order;
private bool _activated;
public void ThrowOrder()
{
hatch.DORotate(new Vector3(-130f, 0, 0), 0.2f);
order.rigidbody.isKinematic = false;
order.rigidbody.AddForce(-transform.forward * 10f, ForceMode.Impulse);
}
// DEBUG TODO ДИМКА УДАЛИ И ПРОПИШИ В СВОЕЙ ЛОГИКЕ
public void OnTriggerEnter(Collider other)
{
if(_activated) return;
_activated = true;
ThrowOrder();
order.SwitchMode();
}
// DEBUG
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e50e3c42f5ee45e0b1087e0dbf7dd0f4
timeCreated: 1763556675
@@ -0,0 +1,18 @@
using Reflex.Attributes;
using UnityEngine;
namespace Code.Gameplay.Orders.Order
{
public class OrderGiveTrigger : MonoBehaviour
{
[Inject] private IOrderService _orderService;
private bool _playerEntered;
private void OnTriggerEnter(Collider other)
{
if (_playerEntered) return;
_playerEntered = true;
_orderService.OrderGive();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d3966e4798d243abba9d85b9ad8aef33
timeCreated: 1763742374
@@ -0,0 +1,61 @@
using Code.Audio;
using Code.Configs;
using UnityEngine;
namespace Code.Gameplay.Orders.Order
{
public class OrderService : IOrderService
{
public event IOrderService.OrderProgressDelegate OnOrderGiven;
public event IOrderService.OrderProgressDelegate OnOrderRecieved;
public event IOrderService.OrderDeliveredDelegate OnOrderDelivered;
private OrderState _orderState;
public OrderState OrderState => _orderState;
private float _deliveryTimer = 0.0f;
private Vector2 _timeBounds;
private float _koefRooms, _koefOvertime;
private int _roomsPassed;
public OrderService(OrderServiceConfig config)
{
_orderState = OrderState.Delivered;
_timeBounds = config.timeBounds;
_koefRooms = config.koefRooms;
_koefOvertime = config.koefOvertime;
}
public void RoomPassed() => _roomsPassed++;
public float DecreaseTimer(float delta)
{
return _deliveryTimer -= delta;
}
public void OrderGive()
{
_orderState = OrderState.Given;
_roomsPassed = 0;
_deliveryTimer = Random.Range(_timeBounds.x, _timeBounds.y);
OnOrderGiven?.Invoke(_deliveryTimer);
}
public void OrderRecieved()
{
_orderState = OrderState.Recieved;
OnOrderRecieved?.Invoke(_deliveryTimer);
}
public void OrderDelivered()
{
_orderState = OrderState.Delivered;
int score = (int)(_koefRooms * _roomsPassed + _deliveryTimer * _koefOvertime);
OnOrderDelivered?.Invoke(score, _deliveryTimer);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b324c2a1be1546868cddf779445b286a
timeCreated: 1763559110
@@ -0,0 +1,9 @@
namespace Code.Gameplay.Orders.Order
{
public enum OrderState
{
Delivered,
Given,
Recieved,
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0a8980a0cc034110ab3ccd948d40956b
timeCreated: 1763559535
@@ -0,0 +1,11 @@
namespace Code.Gameplay.Orders.Order
{
public class ScoreService : IScoreService
{
private int _score;
public int Score => _score;
public void IncreaseScore(int amount) => _score += amount;
public void DecreaseScore(int amount) => _score -= amount;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 619f2425460843aaa1f0f21e302158ce
timeCreated: 1763559528
@@ -0,0 +1,9 @@
using UnityEngine;
namespace Code.Gameplay.Player
{
public class ArmsMeshProvider : MonoBehaviour
{
[SerializeField] public Animator ArmsAnimator;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cfe65f613bc54b4098acdba0d3fdd2a2
timeCreated: 1763730814
@@ -1,8 +1,17 @@
using System;
using Code.Gameplay.Character.Core;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Code.Gameplay.Player namespace Code.Gameplay.Player
{ {
public interface IPlayerFactory public interface IPlayerFactory
{ {
PlayerHealth CreatePlayerHealth(int count = -1); PlayerHealth CreatePlayerHealth(int count = -1);
PlayerMoney CreatePlayerMoney(int count = 0); PlayerMoney CreatePlayerMoney(int count = 0);
UniTask<CharacterProvider> CreatePlayer();
void ReleasePlayer(CharacterProvider characterProvider);
UniTask<ArmsMeshProvider> CreateArms(Transform papochka);
void ReleaseArms(ArmsMeshProvider arms);
} }
} }
@@ -0,0 +1,24 @@
using KinematicCharacterController;
using UnityEngine;
namespace Code.Gameplay.Player
{
public class PlayerAnimator : MonoBehaviour
{
private static readonly int Velocity = Animator.StringToHash("Velocity");
private Animator _playerAnimator;
public void SetAnimator(Animator animator) => _playerAnimator = animator;
[SerializeField] private KinematicCharacterMotor kinematicCharacterMotor;
private void SetVelocity(float velocity)
{
_playerAnimator.SetFloat(Velocity, velocity);
}
private void Update()
{
SetVelocity(kinematicCharacterMotor.Velocity.magnitude);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2f94efbea729423596ee5c6ee2366c98
timeCreated: 1763220863
@@ -1,13 +1,20 @@
using UnityEngine; using UnityEngine;
using Code.Configs; using Code.Configs;
using Code.Gameplay.Character.Core;
using Cysharp.Threading.Tasks;
using Reflex.Attributes; using Reflex.Attributes;
using Reflex.Core;
using Reflex.Extensions;
using Reflex.Injectors;
using UnityEngine.AddressableAssets;
using UnityEngine.SceneManagement;
namespace Code.Gameplay.Player namespace Code.Gameplay.Player
{ {
public class PlayerFactory : IPlayerFactory public class PlayerFactory : IPlayerFactory
{ {
[Inject] PlayerConfig _playerConfig; [Inject] PlayerConfig _playerConfig;
public PlayerHealth CreatePlayerHealth(int count = -1) public PlayerHealth CreatePlayerHealth(int count = -1)
{ {
if (count < 0) count = _playerConfig.maxHealth; if (count < 0) count = _playerConfig.maxHealth;
@@ -15,5 +22,21 @@ namespace Code.Gameplay.Player
return new(count); return new(count);
} }
public PlayerMoney CreatePlayerMoney(int count = 0) => new(count); public PlayerMoney CreatePlayerMoney(int count = 0) => new(count);
public async UniTask<CharacterProvider> CreatePlayer()
{
CharacterProvider characterProvider = (await Addressables.InstantiateAsync(_playerConfig.characterPrefab).ToUniTask()).GetComponent<CharacterProvider>();
AttributeInjector.Inject(characterProvider, Container.ProjectContainer);
AttributeInjector.Inject(characterProvider.CustomCharacterController, Container.ProjectContainer);
return characterProvider;
}
public void ReleasePlayer(CharacterProvider characterProvider)
{
Addressables.ReleaseInstance(characterProvider.gameObject);
}
public async UniTask<ArmsMeshProvider> CreateArms(Transform papochka) => (await Addressables.InstantiateAsync(_playerConfig.armsMeshPrefab, papochka).ToUniTask()).GetComponent<ArmsMeshProvider>();
public void ReleaseArms(ArmsMeshProvider arms) => Addressables.ReleaseInstance(arms.gameObject);
} }
} }
@@ -1,3 +1,4 @@
using Code.Gameplay.Orders.Order;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization; using UnityEngine.Serialization;
@@ -7,10 +8,14 @@ namespace Code.Scenes.SceneEnvironments
public class GameplaySceneEnvironment : CurrentSceneEnvironment public class GameplaySceneEnvironment : CurrentSceneEnvironment
{ {
[FormerlySerializedAs("sfxTarget")] public Transform debugSfxTarget; [FormerlySerializedAs("sfxTarget")] public Transform debugSfxTarget;
public Transform playerSpawnPoint;
public OrderDispenser debugTube;
public void TransitVariables(GameplaySceneEnvironment env) public void TransitVariables(GameplaySceneEnvironment env)
{ {
debugSfxTarget = env.debugSfxTarget; debugSfxTarget = env.debugSfxTarget;
playerSpawnPoint = env.playerSpawnPoint;
debugTube = env.debugTube;
} }
} }
} }
@@ -1,18 +1,21 @@
using Code.Gameplay.Door;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization; using UnityEngine.Experimental.GlobalIllumination;
namespace Code.Scenes.SceneEnvironments namespace Code.Scenes.SceneEnvironments
{ {
[System.Serializable] [System.Serializable]
public class MainMenuEnvironment : CurrentSceneEnvironment public class MainMenuEnvironment : CurrentSceneEnvironment
{ {
public Transform cameraTarget;
public Transform cameraPosition; public Transform cameraPosition;
public DamnDoor damnDoor;
public Light doorLight;
public void TransitVariables(MainMenuEnvironment env) public void TransitVariables(MainMenuEnvironment env)
{ {
cameraTarget = env.cameraTarget;
cameraPosition = env.cameraPosition; cameraPosition = env.cameraPosition;
damnDoor = env.damnDoor;
doorLight = env.doorLight;
} }
} }
} }
@@ -30,7 +30,7 @@ namespace Code.Scenes
callBack?.Invoke(); callBack?.Invoke();
} }
public async UniTask LoadSceneAsyncAwaitable(int sceneId, float waitFor = 0) public async UniTask LoadSceneAsyncAwaitable(int sceneId, float waitFor = 0f)
{ {
await UniTask.WhenAll( await UniTask.WhenAll(
UniTask.Delay(TimeSpan.FromSeconds(waitFor)), UniTask.Delay(TimeSpan.FromSeconds(waitFor)),
@@ -21,6 +21,8 @@ namespace Code.StaticData
SFXListConfig SFXListConfig { get; } SFXListConfig SFXListConfig { get; }
DispatcherSoundListConfig DispatcherSoundListConfig { get; } DispatcherSoundListConfig DispatcherSoundListConfig { get; }
EnemiesSoundListConfig EnemiesSoundListConfig { get; } EnemiesSoundListConfig EnemiesSoundListConfig { get; }
OrderServiceConfig OrderServiceConfig { get; }
OrderBoxConfig OrderBoxConfig { get; }
void Load(); void Load();
Task<T> InstantiateAsset<T>(AssetReference assetReference) where T : Behaviour; Task<T> InstantiateAsset<T>(AssetReference assetReference) where T : Behaviour;
} }
@@ -20,6 +20,8 @@ namespace Code.StaticData
public SFXListConfig SFXListConfig { get; private set; } public SFXListConfig SFXListConfig { get; private set; }
public DispatcherSoundListConfig DispatcherSoundListConfig { get; private set; } public DispatcherSoundListConfig DispatcherSoundListConfig { get; private set; }
public EnemiesSoundListConfig EnemiesSoundListConfig { get; private set; } public EnemiesSoundListConfig EnemiesSoundListConfig { get; private set; }
public OrderServiceConfig OrderServiceConfig { get; private set; }
public OrderBoxConfig OrderBoxConfig { get; private set; }
public void Load() public void Load()
{ {
@@ -29,6 +31,8 @@ namespace Code.StaticData
CharacterConfig = Resources.Load<CharacterConfig>(string.Format(StringPaths.ConfigSingle, "App", "CharacterConfig")); CharacterConfig = Resources.Load<CharacterConfig>(string.Format(StringPaths.ConfigSingle, "App", "CharacterConfig"));
UIConfig = Resources.Load<UIConfig>(string.Format(StringPaths.ConfigSingle, "App", "UIConfig")); UIConfig = Resources.Load<UIConfig>(string.Format(StringPaths.ConfigSingle, "App", "UIConfig"));
PlayerConfig = Resources.Load<PlayerConfig>(string.Format(StringPaths.ConfigSingle, "App", "PlayerConfig")); PlayerConfig = Resources.Load<PlayerConfig>(string.Format(StringPaths.ConfigSingle, "App", "PlayerConfig"));
OrderServiceConfig = Resources.Load<OrderServiceConfig>(string.Format(StringPaths.ConfigSingle, "Gameplay", "OrderServiceConfig"));
OrderBoxConfig = Resources.Load<OrderBoxConfig>(string.Format(StringPaths.ConfigSingle, "Gameplay", "OrderBoxConfig"));
LoadAudioConfigs(); LoadAudioConfigs();
} }
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 14bf9dd380324bf49ea98fbeb8c94186
timeCreated: 1763550884
@@ -0,0 +1,16 @@
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Code.UI.Panels.Etc
{
public class HoverButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
public Button button;
public Action OnPointerEnterEvent, OnPointerExitEvent;
public void OnPointerEnter(PointerEventData eventData) => OnPointerEnterEvent?.Invoke();
public void OnPointerExit(PointerEventData eventData) => OnPointerExitEvent?.Invoke();
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f97de34a1f6042128921ad728f153909
timeCreated: 1763550895
@@ -2,10 +2,9 @@ using Code.Gameplay.Player;
using DG.Tweening; using DG.Tweening;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI; using UnityEngine.UI;
namespace Code.UI namespace Code.UI.Panels
{ {
public class GameplayPanel : UIElement public class GameplayPanel : UIElement
{ {
@@ -16,6 +15,7 @@ namespace Code.UI
[SerializeField] private float dispatcherTransitionTime = 0.5f; [SerializeField] private float dispatcherTransitionTime = 0.5f;
[Header("Timer")] [Header("Timer")]
[SerializeField] private TMP_Text timer; [SerializeField] private TMP_Text timer;
public TMP_Text Timer => timer;
[Header("HealthBar")] [Header("HealthBar")]
[SerializeField] private Image healthBar; [SerializeField] private Image healthBar;
[Header("MoneyBar")] [Header("MoneyBar")]
@@ -41,11 +41,6 @@ namespace Code.UI
health.OnDamage += HealthUpdate; health.OnDamage += HealthUpdate;
HealthUpdate(0,health); HealthUpdate(0,health);
} }
private void Update()
{
timer.text = Time.deltaTime.ToString();
}
public void SummonDispatcher() public void SummonDispatcher()
{ {
// TODO // TODO
@@ -1,12 +1,22 @@
using UnityEngine; using Code.Gameplay.Door;
using UnityEngine.UI; using Code.UI.Panels.Etc;
namespace Code.UI namespace Code.UI.Panels
{ {
public class MainMenuPanel : UIElement public class MainMenuPanel : UIElement
{ {
public Button startButton; public HoverButton startButton;
public Button exitButton; public HoverButton exitButton;
public CinematicDoorOpening CinematicDoorOpening;
public void Start()
{
startButton.OnPointerEnterEvent = OpenStart;
exitButton.OnPointerEnterEvent = OpenExit;
startButton.OnPointerExitEvent = CloseDoor;
exitButton.OnPointerExitEvent = CloseDoor;
}
public override void Show() public override void Show()
{ {
} }
@@ -14,5 +24,18 @@ namespace Code.UI
public override void Hide() public override void Hide()
{ {
} }
private void OpenExit()
{
CinematicDoorOpening.PreOpen(false);
}
private void OpenStart()
{
CinematicDoorOpening.PreOpen(true);
}
private void CloseDoor()
{
CinematicDoorOpening.Close();
}
} }
} }
@@ -52,6 +52,39 @@ AudioMixerEffectController:
m_SendTarget: {fileID: 0} m_SendTarget: {fileID: 0}
m_EnableWetMix: 0 m_EnableWetMix: 0
m_Bypass: 0 m_Bypass: 0
--- !u!245 &-5566153147845745614
AudioMixerSnapshotController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Menu
m_AudioMixer: {fileID: 24100000}
m_SnapshotID: ae02c0612d44bfd459883c67f6dab857
m_FloatValues:
b9fc0df121fe7134e9cbd35aa5a65755: 0.10800299
ddab7e07de3c686e296ff10b1cd77a47: -80
dd0b3fe80d006124baa36e791e6953f0: -80
m_TransitionOverrides: {}
--- !u!243 &-5282050360126310577
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Menu
m_AudioMixer: {fileID: 24100000}
m_GroupID: af6d3dead2e9e4848a2ca2fa55634108
m_Children: []
m_Volume: b9fc0df121fe7134e9cbd35aa5a65755
m_Pitch: 3cdebfce079b3864f93ef55f8bc453ae
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 5712107256638894671}
m_UserColorIndex: 0
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &-4235790927912365957 --- !u!243 &-4235790927912365957
AudioMixerGroupController: AudioMixerGroupController:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -64,6 +97,7 @@ AudioMixerGroupController:
m_Children: m_Children:
- {fileID: 1469200815455588746} - {fileID: 1469200815455588746}
- {fileID: 9214955797390454771} - {fileID: 9214955797390454771}
- {fileID: -5282050360126310577}
m_Volume: 4c469b14481ac855fb9fb2989e6e6b94 m_Volume: 4c469b14481ac855fb9fb2989e6e6b94
m_Pitch: f5433a3ce2d2313f2b2d52521d9fa5bd m_Pitch: f5433a3ce2d2313f2b2d52521d9fa5bd
m_Send: 00000000000000000000000000000000 m_Send: 00000000000000000000000000000000
@@ -119,6 +153,8 @@ AudioMixerSnapshotController:
m_AudioMixer: {fileID: 24100000} m_AudioMixer: {fileID: 24100000}
m_SnapshotID: 6d6b0cfa14637d5f0a34277934971c34 m_SnapshotID: 6d6b0cfa14637d5f0a34277934971c34
m_FloatValues: m_FloatValues:
b9fc0df121fe7134e9cbd35aa5a65755: -80
4c469b14481ac855fb9fb2989e6e6b94: -14.221897
ddab7e07de3c686e296ff10b1cd77a47: -80 ddab7e07de3c686e296ff10b1cd77a47: -80
m_TransitionOverrides: {} m_TransitionOverrides: {}
--- !u!241 &24100000 --- !u!241 &24100000
@@ -134,6 +170,7 @@ AudioMixerController:
- {fileID: 8341788112416184532} - {fileID: 8341788112416184532}
- {fileID: -1214924791136564940} - {fileID: -1214924791136564940}
- {fileID: 24500006} - {fileID: 24500006}
- {fileID: -5566153147845745614}
m_StartSnapshot: {fileID: 8341788112416184532} m_StartSnapshot: {fileID: 8341788112416184532}
m_SuspendThreshold: -80 m_SuspendThreshold: -80
m_EnableSuspend: 1 m_EnableSuspend: 1
@@ -150,6 +187,7 @@ AudioMixerController:
- 9bd058bbb94358d33a130fd50e352c2d - 9bd058bbb94358d33a130fd50e352c2d
- e04cdd7cb505ba69ea76a16038de727a - e04cdd7cb505ba69ea76a16038de727a
- 9eb64ac0ca0e2f1098eafbba1f9633f5 - 9eb64ac0ca0e2f1098eafbba1f9633f5
- af6d3dead2e9e4848a2ca2fa55634108
name: View name: View
m_CurrentViewIndex: 0 m_CurrentViewIndex: 0
m_TargetSnapshot: {fileID: -1214924791136564940} m_TargetSnapshot: {fileID: -1214924791136564940}
@@ -199,6 +237,7 @@ AudioMixerSnapshotController:
m_AudioMixer: {fileID: 24100000} m_AudioMixer: {fileID: 24100000}
m_SnapshotID: bdbaa2a61b8857f568cd42dafa5c4811 m_SnapshotID: bdbaa2a61b8857f568cd42dafa5c4811
m_FloatValues: m_FloatValues:
b9fc0df121fe7134e9cbd35aa5a65755: -80
dd0b3fe80d006124baa36e791e6953f0: -80 dd0b3fe80d006124baa36e791e6953f0: -80
m_TransitionOverrides: {} m_TransitionOverrides: {}
--- !u!244 &671806689151419646 --- !u!244 &671806689151419646
@@ -272,6 +311,20 @@ AudioMixerGroupController:
m_Mute: 0 m_Mute: 0
m_Solo: 0 m_Solo: 0
m_BypassEffects: 0 m_BypassEffects: 0
--- !u!244 &5712107256638894671
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 8d1dc8039a4095e439a61f34c4e7f3a6
m_EffectName: Attenuation
m_MixLevel: fdc182acd523a7247a98663cce44aca2
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &5996723691131988381 --- !u!244 &5996723691131988381
AudioMixerEffectController: AudioMixerEffectController:
m_ObjectHideFlags: 3 m_ObjectHideFlags: 3
@@ -13,3 +13,15 @@ MonoBehaviour:
m_Name: PlayerConfig m_Name: PlayerConfig
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.PlayerConfig m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.PlayerConfig
maxHealth: 4 maxHealth: 4
characterPrefab:
m_AssetGUID: 81844a99f5b786b41b831174f8fb6d3a
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
armsMeshPrefab:
m_AssetGUID: 1d4767c722c05b5d6b96bb226d378c65
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
@@ -13,12 +13,32 @@ MonoBehaviour:
m_Name: SoundtrackListConfig m_Name: SoundtrackListConfig
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.SoundtrackListConfig m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.SoundtrackListConfig
peacefulSoundtrack: peacefulSoundtrack:
- m_AssetGUID: 803e40b883c823b89a91aa8b9d9fc483
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
- m_AssetGUID: ebe18293a5ef86704b23dad3a1786476
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
- m_AssetGUID: 803e40b883c823b89a91aa8b9d9fc483 - m_AssetGUID: 803e40b883c823b89a91aa8b9d9fc483
m_SubObjectName: m_SubObjectName:
m_SubObjectType: m_SubObjectType:
m_SubObjectGUID: m_SubObjectGUID:
m_EditorAssetChanged: 0 m_EditorAssetChanged: 0
actionSoundtrack: actionSoundtrack:
- m_AssetGUID: ebe18293a5ef86704b23dad3a1786476
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
- m_AssetGUID: f4b6fa54ecac6cc418f98824491aa17a
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
- m_AssetGUID: ebe18293a5ef86704b23dad3a1786476 - m_AssetGUID: ebe18293a5ef86704b23dad3a1786476
m_SubObjectName: m_SubObjectName:
m_SubObjectType: m_SubObjectType:
@@ -35,3 +55,8 @@ MonoBehaviour:
m_SubObjectType: m_SubObjectType:
m_SubObjectGUID: m_SubObjectGUID:
m_EditorAssetChanged: 0 m_EditorAssetChanged: 0
- m_AssetGUID: ebe18293a5ef86704b23dad3a1786476
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
@@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 9ce1e20f4ee9be6709bf9022546bcb07 guid: 09d8a07b00c1aa2f883b2aeb975d70e6
folderAsset: yes folderAsset: yes
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
@@ -0,0 +1,49 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6af4f53d425a41c78ef889fd7e5c3197, type: 3}
m_Name: OrderBoxConfig
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.OrderBoxConfig
activationTime: 2
floatingCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 1.4374113
outSlope: 1.4374113
tangentMode: 34
weightedMode: 0
inWeight: 0
outWeight: 0.33333334
- serializedVersion: 3
time: 0.48992503
value: 0.70422375
inSlope: 0.028391719
outSlope: 0.028391719
tangentMode: 34
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: -1.3806279
outSlope: -1.3806279
tangentMode: 34
weightedMode: 0
inWeight: 0.33333334
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
curveLength: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 15fc4dd72b7b0ac0c9210a07f70b4007
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 95639b2744d24b66842ac3d71d056129, type: 3}
m_Name: OrderFactoryConfig
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.OrderFactoryConfig
orderDispenserPrefab:
m_AssetGUID: 751890caa1647ec6689f24933fbcb770
m_SubObjectName:
m_SubObjectType:
m_SubObjectGUID:
m_EditorAssetChanged: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 38984bc3c0ffd57a0a88f0da6f96e470
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,17 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ee2550c3e4874575ac3aecadfcc42475, type: 3}
m_Name: OrderServiceConfig
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.OrderServiceConfig
timeBounds: {x: 35, y: 120}
koefRooms: 2
koefOvertime: 4
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a35867b942225319bb9c26db15511aaf
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ea834c69fe90d8e49bad8e442f6c6c10
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,143 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-6588756662626244699
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: BrokenGlass
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _METALLICSPECGLOSSMAP
- _NORMALMAP
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 2800000, guid: 99173a3d6c57b684092fd9337698a8ca, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 2800000, guid: 3509dc26fef37ae428cc161123fee273, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 99173a3d6c57b684092fd9337698a8ca, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 2800000, guid: 83f28ba9fdcc0b4409c68035e86b1ba7, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 10
- _DstBlendAlpha: 10
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 1
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 1
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 81aeb792a79652a4eb63f1c13b35df81
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 99173a3d6c57b684092fd9337698a8ca
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 83f28ba9fdcc0b4409c68035e86b1ba7
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 3509dc26fef37ae428cc161123fee273
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 1
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 3ee47ed90e9fd6544a0d73d346d961bd
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d1a116be9de56ab478b336f2f9bf71fd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,145 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-7087650524991133240
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: CeilingLight
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _ALPHATEST_ON
- _EMISSION
- _METALLICSPECGLOSSMAP
- _NORMALMAP
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 2800000, guid: b881f58eda49f62478fc9af73b2e5c1c, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 2800000, guid: d2bfd34eeb9004547b0360fcbe07105e, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 2800000, guid: 7b926c2412eb5954496c1c8452d605a5, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: b881f58eda49f62478fc9af73b2e5c1c, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 2800000, guid: e5019b64e8028884c94845040087787a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 1
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 10
- _DstBlendAlpha: 10
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 1
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 19.468575, g: 19.468575, b: 19.468575, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2253ec50ce35f2049a05c74de63bac61
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,141 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-4673831484392324216
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: CeilingLightTransparency
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 2800000, guid: c648e149cc3e5a54d89c335b99ea8f76, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: c648e149cc3e5a54d89c335b99ea8f76, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 10
- _DstBlendAlpha: 10
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 1
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 134fccd9aec5516499dfa45c5177e043
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large. Load diff
Loaded 100 of 332 files, more files were not shown because too many files have changed in this diff. Show more