files arranged using assembly defn
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e038eb1e2eab0dd48b3db937423ef8df
|
||||
guid: 5fbb74ed5f48ea64abc7ff053d7b5b8c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 303657b881c5c104fabb7c2d58e364ae
|
||||
guid: 33d67dc68c4487f40a585c596dc62588
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a2a7540ec4650c74fbbf276d68fcb924
|
||||
guid: ae96029c413659442bc9dfae591d7dd0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
19
Assets/DarkMatter/Code/App/AppAssembly.asmdef
Normal file
19
Assets/DarkMatter/Code/App/AppAssembly.asmdef
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "AppAssembly",
|
||||
"rootNamespace": "Darkmatter.App",
|
||||
"references": [
|
||||
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
|
||||
"GUID:8bce7b1d1a7647841855dfbbfa883cd6",
|
||||
"GUID:219208e14f3a1e1439abafd1ff0ae402",
|
||||
"GUID:09dab6049e43dd9449335e6d3f51f72e"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
7
Assets/DarkMatter/Code/App/AppAssembly.asmdef.meta
Normal file
7
Assets/DarkMatter/Code/App/AppAssembly.asmdef.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b6de5042500932e4fb9947238e0adf85
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99443897285b5bb4eb395149cc29a38d
|
||||
guid: 2ee06f964ff582940853d02f865be2aa
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
43
Assets/DarkMatter/Code/App/Installers/GameLifetimeScope.cs
Normal file
43
Assets/DarkMatter/Code/App/Installers/GameLifetimeScope.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using Darkmatter.Core;
|
||||
using Darkmatter.Domain;
|
||||
using Darkmatter.Presentation;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
using VContainer.Unity;
|
||||
|
||||
namespace Darkmatter.App
|
||||
{
|
||||
public class GameLifetimeScope : LifetimeScope
|
||||
{
|
||||
[SerializeField] private PlatformPool pool;
|
||||
[SerializeField] private PlatformManager manager;
|
||||
[SerializeField] private InputReaderSO inputReader;
|
||||
[SerializeField] private GameSessionSO gameSession;
|
||||
[SerializeField] private Player player;
|
||||
[SerializeField] private AudioController audioController;
|
||||
|
||||
//UI References
|
||||
[SerializeField] private GameScreenView gameScreenView;
|
||||
[SerializeField] private StartScreenView startScreenView;
|
||||
[SerializeField] private DeathScreenView deathScreenView;
|
||||
[SerializeField] private PauseScreenView pauseScreenView;
|
||||
protected override void Configure(IContainerBuilder builder)
|
||||
{
|
||||
builder.RegisterComponent(pool).As<IPool<Platform>>();
|
||||
builder.RegisterComponent(manager).As<IPlatformManager>();
|
||||
builder.RegisterInstance(inputReader).As<IInputReader>();
|
||||
builder.Register<ScoreService>(Lifetime.Singleton).As<IScoreService>();
|
||||
builder.RegisterInstance<GameSessionSO>(gameSession).As<IGameSession>();
|
||||
builder.RegisterComponent(player).As<IPlayer>();
|
||||
builder.RegisterComponent(audioController).As<IAudioController>().AsSelf();
|
||||
|
||||
|
||||
builder.RegisterEntryPoint<StartScreenController>(Lifetime.Singleton).WithParameter(startScreenView);
|
||||
builder.Register<GameScreenController>(Lifetime.Singleton).WithParameter(gameScreenView).As<IGameScreenController>();
|
||||
builder.Register<PauseScreenController>(Lifetime.Singleton).WithParameter(pauseScreenView).As<IPauseScreenController>();
|
||||
builder.Register<DeathScreenController>(Lifetime.Singleton).WithParameter(deathScreenView).As<IDeathScreenController>();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 383ae0131df62e7439a21c411e0abe2e
|
||||
8
Assets/DarkMatter/Code/Core.meta
Normal file
8
Assets/DarkMatter/Code/Core.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d7f41092f556507488a9186282d29b28
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DarkMatter/Code/Core/Attributes.meta
Normal file
8
Assets/DarkMatter/Code/Core/Attributes.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f4dca5c9b94134b4b99d27d3e46f3b47
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -2,7 +2,7 @@
|
||||
// <auto-generated>
|
||||
// This code was auto-generated by com.unity.inputsystem:InputActionCodeGenerator
|
||||
// version 1.16.0
|
||||
// from Assets/Scripts/Input/GameInputAction.inputactions
|
||||
// from Assets/DarkMatter/Code/Core/Attributes/GameInputAction.inputactions
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
@@ -16,7 +16,7 @@ using UnityEngine.InputSystem;
|
||||
using UnityEngine.InputSystem.Utilities;
|
||||
|
||||
/// <summary>
|
||||
/// Provides programmatic access to <see cref="InputActionAsset" />, <see cref="InputActionMap" />, <see cref="InputAction" /> and <see cref="InputControlScheme" /> instances defined in asset "Assets/Scripts/Input/GameInputAction.inputactions".
|
||||
/// Provides programmatic access to <see cref="InputActionAsset" />, <see cref="InputActionMap" />, <see cref="InputAction" /> and <see cref="InputControlScheme" /> instances defined in asset "Assets/DarkMatter/Code/Core/Attributes/GameInputAction.inputactions".
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class is source generated and any manual edits will be discarded if the associated asset is reimported or modified.
|
||||
8
Assets/DarkMatter/Code/Core/Contracts.meta
Normal file
8
Assets/DarkMatter/Code/Core/Contracts.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3df043bef9f9e3b4d9fbe298cab649e1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
17
Assets/DarkMatter/Code/Core/Contracts/IAudioController.cs
Normal file
17
Assets/DarkMatter/Code/Core/Contracts/IAudioController.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IAudioController
|
||||
{
|
||||
void PlayJumpSound();
|
||||
void PlayDeathSound();
|
||||
void PlayBtnPressedSound();
|
||||
void PlayScoredSound();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba1cb4ebd3658324c948dc5c3f1d3a2c
|
||||
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IDeathScreenController
|
||||
{
|
||||
void ShowDeathScreen();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7af2cae0d2a1c1f4bb8e5aa5ad630ea1
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IGameScreenController
|
||||
{
|
||||
void ShowGameScreen();
|
||||
void HideGameScreen();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c61899447bb6d694a93759306dee0f6d
|
||||
10
Assets/DarkMatter/Code/Core/Contracts/IGameSession.cs
Normal file
10
Assets/DarkMatter/Code/Core/Contracts/IGameSession.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IGameSession
|
||||
{
|
||||
bool showStartScreen { get; set; }
|
||||
bool hasGameStarted { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf4fa3bea06bcae478439f5e33b2e683
|
||||
16
Assets/DarkMatter/Code/Core/Contracts/IInputReader.cs
Normal file
16
Assets/DarkMatter/Code/Core/Contracts/IInputReader.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IInputReader
|
||||
{
|
||||
event Action<Vector2> OnDragValueChanged;
|
||||
bool isMouseButtonPressed { get; }
|
||||
Vector2 dragInput { get; }
|
||||
|
||||
void LockInput();
|
||||
void UnlockInput();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3694572af73cf5344988658907712552
|
||||
@@ -0,0 +1,9 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IPauseScreenController
|
||||
{
|
||||
void ShowPauseScreen();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 531a3cefcdec354409ef858b5ea7fb55
|
||||
12
Assets/DarkMatter/Code/Core/Contracts/IPlatform.cs
Normal file
12
Assets/DarkMatter/Code/Core/Contracts/IPlatform.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IPlatform
|
||||
{
|
||||
List<GameObject> platformPiece { get; }
|
||||
Material safeMaterial { get; }
|
||||
Material deathMaterial { get; }
|
||||
}
|
||||
}
|
||||
2
Assets/DarkMatter/Code/Core/Contracts/IPlatform.cs.meta
Normal file
2
Assets/DarkMatter/Code/Core/Contracts/IPlatform.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bfc0615b9e0d4094fa7f57342f9ba6fd
|
||||
@@ -0,0 +1,9 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IPlatformManager
|
||||
{
|
||||
void BuildNewPlatform();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6f4ca9d11e511cc4897f702ce62c2663
|
||||
9
Assets/DarkMatter/Code/Core/Contracts/IPlatformRule.cs
Normal file
9
Assets/DarkMatter/Code/Core/Contracts/IPlatformRule.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IPlatformRule
|
||||
{
|
||||
public void Execute(IPlatform platform);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea78e7f773196344bbc9745acf4b5687
|
||||
13
Assets/DarkMatter/Code/Core/Contracts/IPlayer.cs
Normal file
13
Assets/DarkMatter/Code/Core/Contracts/IPlayer.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IPlayer
|
||||
{
|
||||
bool isDead { get; }
|
||||
}
|
||||
}
|
||||
2
Assets/DarkMatter/Code/Core/Contracts/IPlayer.cs.meta
Normal file
2
Assets/DarkMatter/Code/Core/Contracts/IPlayer.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 833de72b91bdfba49997116bd87a298e
|
||||
15
Assets/DarkMatter/Code/Core/Contracts/IPool.cs
Normal file
15
Assets/DarkMatter/Code/Core/Contracts/IPool.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
using Codice.Client.Common;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IPool <T>
|
||||
{
|
||||
IReadOnlyCollection<T> All { get; }
|
||||
void ReturnToPool(T obj);
|
||||
|
||||
T GetFromPool();
|
||||
}
|
||||
}
|
||||
2
Assets/DarkMatter/Code/Core/Contracts/IPool.cs.meta
Normal file
2
Assets/DarkMatter/Code/Core/Contracts/IPool.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e8dc86ecbdfd4124595da34516170d7b
|
||||
13
Assets/DarkMatter/Code/Core/Contracts/IScoreService.cs
Normal file
13
Assets/DarkMatter/Code/Core/Contracts/IScoreService.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public interface IScoreService
|
||||
{
|
||||
int score { get; }
|
||||
int highScore { get; }
|
||||
event Action<int> OnScoreChange;
|
||||
void AddScore();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 726a4c255e8801a4aad700838e98c10e
|
||||
18
Assets/DarkMatter/Code/Core/CoreAssembly.asmdef
Normal file
18
Assets/DarkMatter/Code/Core/CoreAssembly.asmdef
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "CoreAssembly",
|
||||
"rootNamespace": "Darkmatter.Core",
|
||||
"references": [
|
||||
"GUID:4307f53044263cf4b835bd812fc161a4",
|
||||
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
|
||||
"GUID:75469ad4d38634e559750d17036d5f7c"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
7
Assets/DarkMatter/Code/Core/CoreAssembly.asmdef.meta
Normal file
7
Assets/DarkMatter/Code/Core/CoreAssembly.asmdef.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8bce7b1d1a7647841855dfbbfa883cd6
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DarkMatter/Code/Core/Data.meta
Normal file
8
Assets/DarkMatter/Code/Core/Data.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d0d0a4ccc5826854b9cb0cd5f75d356d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -9,6 +9,6 @@ MonoBehaviour:
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b87b1e9ef0f8a8f4d8c0488709157211, type: 3}
|
||||
m_Script: {fileID: 11500000, guid: 19b4667bfc2bc924a80a7fb0cd8c24f9, type: 3}
|
||||
m_Name: GameSession
|
||||
m_EditorClassIdentifier: Assembly-CSharp::GameSession
|
||||
25
Assets/DarkMatter/Code/Core/Data/GameSessionSO.cs
Normal file
25
Assets/DarkMatter/Code/Core/Data/GameSessionSO.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
|
||||
[CreateAssetMenu(fileName = "GameSessionSO", menuName = "Scriptable Objects/GameSessionSO")]
|
||||
public class GameSessionSO : ScriptableObject, IGameSession
|
||||
{
|
||||
public bool showStartScreen { get; set; } = false;
|
||||
public bool hasGameStarted { get; set; } = false;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
showStartScreen = true;
|
||||
hasGameStarted = false;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
showStartScreen = false;
|
||||
hasGameStarted = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/DarkMatter/Code/Core/Data/GameSessionSO.cs.meta
Normal file
2
Assets/DarkMatter/Code/Core/Data/GameSessionSO.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 19b4667bfc2bc924a80a7fb0cd8c24f9
|
||||
61
Assets/DarkMatter/Code/Core/Data/InputReaderSO.cs
Normal file
61
Assets/DarkMatter/Code/Core/Data/InputReaderSO.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using Darkmatter.Core;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
[CreateAssetMenu(fileName = "InputReaderSO", menuName = "Scriptable Objects/InputReaderSO")]
|
||||
public class InputReaderSO : ScriptableObject, GameInputAction.IPlayerActions, IInputReader
|
||||
{
|
||||
public event Action<Vector2> OnDragValueChanged;
|
||||
public Vector2 dragInput
|
||||
{
|
||||
get => _dragInput;
|
||||
private set
|
||||
{
|
||||
_dragInput = value;
|
||||
OnDragValueChanged?.Invoke(_dragInput);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public bool isMouseButtonPressed { get; private set; }
|
||||
private Vector2 _dragInput;
|
||||
private GameInputAction action;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
if (action == null) action = new GameInputAction();
|
||||
action.Enable();
|
||||
action.Player.SetCallbacks(this);
|
||||
isMouseButtonPressed = false;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
action.Player.Disable();
|
||||
}
|
||||
|
||||
public void OnDrag(InputAction.CallbackContext context)
|
||||
{
|
||||
dragInput = context.ReadValue<Vector2>();
|
||||
}
|
||||
|
||||
public void OnMouseClicked(InputAction.CallbackContext context)
|
||||
{
|
||||
isMouseButtonPressed = context.ReadValue<float>() == 1 ? true : false;
|
||||
}
|
||||
|
||||
public void LockInput()
|
||||
{
|
||||
action.Player.Disable();
|
||||
}
|
||||
|
||||
public void UnlockInput()
|
||||
{
|
||||
action.Player.Enable();
|
||||
}
|
||||
}
|
||||
}
|
||||
33
Assets/DarkMatter/Code/Core/Data/ScoreService.cs
Normal file
33
Assets/DarkMatter/Code/Core/Data/ScoreService.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using Darkmatter.Core;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Core
|
||||
{
|
||||
public class ScoreService : IScoreService
|
||||
{
|
||||
public event Action<int> OnScoreChange;
|
||||
public int score { get; private set; }
|
||||
|
||||
public int highScore { get; private set; } = PlayerPrefs.GetInt("HighScore");
|
||||
|
||||
public void AddScore()
|
||||
{
|
||||
score += 5;
|
||||
if (score > highScore)
|
||||
{
|
||||
SetNewHighScore();
|
||||
}
|
||||
OnScoreChange?.Invoke(score);
|
||||
}
|
||||
|
||||
private void SetNewHighScore()
|
||||
{
|
||||
highScore = score;
|
||||
PlayerPrefs.SetInt("HighScore", highScore);
|
||||
PlayerPrefs.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
8
Assets/DarkMatter/Code/Domain.meta
Normal file
8
Assets/DarkMatter/Code/Domain.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5ccbadb324e8086498668e58e609c0e2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
18
Assets/DarkMatter/Code/Domain/DomainAssembly.asmdef
Normal file
18
Assets/DarkMatter/Code/Domain/DomainAssembly.asmdef
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "DomainAssembly",
|
||||
"rootNamespace": "Darkmatter.Domain",
|
||||
"references": [
|
||||
"GUID:8bce7b1d1a7647841855dfbbfa883cd6",
|
||||
"GUID:4307f53044263cf4b835bd812fc161a4",
|
||||
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
7
Assets/DarkMatter/Code/Domain/DomainAssembly.asmdef.meta
Normal file
7
Assets/DarkMatter/Code/Domain/DomainAssembly.asmdef.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 219208e14f3a1e1439abafd1ff0ae402
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DarkMatter/Code/Domain/Platforms.meta
Normal file
8
Assets/DarkMatter/Code/Domain/Platforms.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 019ca96010cba7f4faab0a2ac48c566b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
20
Assets/DarkMatter/Code/Domain/Platforms/FirstPlatform.cs
Normal file
20
Assets/DarkMatter/Code/Domain/Platforms/FirstPlatform.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class FirstPlatform : IPlatformRule
|
||||
{
|
||||
public void Execute(IPlatform platform)
|
||||
{
|
||||
foreach (var piece in platform.platformPiece)
|
||||
{
|
||||
piece.SetActive(true);
|
||||
piece.GetComponent<Renderer>().material = platform.safeMaterial;
|
||||
piece.gameObject.SetActive(true);
|
||||
piece.tag = "Safe";
|
||||
}
|
||||
platform.platformPiece[Random.Range(1, platform.platformPiece.Count)].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 27cd8a8665a6d104f85ecb3c791c9757
|
||||
28
Assets/DarkMatter/Code/Domain/Platforms/OtherPlatform.cs
Normal file
28
Assets/DarkMatter/Code/Domain/Platforms/OtherPlatform.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class OtherPlatform : IPlatformRule
|
||||
{
|
||||
int danger = 2;
|
||||
public void Execute(IPlatform platform)
|
||||
{
|
||||
foreach (var piece in platform.platformPiece)
|
||||
{
|
||||
piece.SetActive(true);
|
||||
piece.GetComponent<Renderer>().material = platform.safeMaterial;
|
||||
piece.gameObject.SetActive(true);
|
||||
piece.tag = "Safe";
|
||||
}
|
||||
|
||||
for (int i = 0; i < danger; i++)
|
||||
{
|
||||
GameObject deadPlatform = platform.platformPiece[Random.Range(0, platform.platformPiece.Count)];
|
||||
deadPlatform.GetComponent<Renderer>().material = platform.deathMaterial;
|
||||
deadPlatform.tag = "Death";
|
||||
}
|
||||
platform.platformPiece[Random.Range(0, platform.platformPiece.Count)].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4136bc6323ff5ea40874d2b69bc2ca56
|
||||
8
Assets/DarkMatter/Code/Domain/Player.meta
Normal file
8
Assets/DarkMatter/Code/Domain/Player.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 898d4b8bb3246724b9838847b6a0ba77
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
79
Assets/DarkMatter/Code/Domain/Player/Player.cs
Normal file
79
Assets/DarkMatter/Code/Domain/Player/Player.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
using Darkmatter.Core;
|
||||
using System.Collections;
|
||||
using Unity.Cinemachine;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
|
||||
namespace Darkmatter.Domain
|
||||
{
|
||||
public class Player : MonoBehaviour, IPlayer
|
||||
{
|
||||
[SerializeField] private float jumpForce = 3f;
|
||||
[SerializeField] private Rigidbody rb;
|
||||
[SerializeField] private GameObject splashObject;
|
||||
[SerializeField] private Transform splashParent;
|
||||
[SerializeField] private ParticleSystem deadParticle;
|
||||
[SerializeField] private ParticleSystem jumpParticle;
|
||||
[SerializeField] private CinemachineImpulseSource cinemachineImpulseSource;
|
||||
|
||||
[SerializeField] private Material playerMaterial;
|
||||
[SerializeField] Color[] playerMaterialColors;
|
||||
|
||||
public bool isDead { get; private set; }
|
||||
|
||||
[Inject] private IDeathScreenController IdeathScreenController;
|
||||
[Inject] private IInputReader IinputReader;
|
||||
[Inject] private IAudioController IaudioController;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
isDead = false;
|
||||
playerMaterial.color = playerMaterialColors[Random.Range(0, playerMaterialColors.Length)];
|
||||
}
|
||||
|
||||
private void OnCollisionEnter(Collision collision)
|
||||
{
|
||||
ShowAndHideSplash(collision);
|
||||
if (isDead) return;
|
||||
|
||||
if (collision.gameObject.CompareTag("Safe") && rb.linearVelocity.y <= 0.5f)
|
||||
{
|
||||
rb.linearVelocity = Vector3.up * jumpForce;
|
||||
jumpParticle.Play();
|
||||
IaudioController.PlayJumpSound();
|
||||
}
|
||||
else if (collision.gameObject.CompareTag("Death"))
|
||||
{
|
||||
Die();
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowAndHideSplash(Collision collision)
|
||||
{
|
||||
float splashYPos = collision.transform.position.y + 0.155f;
|
||||
ContactPoint contact = collision.contacts[0];
|
||||
Vector3 surfacePoint = new Vector3(contact.point.x, splashYPos, contact.point.z);
|
||||
GameObject instancedSplash = Instantiate(splashObject, surfacePoint, splashObject.transform.rotation, collision.gameObject.transform);
|
||||
instancedSplash.transform.localScale = new Vector3(Random.Range(0.05f, 0.09f), Random.Range(0.05f, 0.09f), 1);
|
||||
Destroy(instancedSplash, 2f);
|
||||
}
|
||||
private void Die()
|
||||
{
|
||||
isDead = true;
|
||||
IinputReader.LockInput();
|
||||
deadParticle.Play();
|
||||
this.GetComponent<Renderer>().enabled = false;
|
||||
IaudioController.PlayDeathSound();
|
||||
Handheld.Vibrate(); //Vibration
|
||||
cinemachineImpulseSource.GenerateImpulseWithForce(1);
|
||||
StartCoroutine(DieRoutine());
|
||||
}
|
||||
|
||||
IEnumerator DieRoutine()
|
||||
{
|
||||
yield return new WaitForSeconds(1f);
|
||||
IdeathScreenController.ShowDeathScreen();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
2
Assets/DarkMatter/Code/Domain/Player/Player.cs.meta
Normal file
2
Assets/DarkMatter/Code/Domain/Player/Player.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e7d04c655849ccf438cd955f139e9789
|
||||
8
Assets/DarkMatter/Code/Presentation.meta
Normal file
8
Assets/DarkMatter/Code/Presentation.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f6d612fd23717a468beaf56944cda7c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DarkMatter/Code/Presentation/Audio.meta
Normal file
8
Assets/DarkMatter/Code/Presentation/Audio.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf7cffabcb2056547812696e0254bfb2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
58
Assets/DarkMatter/Code/Presentation/Audio/AudioController.cs
Normal file
58
Assets/DarkMatter/Code/Presentation/Audio/AudioController.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class AudioController : MonoBehaviour, IAudioController
|
||||
{
|
||||
[SerializeField] private AudioSource MusicSource;
|
||||
[SerializeField] private AudioSource SFXSource;
|
||||
|
||||
public AudioClip backgroundMusicClip;
|
||||
public AudioClip jumpClip;
|
||||
public AudioClip deathClip;
|
||||
public AudioClip btnPressedClip;
|
||||
public AudioClip scoredClip;
|
||||
|
||||
[Inject] private IGameSession IgameSession;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
MusicSource.clip = backgroundMusicClip;
|
||||
MusicSource.loop = true;
|
||||
MusicSource.Play();
|
||||
}
|
||||
|
||||
|
||||
public void PlaySfx(AudioClip clip)
|
||||
{
|
||||
if (!IgameSession.hasGameStarted) return;
|
||||
SFXSource.ignoreListenerPause = true;
|
||||
SFXSource.PlayOneShot(clip);
|
||||
}
|
||||
|
||||
public void PlayJumpSound()
|
||||
{
|
||||
PlaySfx(jumpClip);
|
||||
}
|
||||
|
||||
public void PlayDeathSound()
|
||||
{
|
||||
PlaySfx(deathClip);
|
||||
}
|
||||
|
||||
public void PlayBtnPressedSound()
|
||||
{
|
||||
PlaySfx(btnPressedClip);
|
||||
}
|
||||
|
||||
public void PlayScoredSound()
|
||||
{
|
||||
PlaySfx(scoredClip);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6359276e3f19a0e439ff6d871c3aee67
|
||||
8
Assets/DarkMatter/Code/Presentation/Platforms.meta
Normal file
8
Assets/DarkMatter/Code/Presentation/Platforms.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 35a5e635888ca7046b748dc77720ba6e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,4 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using Darkmatter.Core;
|
||||
using Darkmatter.Domain;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
@@ -21,7 +22,7 @@ public class Platform : MonoBehaviour, IPlatform
|
||||
private bool hasAchievedScore = false;
|
||||
|
||||
[Inject] Player player;
|
||||
[Inject] IPool pool;
|
||||
[Inject] IPool<Platform> pool;
|
||||
[Inject] IPlatformManager platformManager;
|
||||
[Inject] IScoreService IscoreService;
|
||||
[Inject] IAudioController IaudioController;
|
||||
@@ -76,54 +77,12 @@ public class Platform : MonoBehaviour, IPlatform
|
||||
|
||||
|
||||
}
|
||||
public interface IPlatform
|
||||
{
|
||||
List<GameObject> platformPiece { get; }
|
||||
Material safeMaterial { get; }
|
||||
Material deathMaterial { get; }
|
||||
}
|
||||
|
||||
|
||||
public interface IPlatformRule
|
||||
{
|
||||
public void Execute(IPlatform platform);
|
||||
}
|
||||
|
||||
public class FirstPlatform : IPlatformRule
|
||||
{
|
||||
public void Execute(IPlatform platform)
|
||||
{
|
||||
foreach(var piece in platform.platformPiece)
|
||||
{
|
||||
piece.SetActive(true);
|
||||
piece.GetComponent<Renderer>().material = platform.safeMaterial;
|
||||
piece.gameObject.SetActive(true);
|
||||
piece.tag = "Safe";
|
||||
}
|
||||
platform.platformPiece[Random.Range(1,platform.platformPiece.Count)].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
public class OtherPlatform : IPlatformRule
|
||||
{
|
||||
int danger = 2;
|
||||
public void Execute(IPlatform platform)
|
||||
{
|
||||
foreach (var piece in platform.platformPiece)
|
||||
{
|
||||
piece.SetActive(true);
|
||||
piece.GetComponent<Renderer>().material = platform.safeMaterial;
|
||||
piece.gameObject.SetActive(true);
|
||||
piece.tag = "Safe";
|
||||
}
|
||||
|
||||
for (int i=0;i<danger;i++)
|
||||
{
|
||||
GameObject deadPlatform = platform.platformPiece[Random.Range(0, platform.platformPiece.Count)];
|
||||
deadPlatform.GetComponent<Renderer>().material = platform.deathMaterial;
|
||||
deadPlatform.tag = "Death";
|
||||
}
|
||||
platform.platformPiece[Random.Range(0, platform.platformPiece.Count)].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
using UnityEngine;
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
|
||||
public class PlatformManager : MonoBehaviour,IPlatformManager
|
||||
{
|
||||
[Inject] private IPool pool;
|
||||
[Inject] private IPool<Platform> pool;
|
||||
[Inject] private IInputReader inputReader;
|
||||
|
||||
private float yPos = 0f;
|
||||
@@ -44,7 +45,7 @@ public class PlatformManager : MonoBehaviour,IPlatformManager
|
||||
|
||||
private void ShowPlatforms()
|
||||
{
|
||||
foreach (var platform in pool.All)
|
||||
foreach (Platform platform in pool.All)
|
||||
{
|
||||
platform.gameObject.SetActive(true);
|
||||
platform.transform.position = new Vector3(0, yPos, 0);
|
||||
@@ -60,7 +61,4 @@ public class PlatformManager : MonoBehaviour,IPlatformManager
|
||||
}
|
||||
}
|
||||
|
||||
public interface IPlatformManager
|
||||
{
|
||||
void BuildNewPlatform();
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
using Darkmatter.Core;
|
||||
using Darkmatter.Domain;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
using VContainer.Unity;
|
||||
|
||||
public class PlatformPool : MonoBehaviour,IPool
|
||||
public class PlatformPool : MonoBehaviour, IPool<Platform>
|
||||
{
|
||||
[SerializeField] private Platform platformPrefab;
|
||||
[SerializeField] private Transform platformParent;
|
||||
@@ -57,10 +58,6 @@ public class PlatformPool : MonoBehaviour,IPool
|
||||
|
||||
}
|
||||
|
||||
public interface IPool
|
||||
{
|
||||
IReadOnlyCollection<Platform> All { get; }
|
||||
void ReturnToPool(Platform obj);
|
||||
|
||||
Platform GetFromPool();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "PresentationAssembly",
|
||||
"rootNamespace": "Darkmatter.Presentation",
|
||||
"references": [
|
||||
"GUID:8bce7b1d1a7647841855dfbbfa883cd6",
|
||||
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
|
||||
"GUID:6055be8ebefd69e48b49212b09b47b2f",
|
||||
"GUID:219208e14f3a1e1439abafd1ff0ae402"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09dab6049e43dd9449335e6d3f51f72e
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a1f2e0377d10e343b9657299e3aad8b
|
||||
guid: fbdfa4d2bcf3bcf4b90151362beecf8e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -0,0 +1,48 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using VContainer;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class DeathScreenController : IDeathScreenController
|
||||
{
|
||||
private DeathScreenView deathScreenView;
|
||||
|
||||
[Inject] private IScoreService IscoreService;
|
||||
[Inject] private IInputReader IinputReader;
|
||||
[Inject] private IAudioController IaudioController;
|
||||
[Inject] private IGameSession IgameSession;
|
||||
[Inject] private IGameScreenController IgameScreenController;
|
||||
public DeathScreenController(DeathScreenView _deathScreenView)
|
||||
{
|
||||
deathScreenView = _deathScreenView;
|
||||
deathScreenView.restartBtn.onClick.AddListener(OnRestartButtonClicked);
|
||||
deathScreenView.exitBtn.onClick.AddListener(OnExitButtonClicked);
|
||||
}
|
||||
|
||||
public void ShowDeathScreen()
|
||||
{
|
||||
IgameScreenController.HideGameScreen();
|
||||
deathScreenView.Show(IscoreService.score, IscoreService.highScore);
|
||||
}
|
||||
|
||||
private void OnExitButtonClicked()
|
||||
{
|
||||
Debug.Log("Exit Button Clicked");
|
||||
IinputReader.UnlockInput();
|
||||
IaudioController.PlayBtnPressedSound();
|
||||
IgameSession.showStartScreen = true;
|
||||
SceneManager.LoadScene(0);
|
||||
}
|
||||
|
||||
private void OnRestartButtonClicked()
|
||||
{
|
||||
Debug.Log("Restart Button Clicked");
|
||||
IinputReader.UnlockInput();
|
||||
IaudioController.PlayBtnPressedSound();
|
||||
IgameSession.showStartScreen = false;
|
||||
SceneManager.LoadScene(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 92c6fccb35ce2e64a820ecbc0fff7477
|
||||
27
Assets/DarkMatter/Code/Presentation/UI/DeathScreenView.cs
Normal file
27
Assets/DarkMatter/Code/Presentation/UI/DeathScreenView.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class DeathScreenView : MonoBehaviour
|
||||
{
|
||||
|
||||
[SerializeField] private GameObject deathScreen;
|
||||
public Button restartBtn;
|
||||
public Button exitBtn;
|
||||
public TextMeshProUGUI score;
|
||||
public TextMeshProUGUI highScore;
|
||||
|
||||
public void Show(int _score, int _highScore)
|
||||
{
|
||||
this.score.text = _score.ToString();
|
||||
this.highScore.text = _highScore.ToString();
|
||||
deathScreen.SetActive(true);
|
||||
}
|
||||
public void Hide()
|
||||
{
|
||||
deathScreen.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4aab9e4cddc66e44e90193677b63e24e
|
||||
@@ -0,0 +1,50 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class GameScreenController : IGameScreenController
|
||||
{
|
||||
GameScreenView gameScreenView;
|
||||
[Inject] private IScoreService IscoreService;
|
||||
[Inject] private IPauseScreenController IpauseScreenController;
|
||||
[Inject] private IInputReader IinputReader;
|
||||
[Inject] private IAudioController IaudioController;
|
||||
public GameScreenController(GameScreenView _gameScreenView, IScoreService _IscoreService, IPauseScreenController _IpauseScreenController)
|
||||
{
|
||||
this.gameScreenView = _gameScreenView;
|
||||
IscoreService = _IscoreService;
|
||||
IpauseScreenController = _IpauseScreenController;
|
||||
IscoreService.OnScoreChange += UpdateScore;
|
||||
gameScreenView.pauseBtn.onClick.AddListener(OnPauseButtonClicked);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void UpdateScore(int score)
|
||||
{
|
||||
Debug.Log("calling Score");
|
||||
gameScreenView.UpdateScore(score);
|
||||
}
|
||||
|
||||
public void ShowGameScreen()
|
||||
{
|
||||
gameScreenView.Show();
|
||||
}
|
||||
|
||||
public void HideGameScreen()
|
||||
{
|
||||
gameScreenView.Hide();
|
||||
}
|
||||
|
||||
public void OnPauseButtonClicked()
|
||||
{
|
||||
IaudioController.PlayBtnPressedSound();
|
||||
Time.timeScale = 0f;
|
||||
IinputReader.LockInput();
|
||||
IpauseScreenController.ShowPauseScreen();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0ab301d9fb59e24459e315204ffcc8d6
|
||||
28
Assets/DarkMatter/Code/Presentation/UI/GameScreenView.cs
Normal file
28
Assets/DarkMatter/Code/Presentation/UI/GameScreenView.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class GameScreenView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private GameObject gameScreen;
|
||||
public Button pauseBtn;
|
||||
[SerializeField] private TextMeshProUGUI scoreText;
|
||||
|
||||
public void UpdateScore(int score)
|
||||
{
|
||||
scoreText.text = score.ToString();
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
gameScreen.SetActive(true);
|
||||
}
|
||||
|
||||
public void Hide()
|
||||
{
|
||||
gameScreen.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2efefd316bbb28246bcee036477a00a5
|
||||
@@ -0,0 +1,46 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using VContainer;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class PauseScreenController : IPauseScreenController
|
||||
{
|
||||
private PauseScreenView pauseScreenView;
|
||||
[Inject] private IInputReader IinputReader;
|
||||
[Inject] private IAudioController IaudioController;
|
||||
[Inject] private IGameSession IgameSession;
|
||||
|
||||
public PauseScreenController(PauseScreenView _pauseScreenView)
|
||||
{
|
||||
pauseScreenView = _pauseScreenView;
|
||||
pauseScreenView.resumeBtn.onClick.AddListener(OnResumeButtonClicked);
|
||||
pauseScreenView.restartBtn.onClick.AddListener(OnRestartButtonClicked);
|
||||
}
|
||||
|
||||
public void ShowPauseScreen()
|
||||
{
|
||||
pauseScreenView.Show();
|
||||
}
|
||||
|
||||
private void OnRestartButtonClicked()
|
||||
{
|
||||
Time.timeScale = 1.0f;
|
||||
IinputReader.UnlockInput();
|
||||
IaudioController.PlayBtnPressedSound();
|
||||
IgameSession.showStartScreen = false;
|
||||
SceneManager.LoadScene(0); //Restart This Scene
|
||||
}
|
||||
|
||||
private void OnResumeButtonClicked()
|
||||
{
|
||||
Time.timeScale = 1.0f;
|
||||
pauseScreenView.Hide();
|
||||
IinputReader.UnlockInput();
|
||||
IaudioController.PlayBtnPressedSound();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 682db5ec0dd207b4fb4122bc7798ffc4
|
||||
22
Assets/DarkMatter/Code/Presentation/UI/PauseScreenView.cs
Normal file
22
Assets/DarkMatter/Code/Presentation/UI/PauseScreenView.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class PauseScreenView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] public GameObject pauseScreen;
|
||||
public Button resumeBtn;
|
||||
public Button restartBtn;
|
||||
|
||||
public void Show()
|
||||
{
|
||||
pauseScreen.SetActive(true);
|
||||
}
|
||||
|
||||
public void Hide()
|
||||
{
|
||||
pauseScreen.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e57e5514aa3e64c40a4d396db68170c4
|
||||
@@ -0,0 +1,49 @@
|
||||
using Darkmatter.Core;
|
||||
using UnityEngine;
|
||||
using VContainer;
|
||||
using VContainer.Unity;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class StartScreenController : IStartable
|
||||
{
|
||||
private StartScreenView startScreenView;
|
||||
[Inject] IGameScreenController gameScreenController;
|
||||
[Inject] IInputReader IinputReader;
|
||||
[Inject] private IAudioController IaudioController;
|
||||
[Inject] private IGameSession IgameSession;
|
||||
public StartScreenController(StartScreenView _startScreenView, IGameScreenController _gameScreenController)
|
||||
{
|
||||
Debug.Log("StartScreenController Constructor Called");
|
||||
startScreenView = _startScreenView;
|
||||
gameScreenController = _gameScreenController;
|
||||
startScreenView.tapToStartButton.onClick.AddListener(OnTapToStartButtonClicked);
|
||||
}
|
||||
public void Start()
|
||||
{
|
||||
if (IgameSession.showStartScreen)
|
||||
{
|
||||
startScreenView.Show();
|
||||
IinputReader.LockInput();
|
||||
IgameSession.showStartScreen = false;
|
||||
IgameSession.hasGameStarted = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
gameScreenController.ShowGameScreen();
|
||||
IgameSession.hasGameStarted = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void OnTapToStartButtonClicked()
|
||||
{
|
||||
IaudioController.PlayBtnPressedSound();
|
||||
startScreenView.Hide();
|
||||
IinputReader.UnlockInput();
|
||||
gameScreenController.ShowGameScreen();
|
||||
IgameSession.hasGameStarted = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f1b78c138759874ab695ee6697c16a4
|
||||
23
Assets/DarkMatter/Code/Presentation/UI/StartScreenView.cs
Normal file
23
Assets/DarkMatter/Code/Presentation/UI/StartScreenView.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Darkmatter.Presentation
|
||||
{
|
||||
public class StartScreenView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private GameObject startScreen;
|
||||
public Button tapToStartButton;
|
||||
|
||||
public void Show()
|
||||
{
|
||||
startScreen.SetActive(true);
|
||||
}
|
||||
|
||||
public void Hide()
|
||||
{
|
||||
startScreen.SetActive(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3fccddd791b55e446a7a091823024f34
|
||||
@@ -129,8 +129,8 @@ Material:
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 0.8490566, g: 0.36445355, b: 0.75023574, a: 0}
|
||||
- _Color: {r: 0.8490566, g: 0.36445352, b: 0.75023574, a: 0}
|
||||
- _BaseColor: {r: 0.055980783, g: 0.6416706, b: 0.6981132, a: 0}
|
||||
- _Color: {r: 0.05598075, g: 0.64167047, b: 0.6981132, a: 0}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
|
||||
@@ -116,8 +116,8 @@ Material:
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 0.8679245, g: 0.8474546, b: 0.8474546, a: 0}
|
||||
- _Color: {r: 0.8113207, g: 0.049750805, b: 0.049750805, a: 0}
|
||||
- _BaseColor: {r: 0.8113208, g: 0.049750824, b: 0.049750824, a: 0}
|
||||
- _Color: {r: 0.17342025, g: 0.75471693, b: 0.07475967, a: 0}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
|
||||
@@ -116,8 +116,8 @@ Material:
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 0.7924528, g: 0.7552929, b: 0.063545756, a: 1}
|
||||
- _Color: {r: 0.7924528, g: 0.7552929, b: 0.063545726, a: 1}
|
||||
- _BaseColor: {r: 0.122641504, g: 0.12090601, b: 0.12090601, a: 0}
|
||||
- _Color: {r: 0.8113207, g: 0.53379685, b: 0.042096816, 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: []
|
||||
|
||||
@@ -1,144 +0,0 @@
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
[CustomEditor(typeof(MeshCombiner))]
|
||||
public class MeshCombinerEditor : Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
MeshCombiner meshCombiner = (MeshCombiner)target;
|
||||
Mesh mesh = meshCombiner.GetComponent<MeshFilter>().sharedMesh;
|
||||
|
||||
#region Script:
|
||||
GUI.enabled = false;
|
||||
EditorGUILayout.ObjectField("Script", MonoScript.FromMonoBehaviour((MeshCombiner)target), typeof(MeshCombiner), false);
|
||||
GUI.enabled = true;
|
||||
#endregion Script.
|
||||
|
||||
#region MeshFiltersToSkip array:
|
||||
SerializedProperty meshFiltersToSkip = serializedObject.FindProperty("meshFiltersToSkip");
|
||||
EditorGUI.BeginChangeCheck();
|
||||
EditorGUILayout.PropertyField(meshFiltersToSkip, true);
|
||||
if(EditorGUI.EndChangeCheck())
|
||||
{
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
#endregion MeshFiltersToSkip array.
|
||||
|
||||
#region Button which combine Meshes into one Mesh & Toggles with combine options:
|
||||
// Button:
|
||||
if(GUILayout.Button("Combine Meshes"))
|
||||
{
|
||||
meshCombiner.CombineMeshes(true);
|
||||
}
|
||||
|
||||
// Toggles:
|
||||
meshCombiner.CreateMultiMaterialMesh = GUILayout.Toggle(meshCombiner.CreateMultiMaterialMesh, "Create Multi-Material Mesh");
|
||||
meshCombiner.CombineInactiveChildren = GUILayout.Toggle(meshCombiner.CombineInactiveChildren, "Combine Inactive Children");
|
||||
|
||||
meshCombiner.DeactivateCombinedChildren = GUILayout.Toggle(meshCombiner.DeactivateCombinedChildren, "Deactivate Combined Children");
|
||||
meshCombiner.DeactivateCombinedChildrenMeshRenderers = GUILayout.Toggle(meshCombiner.DeactivateCombinedChildrenMeshRenderers,
|
||||
"Deactivate Combined Children's MeshRenderers");
|
||||
|
||||
meshCombiner.GenerateUVMap = GUILayout.Toggle(meshCombiner.GenerateUVMap, new GUIContent("Generate UV Map", "It is a slow operation that "+
|
||||
"generates a UV map (required for the lightmap).\n\nCan be used only in the Editor."));
|
||||
|
||||
// The last (6) "Destroy Combined Children" Toggle:
|
||||
GUIStyle style = new GUIStyle(EditorStyles.toggle);
|
||||
if(meshCombiner.DestroyCombinedChildren)
|
||||
{
|
||||
style.onNormal.textColor = new Color(1, 0.15f, 0);
|
||||
}
|
||||
meshCombiner.DestroyCombinedChildren = GUILayout.Toggle(meshCombiner.DestroyCombinedChildren,
|
||||
new GUIContent("Destroy Combined Children", "In the editor this operation can NOT be undone!\n\n"+
|
||||
"If you want to bring back destroyed GameObjects, you have to load again the scene without saving."), style);
|
||||
#endregion Button which combine Meshes into one Mesh & Toggles with combine options.
|
||||
|
||||
#region Path to the folder where combined Meshes will be saved:
|
||||
// Create Labels:
|
||||
GUILayout.Label("");
|
||||
GUILayout.Label(new GUIContent("Folder path:", "Folder path to save combined Mesh."));
|
||||
|
||||
// Create style wherein text color will be red if folder path is not valid:
|
||||
style = new GUIStyle(EditorStyles.textField);
|
||||
bool isValidPath = IsValidPath(meshCombiner.FolderPath);
|
||||
if(!isValidPath)
|
||||
{
|
||||
style.normal.textColor = Color.red;
|
||||
style.focused.textColor = Color.red;
|
||||
}
|
||||
|
||||
// Create TextField with custom style:
|
||||
meshCombiner.FolderPath = EditorGUILayout.TextField(meshCombiner.FolderPath, style);
|
||||
#endregion Path to the folder where combined Meshes will be saved.
|
||||
|
||||
#region Button which save/show combined Mesh:
|
||||
bool meshIsSaved = (mesh != null && AssetDatabase.Contains(mesh));
|
||||
GUI.enabled = (mesh != null && (isValidPath || meshIsSaved)); // Valid path is required for not saved Mesh.
|
||||
string saveMeshButtonText = (meshIsSaved) ? "Show Saved Combined Mesh" : "Save Combined Mesh";
|
||||
|
||||
if(GUILayout.Button(saveMeshButtonText))
|
||||
{
|
||||
meshCombiner.FolderPath = SaveCombinedMesh(mesh, meshCombiner.FolderPath);
|
||||
}
|
||||
GUI.enabled = true;
|
||||
#endregion Button which save/show combined Mesh.
|
||||
}
|
||||
|
||||
private bool IsValidPath(string folderPath)
|
||||
{
|
||||
string pattern = "[:*?\"<>|]"; // Prohibited characters.
|
||||
Regex regex = new Regex(pattern);
|
||||
return (!regex.IsMatch(folderPath));
|
||||
}
|
||||
|
||||
private string SaveCombinedMesh(Mesh mesh, string folderPath)
|
||||
{
|
||||
bool meshIsSaved = AssetDatabase.Contains(mesh); // If is saved then only show it in the project view.
|
||||
|
||||
#region Create directories if Mesh and path doesn't exists:
|
||||
folderPath = folderPath.Replace('\\', '/');
|
||||
if(!meshIsSaved && !AssetDatabase.IsValidFolder("Assets/"+folderPath))
|
||||
{
|
||||
string[] folderNames = folderPath.Split('/');
|
||||
folderNames = folderNames.Where((folderName) => !folderName.Equals("")).ToArray();
|
||||
folderNames = folderNames.Where((folderName) => !folderName.Equals(" ")).ToArray();
|
||||
|
||||
folderPath = "/"; // Reset folder path.
|
||||
for(int i = 0; i < folderNames.Length; i++)
|
||||
{
|
||||
folderNames[i] = folderNames[i].Trim();
|
||||
if(!AssetDatabase.IsValidFolder("Assets"+folderPath+folderNames[i]))
|
||||
{
|
||||
string folderPathWithoutSlash = folderPath.Substring(0, folderPath.Length-1); // Delete last "/" character.
|
||||
AssetDatabase.CreateFolder("Assets"+folderPathWithoutSlash, folderNames[i]);
|
||||
}
|
||||
folderPath += folderNames[i]+"/";
|
||||
}
|
||||
folderPath = folderPath.Substring(1, folderPath.Length-2); // Delete first and last "/" character.
|
||||
}
|
||||
#endregion Create directories if Mesh and path doesn't exists.
|
||||
|
||||
#region Save Mesh:
|
||||
if(!meshIsSaved)
|
||||
{
|
||||
string meshPath = "Assets/"+folderPath+"/"+mesh.name+".asset";
|
||||
int assetNumber = 1;
|
||||
while(AssetDatabase.LoadAssetAtPath(meshPath, typeof(Mesh)) != null) // If Mesh with same name exists, change name.
|
||||
{
|
||||
meshPath = "Assets/"+folderPath+"/"+mesh.name+" ("+assetNumber+").asset";
|
||||
assetNumber++;
|
||||
}
|
||||
|
||||
AssetDatabase.CreateAsset(mesh, meshPath);
|
||||
AssetDatabase.SaveAssets();
|
||||
Debug.Log("<color=#ff9900><b>Mesh \""+mesh.name+"\" was saved in the \""+folderPath+"\" folder.</b></color>"); // Show info about saved mesh.
|
||||
}
|
||||
#endregion Save Mesh.
|
||||
|
||||
EditorGUIUtility.PingObject(mesh); // Show Mesh in the project view.
|
||||
return folderPath;
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e2ae2996f91d32944a854e57dfc5a7ff
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 157192
|
||||
packageName: Mesh Combiner
|
||||
packageVersion: 1.2
|
||||
assetPath: Assets/MeshCombiner/Editor/MeshCombinerEditor.cs
|
||||
uploadId: 399985
|
||||
@@ -1,396 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
[RequireComponent(typeof(MeshFilter))]
|
||||
[RequireComponent(typeof(MeshRenderer))]
|
||||
public class MeshCombiner : MonoBehaviour
|
||||
{
|
||||
private const int Mesh16BitBufferVertexLimit = 65535;
|
||||
|
||||
[SerializeField]
|
||||
private bool createMultiMaterialMesh = false, combineInactiveChildren = false, deactivateCombinedChildren = true,
|
||||
deactivateCombinedChildrenMeshRenderers = false, generateUVMap = false, destroyCombinedChildren = false;
|
||||
[SerializeField]
|
||||
private string folderPath = "Prefabs/CombinedMeshes";
|
||||
[SerializeField]
|
||||
[Tooltip("MeshFilters with Meshes which we don't want to combine into one Mesh.")]
|
||||
private MeshFilter[] meshFiltersToSkip = new MeshFilter[0];
|
||||
|
||||
public bool CreateMultiMaterialMesh { get { return createMultiMaterialMesh; } set { createMultiMaterialMesh = value; } }
|
||||
public bool CombineInactiveChildren { get { return combineInactiveChildren; } set { combineInactiveChildren = value; } }
|
||||
public bool DeactivateCombinedChildren
|
||||
{
|
||||
get { return deactivateCombinedChildren; }
|
||||
set
|
||||
{
|
||||
deactivateCombinedChildren = value;
|
||||
CheckDeactivateCombinedChildren();
|
||||
}
|
||||
}
|
||||
public bool DeactivateCombinedChildrenMeshRenderers
|
||||
{
|
||||
get { return deactivateCombinedChildrenMeshRenderers; }
|
||||
set
|
||||
{
|
||||
deactivateCombinedChildrenMeshRenderers = value;
|
||||
CheckDeactivateCombinedChildren();
|
||||
}
|
||||
}
|
||||
public bool GenerateUVMap { get { return generateUVMap; } set { generateUVMap = value; } }
|
||||
public bool DestroyCombinedChildren
|
||||
{
|
||||
get { return destroyCombinedChildren; }
|
||||
set
|
||||
{
|
||||
destroyCombinedChildren = value;
|
||||
CheckDestroyCombinedChildren();
|
||||
}
|
||||
}
|
||||
public string FolderPath { get { return folderPath; } set { folderPath = value; } }
|
||||
|
||||
|
||||
private void CheckDeactivateCombinedChildren()
|
||||
{
|
||||
if(deactivateCombinedChildren || deactivateCombinedChildrenMeshRenderers)
|
||||
{
|
||||
destroyCombinedChildren = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckDestroyCombinedChildren()
|
||||
{
|
||||
if(destroyCombinedChildren)
|
||||
{
|
||||
deactivateCombinedChildren = false;
|
||||
deactivateCombinedChildrenMeshRenderers = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Combine children's Meshes into one Mesh. Set 'showCreatedMeshInfo' to true if want to show info about created Mesh in the console.
|
||||
/// </summary>
|
||||
public void CombineMeshes(bool showCreatedMeshInfo)
|
||||
{
|
||||
#region Save our parent scale and our Transform and reset it temporarily:
|
||||
// When we are unparenting and get parent again then sometimes scale is a little bit different so save scale before unparenting:
|
||||
Vector3 oldScaleAsChild = transform.localScale;
|
||||
|
||||
// If we have parent then his scale will affect to our new combined Mesh scale so unparent us:
|
||||
int positionInParentHierarchy = transform.GetSiblingIndex();
|
||||
Transform parent = transform.parent;
|
||||
transform.parent = null;
|
||||
|
||||
// Thanks to this the new combined Mesh will have same position and scale in the world space like its children:
|
||||
Quaternion oldRotation = transform.rotation;
|
||||
Vector3 oldPosition = transform.position;
|
||||
Vector3 oldScale = transform.localScale;
|
||||
transform.rotation = Quaternion.identity;
|
||||
transform.position = Vector3.zero;
|
||||
transform.localScale = Vector3.one;
|
||||
#endregion Save Transform and reset it temporarily.
|
||||
|
||||
#region Combine Meshes into one Mesh:
|
||||
if(!createMultiMaterialMesh)
|
||||
{
|
||||
CombineMeshesWithSingleMaterial(showCreatedMeshInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
CombineMeshesWithMutliMaterial(showCreatedMeshInfo);
|
||||
}
|
||||
#endregion Combine Meshes into one Mesh.
|
||||
|
||||
#region Set old Transform values:
|
||||
// Bring back the Transform values:
|
||||
transform.rotation = oldRotation;
|
||||
transform.position = oldPosition;
|
||||
transform.localScale = oldScale;
|
||||
|
||||
// Get back parent and same hierarchy position:
|
||||
transform.parent = parent;
|
||||
transform.SetSiblingIndex(positionInParentHierarchy);
|
||||
|
||||
// Set back the scale value as child:
|
||||
transform.localScale = oldScaleAsChild;
|
||||
#endregion Set old Transform values.
|
||||
}
|
||||
|
||||
private MeshFilter[] GetMeshFiltersToCombine()
|
||||
{
|
||||
// Get all MeshFilters belongs to this GameObject and its children:
|
||||
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(combineInactiveChildren);
|
||||
|
||||
// Delete first MeshFilter belongs to this GameObject in meshFiltersToSkip array:
|
||||
meshFiltersToSkip = meshFiltersToSkip.Where((meshFilter) => meshFilter != meshFilters[0]).ToArray();
|
||||
|
||||
// Delete null values in meshFiltersToSkip array:
|
||||
meshFiltersToSkip = meshFiltersToSkip.Where((meshFilter) => meshFilter != null).ToArray();
|
||||
|
||||
for(int i = 0; i < meshFiltersToSkip.Length; i++)
|
||||
{
|
||||
meshFilters = meshFilters.Where((meshFilter) => meshFilter != meshFiltersToSkip[i]).ToArray();
|
||||
}
|
||||
|
||||
return meshFilters;
|
||||
}
|
||||
|
||||
private void CombineMeshesWithSingleMaterial(bool showCreatedMeshInfo)
|
||||
{
|
||||
// Get all MeshFilters belongs to this GameObject and its children:
|
||||
MeshFilter[] meshFilters = GetMeshFiltersToCombine();
|
||||
|
||||
// First MeshFilter belongs to this GameObject so we don't need it:
|
||||
CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length-1];
|
||||
|
||||
// If it will be over 65535 then use the 32 bit index buffer:
|
||||
long verticesLength = 0;
|
||||
|
||||
for(int i = 0; i < meshFilters.Length-1; i++) // Skip first MeshFilter belongs to this GameObject in this loop.
|
||||
{
|
||||
combineInstances[i].subMeshIndex = 0;
|
||||
combineInstances[i].mesh = meshFilters[i+1].sharedMesh;
|
||||
combineInstances[i].transform = meshFilters[i+1].transform.localToWorldMatrix;
|
||||
verticesLength += combineInstances[i].mesh.vertices.Length;
|
||||
}
|
||||
|
||||
// Set Material from child:
|
||||
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>(combineInactiveChildren);
|
||||
if(meshRenderers.Length >= 2)
|
||||
{
|
||||
meshRenderers[0].sharedMaterials = new Material[1];
|
||||
meshRenderers[0].sharedMaterial = meshRenderers[1].sharedMaterial;
|
||||
}
|
||||
else
|
||||
{
|
||||
meshRenderers[0].sharedMaterials = new Material[0]; // Reset the MeshRenderer's Materials array.
|
||||
}
|
||||
|
||||
// Create Mesh from combineInstances:
|
||||
Mesh combinedMesh = new Mesh();
|
||||
combinedMesh.name = name;
|
||||
|
||||
#if UNITY_2017_3_OR_NEWER
|
||||
if(verticesLength > Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
combinedMesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; // Only works on Unity 2017.3 or higher.
|
||||
}
|
||||
|
||||
combinedMesh.CombineMeshes(combineInstances);
|
||||
GenerateUV(combinedMesh);
|
||||
meshFilters[0].sharedMesh = combinedMesh;
|
||||
DeactivateCombinedGameObjects(meshFilters);
|
||||
|
||||
if(showCreatedMeshInfo)
|
||||
{
|
||||
if(verticesLength <= Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
Debug.Log("<color=#00cc00><b>Mesh \""+name+"\" was created from "+combineInstances.Length+" children meshes and has "+verticesLength
|
||||
+" vertices.</b></color>");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("<color=#ff3300><b>Mesh \""+name+"\" was created from "+combineInstances.Length+" children meshes and has "+verticesLength
|
||||
+" vertices. Some old devices, like Android with Mali-400 GPU, do not support over 65535 vertices.</b></color>");
|
||||
}
|
||||
}
|
||||
#else
|
||||
if(verticesLength <= Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
combinedMesh.CombineMeshes(combineInstances);
|
||||
GenerateUV(combinedMesh);
|
||||
meshFilters[0].sharedMesh = combinedMesh;
|
||||
DeactivateCombinedGameObjects(meshFilters);
|
||||
|
||||
if(showCreatedMeshInfo)
|
||||
{
|
||||
Debug.Log("<color=#00cc00><b>Mesh \""+name+"\" was created from "+combineInstances.Length+" children meshes and has "+verticesLength
|
||||
+" vertices.</b></color>");
|
||||
}
|
||||
}
|
||||
else if(showCreatedMeshInfo)
|
||||
{
|
||||
Debug.Log("<color=red><b>The mesh vertex limit is 65535! The created mesh had "+verticesLength+" vertices. Upgrade Unity version to"
|
||||
+" 2017.3 or higher to avoid this limit (some old devices, like Android with Mali-400 GPU, do not support over 65535 vertices).</b></color>");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private void CombineMeshesWithMutliMaterial(bool showCreatedMeshInfo)
|
||||
{
|
||||
#region Get MeshFilters, MeshRenderers and unique Materials from all children:
|
||||
MeshFilter[] meshFilters = GetMeshFiltersToCombine();
|
||||
MeshRenderer[] meshRenderers = new MeshRenderer[meshFilters.Length];
|
||||
meshRenderers[0] = GetComponent<MeshRenderer>(); // Our (parent) MeshRenderer.
|
||||
|
||||
List<Material> uniqueMaterialsList = new List<Material>();
|
||||
for(int i = 0; i < meshFilters.Length-1; i++)
|
||||
{
|
||||
meshRenderers[i+1] = meshFilters[i+1].GetComponent<MeshRenderer>();
|
||||
if(meshRenderers[i+1] != null)
|
||||
{
|
||||
Material[] materials = meshRenderers[i+1].sharedMaterials; // Get all Materials from child Mesh.
|
||||
for(int j = 0; j < materials.Length; j++)
|
||||
{
|
||||
if(!uniqueMaterialsList.Contains(materials[j])) // If Material doesn't exists in the list then add it.
|
||||
{
|
||||
uniqueMaterialsList.Add(materials[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion Get MeshFilters, MeshRenderers and unique Materials from all children.
|
||||
|
||||
#region Combine children Meshes with the same Material to create submeshes for final Mesh:
|
||||
List<CombineInstance> finalMeshCombineInstancesList = new List<CombineInstance>();
|
||||
|
||||
// If it will be over 65535 then use the 32 bit index buffer:
|
||||
long verticesLength = 0;
|
||||
|
||||
for(int i = 0; i < uniqueMaterialsList.Count; i++) // Create each Mesh (submesh) from Meshes with the same Material.
|
||||
{
|
||||
List<CombineInstance> submeshCombineInstancesList = new List<CombineInstance>();
|
||||
|
||||
for(int j = 0; j < meshFilters.Length-1; j++) // Get only childeren Meshes (skip our Mesh).
|
||||
{
|
||||
if(meshRenderers[j+1] != null)
|
||||
{
|
||||
Material[] submeshMaterials = meshRenderers[j+1].sharedMaterials; // Get all Materials from child Mesh.
|
||||
|
||||
for(int k = 0; k < submeshMaterials.Length; k++)
|
||||
{
|
||||
// If Materials are equal, combine Mesh from this child:
|
||||
if(uniqueMaterialsList[i] == submeshMaterials[k])
|
||||
{
|
||||
CombineInstance combineInstance = new CombineInstance();
|
||||
combineInstance.subMeshIndex = k; // Mesh may consist of smaller parts - submeshes.
|
||||
// Every part have different index. If there are 3 submeshes
|
||||
// in Mesh then MeshRender needs 3 Materials to render them.
|
||||
combineInstance.mesh = meshFilters[j+1].sharedMesh;
|
||||
combineInstance.transform = meshFilters[j+1].transform.localToWorldMatrix;
|
||||
submeshCombineInstancesList.Add(combineInstance);
|
||||
verticesLength += combineInstance.mesh.vertices.Length;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create new Mesh (submesh) from Meshes with the same Material:
|
||||
Mesh submesh = new Mesh();
|
||||
|
||||
#if UNITY_2017_3_OR_NEWER
|
||||
if(verticesLength > Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
submesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; // Only works on Unity 2017.3 or higher.
|
||||
}
|
||||
|
||||
submesh.CombineMeshes(submeshCombineInstancesList.ToArray(), true);
|
||||
#else
|
||||
// Below Unity 2017.3 if vertices count is above the limit then an error appears in the console when we use the below method.
|
||||
// Anyway we don't stop the algorithm here beacuse we want to count the entire number of vertices in the children meshes:
|
||||
if(verticesLength <= Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
submesh.CombineMeshes(submeshCombineInstancesList.ToArray(), true);
|
||||
}
|
||||
#endif
|
||||
|
||||
CombineInstance finalCombineInstance = new CombineInstance();
|
||||
finalCombineInstance.subMeshIndex = 0;
|
||||
finalCombineInstance.mesh = submesh;
|
||||
finalCombineInstance.transform = Matrix4x4.identity;
|
||||
finalMeshCombineInstancesList.Add(finalCombineInstance);
|
||||
}
|
||||
#endregion Combine submeshes (children Meshes) with the same Material.
|
||||
|
||||
#region Set Materials array & combine submeshes into one multimaterial Mesh:
|
||||
meshRenderers[0].sharedMaterials = uniqueMaterialsList.ToArray();
|
||||
|
||||
Mesh combinedMesh = new Mesh();
|
||||
combinedMesh.name = name;
|
||||
|
||||
#if UNITY_2017_3_OR_NEWER
|
||||
if(verticesLength > Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
combinedMesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; // Only works on Unity 2017.3 or higher.
|
||||
}
|
||||
|
||||
combinedMesh.CombineMeshes(finalMeshCombineInstancesList.ToArray(), false);
|
||||
GenerateUV(combinedMesh);
|
||||
meshFilters[0].sharedMesh = combinedMesh;
|
||||
DeactivateCombinedGameObjects(meshFilters);
|
||||
|
||||
if(showCreatedMeshInfo)
|
||||
{
|
||||
if(verticesLength <= Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
Debug.Log("<color=#00cc00><b>Mesh \""+name+"\" was created from "+(meshFilters.Length-1)+" children meshes and has "
|
||||
+finalMeshCombineInstancesList.Count+" submeshes, and "+verticesLength+" vertices.</b></color>");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("<color=#ff3300><b>Mesh \""+name+"\" was created from "+(meshFilters.Length-1)+" children meshes and has "
|
||||
+finalMeshCombineInstancesList.Count+" submeshes, and "+verticesLength
|
||||
+" vertices. Some old devices, like Android with Mali-400 GPU, do not support over 65535 vertices.</b></color>");
|
||||
}
|
||||
}
|
||||
#else
|
||||
if(verticesLength <= Mesh16BitBufferVertexLimit)
|
||||
{
|
||||
combinedMesh.CombineMeshes(finalMeshCombineInstancesList.ToArray(), false);
|
||||
GenerateUV(combinedMesh);
|
||||
meshFilters[0].sharedMesh = combinedMesh;
|
||||
DeactivateCombinedGameObjects(meshFilters);
|
||||
|
||||
if(showCreatedMeshInfo)
|
||||
{
|
||||
Debug.Log("<color=#00cc00><b>Mesh \""+name+"\" was created from "+(meshFilters.Length-1)+" children meshes and has "
|
||||
+finalMeshCombineInstancesList.Count+" submeshes, and "+verticesLength+" vertices.</b></color>");
|
||||
}
|
||||
}
|
||||
else if(showCreatedMeshInfo)
|
||||
{
|
||||
Debug.Log("<color=red><b>The mesh vertex limit is 65535! The created mesh had "+verticesLength+" vertices. Upgrade Unity version to"
|
||||
+" 2017.3 or higher to avoid this limit (some old devices, like Android with Mali-400 GPU, do not support over 65535 vertices).</b></color>");
|
||||
}
|
||||
#endif
|
||||
#endregion Set Materials array & combine submeshes into one multimaterial Mesh.
|
||||
}
|
||||
|
||||
private void DeactivateCombinedGameObjects(MeshFilter[] meshFilters)
|
||||
{
|
||||
for(int i = 0; i < meshFilters.Length-1; i++) // Skip first MeshFilter belongs to this GameObject in this loop.
|
||||
{
|
||||
if(!destroyCombinedChildren)
|
||||
{
|
||||
if(deactivateCombinedChildren)
|
||||
{
|
||||
meshFilters[i+1].gameObject.SetActive(false);
|
||||
}
|
||||
if(deactivateCombinedChildrenMeshRenderers)
|
||||
{
|
||||
MeshRenderer meshRenderer = meshFilters[i+1].gameObject.GetComponent<MeshRenderer>();
|
||||
if(meshRenderer != null)
|
||||
{
|
||||
meshRenderer.enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyImmediate(meshFilters[i+1].gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void GenerateUV(Mesh combinedMesh)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if(generateUVMap)
|
||||
{
|
||||
UnityEditor.UnwrapParam unwrapParam = new UnityEditor.UnwrapParam();
|
||||
UnityEditor.UnwrapParam.SetDefaults(out unwrapParam);
|
||||
UnityEditor.Unwrapping.GenerateSecondaryUVSet(combinedMesh, unwrapParam);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 24fb3eb29eeebd04d87475bbfb984a31
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 157192
|
||||
packageName: Mesh Combiner
|
||||
packageVersion: 1.2
|
||||
assetPath: Assets/MeshCombiner/Scripts/MeshCombiner.cs
|
||||
uploadId: 399985
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user