Commit 77f516a4 authored by wanqing's avatar wanqing

铁球第一关卡逻辑

parent a82da6d1
......@@ -22,7 +22,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Temp\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;UNITY_2019_3_14;UNITY_2019_3;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_RUNTIME_PERMISSIONS;ENABLE_ENGINE_CODE_STRIPPING;ENABLE_ONSCREEN_KEYBOARD;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;ENABLE_VIDEO;PLATFORM_ANDROID;UNITY_ANDROID;UNITY_ANDROID_API;ENABLE_EGL;ENABLE_NETWORK;ENABLE_RUNTIME_GI;ENABLE_CRUNCH_TEXTURE_COMPRESSION;PLATFORM_SUPPORTS_ADS_ID;UNITY_CAN_SHOW_SPLASH_SCREEN;UNITY_HAS_GOOGLEVR;UNITY_HAS_TANGO;ENABLE_SPATIALTRACKING;UNITY_ASTC_ONLY_DECOMPRESS;ENABLE_UNITYADS_RUNTIME;UNITY_UNITYADS_API;ENABLE_MONO;NET_4_6;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;OBI_ONI_SUPPORTED;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
<DefineConstants>DEBUG;TRACE;UNITY_2019_3_14;UNITY_2019_3;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_4_6;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;OBI_ONI_SUPPORTED;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoWarn>0169</NoWarn>
......@@ -48,7 +48,7 @@
<ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<UnityProjectGenerator>Unity/VSTU</UnityProjectGenerator>
<UnityProjectType>Editor:5</UnityProjectType>
<UnityBuildTarget>Android:13</UnityBuildTarget>
<UnityBuildTarget>StandaloneWindows64:19</UnityBuildTarget>
<UnityVersion>2019.3.14f1</UnityVersion>
</PropertyGroup>
<ItemGroup>
......@@ -92,6 +92,10 @@
<Compile Include="Assets\EasyTouchBundle\EasyTouchControls\Plugins\Editor\ETCJoystickInspector.cs" />
<Compile Include="Assets\EasyTouchBundle\EasyTouchControls\Plugins\Editor\ETCMenu.cs" />
<Compile Include="Assets\EasyTouchBundle\EasyTouchControls\Plugins\Editor\ETCTouchPadInspector.cs" />
<Compile Include="Assets\HoleBall\Editor\HoleBallEditor.cs" />
<Compile Include="Assets\HoleBall\Editor\ObstacleHolderEditor.cs" />
<Compile Include="Assets\HoleBall\Editor\SkinSettingsEditor.cs" />
<Compile Include="Assets\HoleBall\Readme\Editor\ReadmeEditor.cs" />
<Reference Include="UnityEngine">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.dll</HintPath>
</Reference>
......@@ -293,6 +297,12 @@
<Reference Include="SyntaxTree.VisualStudio.Unity.Bridge">
<HintPath>C:/Program Files (x86)/Microsoft Visual Studio Tools for Unity/16.0/Editor/SyntaxTree.VisualStudio.Unity.Bridge.dll</HintPath>
</Reference>
<Reference Include="DOTweenEditor">
<HintPath>D:/wan/dyspaceGame/SteelBall/SteelBall/Assets/Plugins/DOTween/Editor/DOTweenEditor.dll</HintPath>
</Reference>
<Reference Include="DOTween">
<HintPath>D:/wan/dyspaceGame/SteelBall/SteelBall/Assets/Plugins/DOTween/DOTween.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>D:/wan/dyspaceGame/SteelBall/SteelBall/Library/PackageCache/com.unity.ext.nunit@1.0.0/net35/unity-custom/nunit.framework.dll</HintPath>
</Reference>
......
......@@ -22,7 +22,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Temp\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;UNITY_2019_3_14;UNITY_2019_3;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_RUNTIME_PERMISSIONS;ENABLE_ENGINE_CODE_STRIPPING;ENABLE_ONSCREEN_KEYBOARD;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;ENABLE_VIDEO;PLATFORM_ANDROID;UNITY_ANDROID;UNITY_ANDROID_API;ENABLE_EGL;ENABLE_NETWORK;ENABLE_RUNTIME_GI;ENABLE_CRUNCH_TEXTURE_COMPRESSION;PLATFORM_SUPPORTS_ADS_ID;UNITY_CAN_SHOW_SPLASH_SCREEN;UNITY_HAS_GOOGLEVR;UNITY_HAS_TANGO;ENABLE_SPATIALTRACKING;UNITY_ASTC_ONLY_DECOMPRESS;ENABLE_UNITYADS_RUNTIME;UNITY_UNITYADS_API;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;OBI_ONI_SUPPORTED;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
<DefineConstants>DEBUG;TRACE;UNITY_2019_3_14;UNITY_2019_3;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;OBI_ONI_SUPPORTED;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoWarn>0169</NoWarn>
......@@ -48,7 +48,7 @@
<ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<UnityProjectGenerator>Unity/VSTU</UnityProjectGenerator>
<UnityProjectType>GamePlugins:3</UnityProjectType>
<UnityBuildTarget>Android:13</UnityBuildTarget>
<UnityBuildTarget>StandaloneWindows64:19</UnityBuildTarget>
<UnityVersion>2019.3.14f1</UnityVersion>
</PropertyGroup>
<ItemGroup>
......@@ -63,6 +63,13 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModuleAudio.cs" />
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModulePhysics.cs" />
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModulePhysics2D.cs" />
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModuleSprite.cs" />
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModuleUI.cs" />
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModuleUnityVersion.cs" />
<Compile Include="Assets\Plugins\DOTween\Modules\DOTweenModuleUtils.cs" />
<Compile Include="Assets\Plugins\EasyTouch\Components\EasyTouchTrigger.cs" />
<Compile Include="Assets\Plugins\EasyTouch\Components\QuickBase.cs" />
<Compile Include="Assets\Plugins\EasyTouch\Components\QuickDrag.cs" />
......@@ -80,6 +87,7 @@
<Compile Include="Assets\Plugins\EasyTouch\Engine\Finger.cs" />
<Compile Include="Assets\Plugins\EasyTouch\Engine\Gesture.cs" />
<Compile Include="Assets\Plugins\EasyTouch\Engine\TwoFingerGesture.cs" />
<None Include="Assets\Plugins\DOTween\readme.txt" />
<Reference Include="UnityEngine">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.dll</HintPath>
</Reference>
......@@ -107,6 +115,12 @@
<Reference Include="UnityEngine.ClothModule">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ClusterInputModule">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.ClusterRendererModule">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll</HintPath>
</Reference>
......@@ -257,6 +271,9 @@
<Reference Include="UnityEditor">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/Managed/UnityEditor.dll</HintPath>
</Reference>
<Reference Include="DOTween">
<HintPath>D:/wan/dyspaceGame/SteelBall/SteelBall/Assets/Plugins/DOTween/DOTween.dll</HintPath>
</Reference>
<Reference Include="mscorlib">
<HintPath>D:/wan/unity2019.3.14path/Unity/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll</HintPath>
</Reference>
......
This diff is collapsed.
......@@ -4,18 +4,39 @@ using UnityEngine;
public class FirstLevelTrigger : MonoBehaviour
{
public Transform m_targetTrans;
private Vector3 m_pos = new Vector3(0, 5.2f, 0);
//public Transform m_targetTrans;
private Vector3 m_pos = new Vector3(-2.15f, 0.22f, 0);
private Quaternion m_rotation = Quaternion.identity;
private bool m_bControl = true;
private Transform m_targetTrans;
private void OnTriggerEnter(Collider other)
//private void OnTriggerEnter(Collider other)
//{
// if (other.gameObject.CompareTag("Target"))
// {
// BattleCtrl.instance.levelManager.curLevel.chainRopeView.CatchObjEnterTarget();
// BattleCtrl.instance.OnBattleWin();
// m_targetTrans.localPosition = m_pos;
// m_targetTrans.localRotation = m_rotation;
// }
//}
protected virtual void OnTriggerEnter(Collider collider)
{
if (other.gameObject.CompareTag("Target"))
Rigidbody rb = collider.GetComponent<Rigidbody>();
if (collider.gameObject.CompareTag("Target") && m_bControl && rb)
{
BattleCtrl.instance.levelManager.curLevel.chainRopeView.CatchObjEnterTarget();
m_bControl = false;
m_targetTrans = collider.transform;
rb.constraints = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY;
BattleCtrl.instance.OnBattleWin();
m_targetTrans.localPosition = m_pos;
m_targetTrans.localRotation = m_rotation;
}
}
private void Update()
{
if(!m_bControl && m_targetTrans)
{
m_targetTrans.localPosition = Vector3.Lerp(m_targetTrans.localPosition, m_pos, 0.03f);
}
}
}
......@@ -198,7 +198,7 @@ public class BattleUI : MonoBehaviour
//{
// GameServices.audioServices.PlayBgm(GameServices.configService.audioConfig.GameBgm);
//});
GameServices.audioServices.PlayAudio(GameServices.configService.audioConfig.Success);
//GameServices.audioServices.PlayAudio(GameServices.configService.audioConfig.Success);
}
//失败
public void OnBattleFail()
......
fileFormatVersion: 2
guid: 9ff58dfd8bfc06c48a9af017828fb40c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 51a49656bff65b3488577fead51b83df
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
Shader "MyShader/Inside"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Stencil
{
Ref 1
Comp Equal
}
ZWrite Off
ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
fileFormatVersion: 2
guid: de876f4584345cb4d917e83d2e64490a
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:
Shader "MyShader/Occlusion"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags {"RenderType" = "Transparent" "Queue"="Transparent" "DisableBatching" = "True"}
LOD 100
Cull Off
Stencil
{
Ref 1
Comp Always
Pass Replace
}
GrabPass{"_ScreenTex"}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 grabPos:TEXCOORD1;
};
sampler2D _MainTex;
sampler2D _ScreenTex;
float4 _MainTex_ST;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.grabPos=ComputeGrabScreenPos(o.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2Dproj(_ScreenTex,i.grabPos);
//col.rgb=1-col.rgb;
return col;
}
ENDCG
}
}
}
fileFormatVersion: 2
guid: ac3a3d93065189b419a501525517e3ad
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:
Shader "MyShader/EffectPalne2"
{
Properties
{
_Scale("Main Texture Scale", Float) = 1
[NoScaleOffset]
_MainTex ("Main Texture", 2D) = "white" {}
_NoiseTex ("Distort Texture", 2D) = "white" {}
_Strength ("Distort Strength", Range(-1,1)) = 0.5
_SpeedX ("Speed X", Float) = 1
_SpeedY ("Speed Y", Float) = 1
_Radius ("Radius", Float) = 0.5
}
SubShader
{
Tags {"RenderType" = "Opaque"}
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 screenPos:TEXCOORD1;
};
sampler2D _MainTex;
sampler2D _NoiseTex;
half4 _NoiseTex_ST;
half _Scale,_SpeedX,_SpeedY,_Strength;
float _Radius;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _NoiseTex);
o.screenPos=ComputeScreenPos(o.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float dist=distance(i.uv,0.5);
clip(_Radius-dist);
half t=_Time.x;
// sample the texture
half2 scrUV=_Scale*i.screenPos.xy/i.screenPos.w;
//scrUV+=noise;
scrUV+=half2(_SpeedX,_SpeedY)*t;
half2 noiseUV=scrUV*_NoiseTex_ST.xy+_NoiseTex_ST.zw;
half2 noise=tex2D(_NoiseTex,noiseUV).rg*_Strength;
scrUV+=noise;
fixed4 col = tex2D(_MainTex,scrUV);
return col;
}
ENDCG
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 9e2d2ea0dc20f5741bb6995eb60a8b0c
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:
Shader "MyShader/PalneWorld"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_GetPos ("Start Pos(XYZ)",Vector)=(0,0,0,1)
_Radius ("Radius", Float) = 0.5
[Toggle]_Factor ("Factor", Int) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 worldPos:TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float3 _GetPos;
float _Radius;
int _Factor;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.worldPos= mul(unity_ObjectToWorld,v.vertex).xyz;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float dist=distance(i.worldPos,_GetPos);
clip(dist-_Radius*_Factor);
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: d6a22ca9ceb28b741953f089876c1e72
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: ee72983365f460342bb18743ff5f21da
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: e93e76c64d4874304ac542027fa60a2a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 3c0ea08ee5fab4b8c9178f687e76b583
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEditor;
namespace HoleBall
{
public class HoleBallEditor
{
[MenuItem("HoleBall/Skin Settings", false, 0)]
private static void FindSkinSettings()
{
SelectUtil(nameof(SkinsSettings));
}
[MenuItem("HoleBall/Levels Settings", false, 1)]
private static void FindLevelsSettings()
{
SelectUtil(nameof(GenerationSettings));
}
private static void SelectUtil(string className)
{
foreach (string guid in AssetDatabase.FindAssets($"t:{className}"))
{
Selection.activeInstanceID = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(AssetDatabase.GUIDToAssetPath(guid)).GetInstanceID();
}
}
}
}
fileFormatVersion: 2
guid: 844a07525511844aba60246865d0a767
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Linq;
using UnityEngine;
using UnityEditor;
namespace HoleBall
{
[CustomEditor(typeof(ObstaclesHolder))]
public class ObstacleHolderEditor : Editor
{
private GameObject visualPrefab;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
ShowFillButton();
ShowVisualization();
}
private void ShowFillButton()
{
GUILayout.Space(6);
if (GUILayout.Button("Fill obstacles positions", GUILayout.Width(160), GUILayout.Height(30)))
{
((ObstaclesHolder)target).positions = GetLocalPositionsFromTransforms(GetChildTransforms());
((ObstaclesHolder)target).rotations = GetLocalRotationsFromTransforms(GetChildTransforms());
serializedObject.ApplyModifiedProperties();
}
}
private void ShowVisualization()
{
GUILayout.Space(14);
EditorGUILayout.LabelField("Visualization", EditorStyles.boldLabel);
visualPrefab = EditorGUILayout.ObjectField("Visualize object", visualPrefab, typeof(GameObject), true) as GameObject;
ShowRemoveChildrenButton();
ShowVisualizeButton();
}
private void ShowRemoveChildrenButton()
{
GUILayout.Space(5);
if (GUILayout.Button("Remove child objects", GUILayout.Width(160), GUILayout.Height(30)))
{
var transforms = GetChildTransforms();
for (int i = transforms.Length - 1; i >= 0; i--)
{
DestroyImmediate(transforms[i].gameObject);
}
}
}
private void ShowVisualizeButton()
{
GUILayout.Space(5);
if (GUILayout.Button("Visualize obstacles", GUILayout.Width(160), GUILayout.Height(30)))
{
if (((ObstaclesHolder)target).positions != null && visualPrefab != null)
{
Transform parent = ((ObstaclesHolder)target).transform;
Vector3 parentPosition = parent.position;
Quaternion parentRotation = parent.rotation;
for (int i = 0; i < ((ObstaclesHolder)target).positions.Length; i++)
{
var obj = Instantiate(visualPrefab);
obj.transform.parent = parent;
obj.transform.localPosition = ((ObstaclesHolder)target).positions[i];
obj.transform.localEulerAngles = ((ObstaclesHolder)target).rotations[i];
}
}
}
}
private Transform[] GetChildTransforms()
{
return ((ObstaclesHolder)target).GetComponentsInChildren<Transform>().Where(
go => go.gameObject != ((ObstaclesHolder)target).gameObject
).ToArray();
}
private Vector3[] GetLocalPositionsFromTransforms(Transform[] transforms)
{
return transforms.Select((t) => t.localPosition).ToArray(); ;
}
private Vector3[] GetLocalRotationsFromTransforms(Transform[] transforms)
{
return transforms.Select((t) => t.localEulerAngles).ToArray(); ;
}
}
}
fileFormatVersion: 2
guid: c33bb09f57e3a451cbddf8fd699aa8f1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Linq;
using UnityEngine;
using UnityEditor;
namespace HoleBall
{
[CustomEditor(typeof(SkinsSettings))]
public class SkinsSettingsEditor : Editor
{
private GameObject visualPrefab;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
CheckDefaultSkinsIndexes();
CheckSkinsIndexes();
}
private void CheckDefaultSkinsIndexes()
{
SkinsSettings settings = (SkinsSettings) target;
if(settings.ballSkins.Length != 0)
{
bool isFound = false;
for(int i = 0; i < settings.ballSkins.Length; i++)
{
if(settings.defalutBallSkinIndex == settings.ballSkins[i].index)
{
isFound = true;
break;
}
}
if(!isFound)
{
ShowError("Default Ball Skin Index must be equal one of Ball Skins index.");
}
}
if(settings.holeSkins.Length != 0)
{
bool isFound = false;
for(int i = 0; i < settings.holeSkins.Length; i++)
{
if(settings.defaultHoleSkinIndex == settings.holeSkins[i].index)
{
isFound = true;
break;
}
}
if(!isFound)
{
ShowError("Default Hole Skin Index must be equal one of Hole Skins index.");
}
}
}
private void CheckSkinsIndexes()
{
SkinsSettings settings = (SkinsSettings) target;
bool stop = false;
// Check Ball indexes
for(int i = 0; i < settings.ballSkins.Length && !stop; i++)
{
for(int j = 0; j < settings.ballSkins.Length; j++)
{
if(i == j)
{
continue;
}
if(settings.ballSkins[i].index == settings.ballSkins[j].index)
{
ShowError($"Ball Skins Element{i} and Ball Skins Element{j} have equal indexes.");
stop = true;
break;
}
}
}
// Check Hole indexes
for(int i = 0; i < settings.holeSkins.Length && !stop; i++)
{
for(int j = 0; j < settings.holeSkins.Length; j++)
{
if(i == j)
{
continue;
}
if(settings.holeSkins[i].index == settings.holeSkins[j].index)
{
ShowError($"Hole Skins Element{i} and Hole Skins Element{j} have equal indexes.");
stop = true;
break;
}
}
}
// Check Ball and Hole Indexes
for(int i = 0; i < settings.ballSkins.Length && !stop; i++)
{
for(int j = 0; j < settings.holeSkins.Length; j++)
{
if(settings.ballSkins[i].index == settings.holeSkins[j].index)
{
ShowError($"Ball Skins Element{i} and Hole Skins Element{j} have equal indexes.");
stop = true;
break;
}
}
}
}
private void ShowError(string text)
{
EditorGUILayout.HelpBox(text, MessageType.Error);
}
}
}
fileFormatVersion: 2
guid: 24759f8bd142045809b6bf6582fc6a8e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: b27455475e2e14b0c824b1a4c4fe681a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 92ef57393e1ce4d518cd095f1aa4cf2e
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontName: Baloo Paaji 2
fontNames:
- Baloo Paaji 2
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
userData:
assetBundleName:
assetBundleVariant:
Copyright (c) 2015 Ek Type (www.ektype.in)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
fileFormatVersion: 2
guid: 590a8eec4c83b4e0fbb453354373b5c8
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 49b73b01aba304f91a39c04a213b3e62
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 0c741eaf6931f4802a280207ade3e693
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: c579800a1f29c4ec9b11440fd1b66271
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: c59c6e595914f4c858a7c2889f5a4b4b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEngine.SceneManagement;
namespace LightDev.Core
{
public sealed class ApplicationManager : MonoBehaviour
{
private bool isNeedToChangeTimeScale = false;
private void Awake()
{
//DontDestroyOnLoad(this);
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Events.SceneLoaded.Call();
}
private void OnApplicationFocus(bool focus)
{
if (focus)
{
if (isNeedToChangeTimeScale)
Time.timeScale = 1;
Events.ApplicationResumed.Call();
}
else
{
if (isNeedToChangeTimeScale)
Time.timeScale = 0;
Events.ApplicationPaused.Call();
}
}
private void OnApplicationPause(bool pause)
{
if (pause)
{
if (isNeedToChangeTimeScale)
Time.timeScale = 0;
Events.ApplicationPaused.Call();
}
else
{
if (isNeedToChangeTimeScale)
Time.timeScale = 1;
Events.ApplicationResumed.Call();
}
}
}
}
fileFormatVersion: 2
guid: df6cec8898d0c43368eac35e574a9dff
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
namespace LightDev.Core
{
public class ApplicationManagerLoader : IAutoLoadable
{
static ApplicationManagerLoader()
{
new GameObject(typeof(ApplicationManager).Name, typeof(ApplicationManager));
}
}
}
fileFormatVersion: 2
guid: fc30beca6ed354038907b1f7d0824c1e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Reflection;
using System.Linq;
using UnityEngine;
namespace LightDev.Core
{
/// <summary>
/// Run static constuctors of objects that implement IAutoLoadable before Unity scene loaded.
/// </summary>
public class AutoLoader
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void LoadAutoLoadableObjects()
{
const string assemblyName = "Assembly-CSharp";
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.GetName().Name.Equals(assemblyName))
{
foreach (Type type in assembly.GetTypes())
{
if (type.GetInterfaces().Contains(typeof(IAutoLoadable)))
{
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
}
}
}
}
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: d090cb027c02c4dd484a2266db84dd14
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
namespace LightDev.Core
{
/// <summary>
/// Marks object where static constructor automatically called before Unity scene loaded.
///
/// Note: do not create object that impelements IAutoLoadable by yourself. Everything done by AutoLoader.
///
/// Remember: static constuctor called only once in whole Game.
/// </summary>
public interface IAutoLoadable
{
}
}
fileFormatVersion: 2
guid: 4d26f0221724541a4a670c3336dca498
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 15af83eaca9004b70b65ee39e56d9eb2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using DG.Tweening;
namespace LightDev.Core
{
public sealed class TweenManager : IAutoLoadable
{
static TweenManager()
{
Subscribe();
InitializeDOTween();
}
private static void InitializeDOTween()
{
DOTween.Init(false, false, LogBehaviour.ErrorsOnly).SetCapacity(500, 100);
DOTween.defaultEaseType = Ease.Linear;
DOTween.defaultUpdateType = UpdateType.Normal;
DOTween.useSafeMode = false;
}
private static void Subscribe()
{
Events.ApplicationResumed += OnApplicationResumed;
Events.ApplicationPaused += OnApplicationPaused;
}
private static void OnApplicationPaused()
{
DOTween.PauseAll();
}
private static void OnApplicationResumed()
{
DOTween.PlayAll();
}
}
}
fileFormatVersion: 2
guid: e97dc952e60b144b3a9df61190724252
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 6f70e71ba5ec54126936dca92945bd4c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
namespace LightDev.Core
{
public partial class Base
{
public virtual void Unparent()
{
transform.parent = null;
}
public virtual void SetSiblingIndex(int index)
{
transform.SetSiblingIndex(index);
}
public virtual Vector3 GetPosition()
{
if(transform is RectTransform)
return ((RectTransform)transform).anchoredPosition;
return transform.position;
}
public virtual float GetPositionX()
{
if (transform is RectTransform)
return ((RectTransform)transform).anchoredPosition.x;
return transform.position.x;
}
public virtual float GetPositionY()
{
if (transform is RectTransform)
return ((RectTransform)transform).anchoredPosition.y;
return transform.position.y;
}
public virtual float GetPositionZ()
{
if (transform is RectTransform)
throw new System.NotImplementedException("RectTransfrom does not have anchoredPosition.z");
return transform.position.z;
}
public virtual Vector3 GetLocalPosition()
{
if (transform is RectTransform)
return ((RectTransform)transform).anchoredPosition;
return transform.localPosition;
}
public virtual float GetLocalPositionX()
{
if (transform is RectTransform)
return ((RectTransform)transform).anchoredPosition.x;
return transform.localPosition.x;
}
public virtual float GetLocalPositionY()
{
if (transform is RectTransform)
return ((RectTransform)transform).anchoredPosition.y;
return transform.localPosition.y;
}
public virtual float GetLocalPositionZ()
{
if (transform is RectTransform)
throw new System.NotImplementedException("RectTransfrom does not have anchoredPosition.z");
return transform.localPosition.z;
}
public virtual Quaternion GetRotation()
{
return transform.rotation;
}
public virtual Quaternion GetLocalRotation()
{
return transform.localRotation;
}
public virtual Vector3 GetEulerRotation()
{
return transform.eulerAngles;
}
public virtual Vector3 GetLocalEulerRotation()
{
return transform.localEulerAngles;
}
public virtual float GetRotationX()
{
return transform.eulerAngles.x;
}
public virtual float GetRotationY()
{
return transform.eulerAngles.y;
}
public virtual float GetRotationZ()
{
return transform.eulerAngles.z;
}
public virtual float GetLocalRotationX()
{
return transform.localEulerAngles.x;
}
public virtual float GetLocalRotationY()
{
return transform.localEulerAngles.y;
}
public virtual float GetLocalRotationZ()
{
return transform.localEulerAngles.z;
}
public virtual Vector3 GetScale()
{
return transform.localScale;
}
public virtual float GetScaleX()
{
return transform.localScale.x;
}
public virtual float GetScaleY()
{
return transform.localScale.y;
}
public virtual float GetScaleZ()
{
return transform.localScale.z;
}
public virtual void SetPosition(Vector3 position)
{
if (transform is RectTransform)
{
((RectTransform)transform).anchoredPosition = position;
}
else
{
transform.position = position;
}
}
public virtual void SetPositionX(float x)
{
if (transform is RectTransform)
{
RectTransform rectTransform = (RectTransform)transform;
rectTransform.anchoredPosition = new Vector2(x, rectTransform.anchoredPosition.y);
}
else
{
transform.position = new Vector3(x, transform.position.y, transform.position.z);
}
}
public virtual void SetPositionY(float y)
{
if (transform is RectTransform)
{
RectTransform rectTransform = (RectTransform)transform;
rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, y);
}
else
{
transform.position = new Vector3(transform.position.x, y, transform.position.z);
}
}
public virtual void SetPositionZ(float z)
{
if (transform is RectTransform)
{
throw new System.NotImplementedException("RectTransfrom does not have anchoredPosition.z");
}
else
{
transform.position = new Vector3(transform.position.x, transform.position.y, z);
}
}
public virtual void SetLocalPosition(Vector3 localPosition)
{
if (transform is RectTransform)
{
((RectTransform)transform).anchoredPosition = localPosition;
}
else
{
transform.localPosition = localPosition;
}
}
public virtual void SetLocalPositionX(float x)
{
if (transform is RectTransform)
{
RectTransform rectTransform = (RectTransform)transform;
rectTransform.anchoredPosition = new Vector2(x, rectTransform.anchoredPosition.y);
}
else
{
transform.localPosition = new Vector3(x, transform.localPosition.y, transform.localPosition.z);
}
}
public virtual void SetLocalPositionY(float y)
{
if (transform is RectTransform)
{
RectTransform rectTransform = (RectTransform)transform;
rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, y);
}
else
{
transform.localPosition = new Vector3(transform.localPosition.x, y, transform.localPosition.z);
}
}
public virtual void SetLocalPositionZ(float z)
{
if (transform is RectTransform)
{
throw new System.NotImplementedException("RectTransfrom does not have anchoredPosition.z");
}
else
{
transform.localPosition = new Vector3(transform.localPosition.x, transform.localPosition.y, z);
}
}
public virtual void SetRotation(Quaternion rotation)
{
transform.rotation = rotation;
}
public virtual void SetRotation(Vector3 eulerAngles)
{
transform.eulerAngles = eulerAngles;
}
public virtual void SetLocalRotation(Quaternion rotation)
{
transform.localRotation = rotation;
}
public virtual void SetLocalRotation(Vector3 eulerAngles)
{
transform.localEulerAngles = eulerAngles;
}
public virtual void SetRotationX(float x)
{
transform.eulerAngles = new Vector3(x, transform.eulerAngles.y, transform.eulerAngles.z);
}
public virtual void SetRotationY(float y)
{
transform.eulerAngles = new Vector3(transform.eulerAngles.x, y, transform.eulerAngles.z);
}
public virtual void SetRotationZ(float z)
{
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, z);
}
public virtual void SetLocalRotationX(float x)
{
transform.localEulerAngles = new Vector3(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
}
public virtual void SetLocalRotationY(float y)
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
}
public virtual void SetLocalRotationZ(float z)
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
}
public virtual void SetScale(Vector3 scale)
{
transform.localScale = scale;
}
public virtual void SetScale(float scale)
{
transform.localScale = new Vector3(scale, scale, scale);
}
public virtual void SetScale(float x, float y, float z)
{
transform.localScale = new Vector3(x, y, z);
}
public virtual void SetScaleX(float x)
{
transform.localScale = new Vector3(x, transform.localScale.y, transform.localScale.z);
}
public virtual void SetScaleY(float y)
{
transform.localScale = new Vector3(transform.localScale.x, y, transform.localScale.z);
}
public virtual void SetScaleZ(float z)
{
transform.localScale = new Vector3(transform.localScale.x, transform.localScale.y, z);
}
}
}
fileFormatVersion: 2
guid: 498f127f8c3f8423b86a22c10696be5c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
namespace LightDev.Core
{
public partial class Base
{
protected List<Sequence> sequences = new List<Sequence>();
protected virtual void OnDisable()
{
KillSequences();
}
public virtual Sequence Sequence(params Tween[] tweens)
{
Sequence sequence = DOTween.Sequence();
if(gameObject.layer == LayerMask.NameToLayer("UI"))
{
sequence.SetUpdate(true);
}
foreach(Tween tween in tweens)
{
sequence.Append(tween);
}
sequence.OnKill(() =>
{
this.sequences.Remove(sequence);
});
this.sequences.Add(sequence);
return sequence;
}
public virtual void PauseSequence(string id)
{
for (int i = 0; i < this.sequences.Count; i++)
{
if (this.sequences[i].stringId != null && this.sequences[i].stringId.Equals(id))
{
this.sequences[i].Pause();
}
}
}
public virtual void PauseSequences()
{
foreach (Sequence sequence in this.sequences)
{
sequence.Pause();
}
}
public virtual void ResumeSequence(string id)
{
for (int i = 0; i < this.sequences.Count; i++)
{
if (this.sequences[i].stringId != null && this.sequences[i].stringId.Equals(id))
{
this.sequences[i].Play();
}
}
}
public virtual void ResumeSequences()
{
foreach (Sequence sequence in this.sequences)
{
sequence.Play();
}
}
public virtual void KillSequence(string id, bool complete = false)
{
for (int i = this.sequences.Count - 1; i >= 0; i--)
{
if (this.sequences[i].stringId != null && this.sequences[i].stringId.Equals(id))
{
var sequence = this.sequences[i];
this.sequences.RemoveAt(i);
sequence.Kill(complete);
}
}
}
public virtual void KillSequences(bool complete = false)
{
for (int i = this.sequences.Count - 1; i >= 0; i--)
{
this.sequences[i].Kill(complete);
}
this.sequences.Clear();
}
public virtual bool ContainsSequence(string id)
{
for(int i = 0; i < this.sequences.Count; i++)
{
if(sequences[i].stringId != null && sequences[i].stringId.Equals(id))
{
return true;
}
}
return false;
}
public virtual bool IsAnySequenceRunning()
{
return sequences.Count != 0;
}
public virtual Tween Delay(float delay)
{
return DOTween.Sequence().AppendInterval(delay);
}
public virtual Tween OnFinish(TweenCallback tweenCallback)
{
return DOTween.Sequence().AppendCallback(tweenCallback);
}
public virtual Tween Move(Vector3 endValue, float duration)
{
if(transform is RectTransform)
return ((RectTransform)transform).DOAnchorPos(endValue, duration);
return transform.DOMove(endValue, duration);
}
public virtual Tween MoveX(float endValue, float duration)
{
if (transform is RectTransform)
return ((RectTransform)transform).DOAnchorPosX(endValue, duration);
return transform.DOMoveX(endValue, duration);
}
public virtual Tween MoveY(float endValue, float duration)
{
if (transform is RectTransform)
return ((RectTransform)transform).DOAnchorPosY(endValue, duration);
return transform.DOMoveY(endValue, duration);
}
public virtual Tween MoveZ(float endValue, float duration)
{
if (transform is RectTransform)
throw new System.NotImplementedException("RectTransfrom does not have anchoredPosition.z");
return transform.DOMoveZ(endValue, duration);
}
public virtual Tween MoveLocal(Vector3 endValue, float duration)
{
if (transform is RectTransform)
return ((RectTransform)transform).DOAnchorPos(endValue, duration);
return transform.DOLocalMove(endValue, duration);
}
public virtual Tween MoveLocalX(float endValue, float duration)
{
if (transform is RectTransform)
return ((RectTransform)transform).DOAnchorPosX(endValue, duration);
return transform.DOLocalMoveX(endValue, duration);
}
public virtual Tween MoveLocalY(float endValue, float duration)
{
if (transform is RectTransform)
return ((RectTransform)transform).DOAnchorPosY(endValue, duration);
return transform.DOLocalMoveY(endValue, duration);
}
public virtual Tween MoveLocalZ(float endValue, float duration)
{
if (transform is RectTransform)
throw new System.NotImplementedException("RectTransfrom does not have anchoredPosition.z");
return transform.DOLocalMoveZ(endValue, duration);
}
public virtual Tween Rotate(Quaternion endValue, float duration)
{
return transform.DORotateQuaternion(endValue, duration);
}
public virtual Tween Rotate(Vector3 endValue, float duration)
{
return transform.DORotate(endValue, duration);
}
public virtual Tween RotateX(float endValue, float duration)
{
return transform.DORotate(new Vector3(endValue, GetRotationY(), GetRotationZ()), duration);
}
public virtual Tween RotateY(float endValue, float duration)
{
return transform.DORotate(new Vector3(GetRotationX(), endValue, GetRotationZ()), duration);
}
public virtual Tween RotateZ(float endValue, float duration)
{
return transform.DORotate(new Vector3(GetRotationX(), GetRotationY(), endValue), duration);
}
public virtual Tween RotateLocal(Quaternion endValue, float duration)
{
return transform.DOLocalRotateQuaternion(endValue, duration);
}
public virtual Tween RotateLocal(Vector3 endValue, float duration)
{
return transform.DOLocalRotate(endValue, duration);
}
public virtual Tween RotateLocalX(float endValue, float duration)
{
return transform.DOLocalRotate(new Vector3(endValue, GetLocalRotationY(), GetLocalRotationZ()), duration);
}
public virtual Tween RotateLocalY(float endValue, float duration)
{
return transform.DOLocalRotate(new Vector3(GetLocalRotationX(), endValue, GetLocalRotationZ()), duration);
}
public virtual Tween RotateLocalZ(float endValue, float duration)
{
return transform.DOLocalRotate(new Vector3(GetLocalRotationX(), GetLocalRotationY(), endValue), duration);
}
public virtual Tween Scale(Vector3 endValue, float duration)
{
return transform.DOScale(endValue, duration);
}
public virtual Tween Scale(float endValue, float duration)
{
return Scale(new Vector3(endValue, endValue, endValue), duration);
}
public virtual Tween ScaleX(float endValue, float duration)
{
return transform.DOScaleX(endValue, duration);
}
public virtual Tween ScaleY(float endValue, float duration)
{
return transform.DOScaleY(endValue, duration);
}
public virtual Tween ScaleZ(float endValue, float duration)
{
return transform.DOScaleZ(endValue, duration);
}
public virtual Tween Fade(float endValue, float duration)
{
if(GetComponent<Image>())
{
return GetComponent<Image>().DOFade(endValue, duration);
}
if(GetComponent<Text>())
{
return GetComponent<Text>().DOFade(endValue, duration);
}
throw new NotImplementedException();
}
public virtual Tween Color(Color endValue, float duration)
{
if (GetComponent<Image>())
{
return GetComponent<Image>().DOColor(endValue, duration);
}
if(GetComponent<Text>())
{
return GetComponent<Text>().DOColor(endValue, duration);
}
throw new NotImplementedException();
}
}
}
fileFormatVersion: 2
guid: ec1f5690d53bc4f11afe40d723294481
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using UnityEngine;
using UnityEngine.UI;
namespace LightDev.Core
{
public partial class Base
{
public virtual float GetFade()
{
if (GetComponent<Image>())
{
return GetComponent<Image>().color.a;
}
if(GetComponent<Text>())
{
return GetComponent<Text>().color.a;
}
throw new NotImplementedException();
}
public virtual void SetFade(float fade)
{
if(GetComponent<Image>())
{
Image img = GetComponent<Image>();
Color color = img.color;
color.a = fade;
img.color = color;
return;
}
if(GetComponent<Text>())
{
Text text = GetComponent<Text>();
Color color = text.color;
color.a = fade;
text.color = color;
return;
}
throw new NotImplementedException();
}
public virtual Color GetColor()
{
if (GetComponent<Image>())
{
return GetComponent<Image>().color;
}
if(GetComponent<Text>())
{
return GetComponent<Text>().color;
}
throw new NotImplementedException();
}
public virtual void SetColor(Color color)
{
if (GetComponent<Image>())
{
GetComponent<Image>().color = color;
return;
}
if(GetComponent<Text>())
{
GetComponent<Text>().color = color;
return;
}
throw new NotImplementedException();
}
}
}
fileFormatVersion: 2
guid: 50fce94467b4b451da81e08ce16694ca
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections;
using UnityEngine;
namespace LightDev.Core
{
/// <summary>
/// Base class in LightDev framework that derived from MonoBehaviour.
/// </summary>
public partial class Base : MonoBehaviour
{
/// <summary>
/// Activates GameObject
/// </summary>
public void Activate()
{
this.gameObject.SetActive(true);
}
/// <summary>
/// Deactivates GameObject
/// </summary>
public void Deactivate()
{
this.gameObject.SetActive(false);
}
/// <summary>
/// Invoke action after delay.
///
/// Returns Coroutine, so you can stop it if it is needed.
/// </summary>
public Coroutine DelayAction(float delay, Action action, bool timeIndependent = true)
{
return StartCoroutine(DelayCoroutine(delay, action, timeIndependent));
}
private IEnumerator DelayCoroutine(float delay, Action action, bool timeIndependent = true)
{
float time = delay;
while (time >= 0)
{
time -= timeIndependent ? Time.unscaledDeltaTime : Time.deltaTime;
yield return null;
}
action.Invoke();
}
}
}
fileFormatVersion: 2
guid: 00108062a96cb4700a251fa6cf0aaf2b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 17f5e6e30ef1e4a07812a3adc3626eb1
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 0865ec02aa0e34062a71b2c95046a169
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 22d71a7eb233845309f1441d33877a9d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections.Generic;
namespace LightDev
{
public sealed class Event<T1, T2, T3> : IEvent
{
private readonly List<Action<T1, T2, T3>> subscribers;
public Event(string name) : base(name)
{
subscribers = new List<Action<T1, T2, T3>>();
}
public void Call(T1 parameter1, T2 parameter2, T3 parameter3)
{
for (int i = subscribers.Count - 1; i >= 0; --i)
{
subscribers[i].Invoke(parameter1, parameter2, parameter3);
}
}
public static Event<T1, T2, T3> operator +(Event<T1, T2, T3> e, Action<T1, T2, T3> subscriber)
{
e.DoubleSubscriptionCheck(subscriber);
e.subscribers.Add(subscriber);
return e;
}
public static Event<T1, T2, T3> operator -(Event<T1, T2, T3> e, Action<T1, T2, T3> subscriber)
{
e.subscribers.Remove(subscriber);
return e;
}
private void DoubleSubscriptionCheck(Action<T1, T2, T3> subscriber)
{
if (subscribers.Contains(subscriber))
{
ThrowSubscribeException();
}
}
}
}
fileFormatVersion: 2
guid: d7bd4f708bf0847d2ae3046d5d1a1092
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections.Generic;
namespace LightDev
{
public sealed class Event<T1, T2> : IEvent
{
private readonly List<Action<T1, T2>> subscribers;
public Event(string name) : base(name)
{
subscribers = new List<Action<T1, T2>>();
}
public void Call(T1 parameter1, T2 parameter2)
{
for (int i = subscribers.Count - 1; i >= 0; --i)
{
subscribers[i].Invoke(parameter1, parameter2);
}
}
public static Event<T1, T2> operator +(Event<T1, T2> e, Action<T1, T2> subscriber)
{
e.DoubleSubscriptionCheck(subscriber);
e.subscribers.Add(subscriber);
return e;
}
public static Event<T1, T2> operator -(Event<T1, T2> e, Action<T1, T2> subscriber)
{
e.subscribers.Remove(subscriber);
return e;
}
private void DoubleSubscriptionCheck(Action<T1, T2> subscriber)
{
if (subscribers.Contains(subscriber))
{
ThrowSubscribeException();
}
}
}
}
fileFormatVersion: 2
guid: ace128f88cbf445e8a5b5e441ac0d934
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections.Generic;
namespace LightDev
{
public sealed class Event<T> : IEvent
{
private readonly List<Action<T>> subscribers;
public Event(string name) : base(name)
{
subscribers = new List<Action<T>>();
}
public void Call(T parameter)
{
for (int i = subscribers.Count - 1; i >= 0; --i)
{
subscribers[i].Invoke(parameter);
}
}
public static Event<T> operator +(Event<T> e, Action<T> subscriber)
{
e.DoubleSubscriptionCheck(subscriber);
e.subscribers.Add(subscriber);
return e;
}
public static Event<T> operator -(Event<T> e, Action<T> subscriber)
{
e.subscribers.Remove(subscriber);
return e;
}
private void DoubleSubscriptionCheck(Action<T> subscriber)
{
if (subscribers.Contains(subscriber))
{
ThrowSubscribeException();
}
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: e2485ab5e63624e88b954797bb19676d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections.Generic;
namespace LightDev
{
public sealed class Event : IEvent
{
private readonly List<Action> subscribers;
public Event(string name) : base(name)
{
subscribers = new List<Action>();
}
public void Call()
{
for(int i = subscribers.Count - 1; i >= 0; --i)
{
subscribers[i].Invoke();
}
}
public static Event operator +(Event e, Action subscriber)
{
e.DoubleSubscriptionCheck(subscriber);
e.subscribers.Add(subscriber);
return e;
}
public static Event operator -(Event e, Action subscriber)
{
e.subscribers.Remove(subscriber);
return e;
}
private void DoubleSubscriptionCheck(Action subscriber)
{
if (subscribers.Contains(subscriber))
{
ThrowSubscribeException();
}
}
}
}
fileFormatVersion: 2
guid: 56dab1970acdc48cb82a8ad2bf6b362c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
namespace LightDev
{
public abstract class IEvent
{
protected readonly string name;
protected IEvent(string name)
{
this.name = name;
}
protected void ThrowSubscribeException()
{
UnityEngine.Debug.LogException(new Exception("Event duplicate subscription detected: " + name));
}
}
}
fileFormatVersion: 2
guid: 75e04dee2980446dcac482d0e3969257
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
namespace LightDev
{
public partial class Events
{
public static Event ApplicationPaused;
public static Event ApplicationResumed;
public static Event SceneLoaded;
}
}
fileFormatVersion: 2
guid: 4f699ab0bd33f40eabb726d8ad7ea269
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Reflection;
namespace LightDev
{
public partial class Events
{
static Events()
{
FieldInfo[] fields = typeof(Events).GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
if (field.FieldType.IsSubclassOf(typeof(IEvent)))
{
field.SetValue(null, Activator.CreateInstance(field.FieldType, field.Name));
}
}
}
}
}
fileFormatVersion: 2
guid: baf1001329a6949dbaf3018f5405925a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 5ee0a54241f2c4dd3b0ee4705af74936
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using LightDev.Core;
namespace LightDev.Pool
{
/// <summary>
/// Object that can be used by PoolsManager.
/// If you want to use it by PoolsManager, place prefab to Recources folder.
///
/// Warning: Awake() and Start() methods will be called only once, as object Instantiated only once.
/// Instead, use OnRetrieved() method.
/// </summary>
public abstract class PoolableElement : Base
{
/// <summary>
/// Called when the object is taken from pool.
/// Used for subscribing to Events in the game.
/// Warning: do not forget to Unsubcribe.
/// </summary>
public virtual void Subscribe()
{
}
/// <summary>
/// Called when the object returned to pool.
/// Used for unsubscribing from Events in the game.
/// </summary>
public virtual void Unsubscribe()
{
}
/// <summary>
/// Called when the object is taken from pool.
/// </summary>
public virtual void OnRetrieved()
{
}
/// <summary>
/// Called when the object returned to pool.
/// </summary>
public virtual void OnReturned()
{
}
}
}
fileFormatVersion: 2
guid: 70b6ba40220a744ba8cc47bf5760ccbf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections.Generic;
using UnityEngine;
using LightDev.Core;
namespace LightDev.Pool
{
/// <summary>
/// Works with all objects that derived from PoolableElement.
/// These objects must be placed in Resources folder.
/// </summary>
public class PoolsManager : IAutoLoadable
{
private static readonly Dictionary<Type, Pool> pools = new Dictionary<Type, Pool>();
static PoolsManager()
{
//CreatePools();
}
private static void CreatePools()
{
foreach (PoolableElement element in Resources.LoadAll<PoolableElement>(""))
{
Type type = element.GetType();
if (!pools.ContainsKey(type)) pools.Add(type, new Pool(type));
pools[type].AddElementPrefab(element);
}
}
/// <summary>
/// Retrieves element of type T from Pool.
///
/// PreCreate called before element's GameObject become active, and Subscribe() and OnRetrieved() called.
/// For example, PreCreate can be used for setup Position and Rotation, Trail problem.
/// </summary>
public static T RetrieveElement<T>(Action<T> preCreate = null) where T : PoolableElement
{
return pools[typeof(T)].RetrieveElement<T>(preCreate);
}
/// <summary>
/// Returns element to Pool.
/// </summary>
public static void ReturnElement(PoolableElement element)
{
pools[element.GetType()].ReturnElement(element);
}
/// <summary>
/// Returns all active elements of type T to Pool.
/// </summary>
public static void ReturnElements<T>() where T : PoolableElement
{
pools[typeof(T)].ReturnAllElements();
}
/// <summary>
/// Get all active elements of type T.
/// </summary>
public static List<T> GetActiveElements<T>() where T : PoolableElement
{
return pools[typeof(T)].GetActiveElements<T>();
}
/// <summary>
/// Destroy all elements in Pool.
///
/// Can be used to free memory.
/// </summary>
public static void DestroyElements<T>() where T : PoolableElement
{
pools[typeof(T)].DestroyElements();
}
private class Pool
{
private List<PoolableElement> elementPrefabs = new List<PoolableElement>();
private List<PoolableElement> activeElements = new List<PoolableElement>();
private List<PoolableElement> inactiveElements = new List<PoolableElement>();
private GameObject holder;
public Pool(Type type)
{
holder = new GameObject("pool." + type.Name);
GameObject.DontDestroyOnLoad(holder);
}
public void AddElementPrefab(PoolableElement element)
{
elementPrefabs.Add(element);
}
public T RetrieveElement<T>(Action<T> preCreate = null) where T : PoolableElement
{
PoolableElement element = (inactiveElements.Count == 0) ? Instantiate() : GetFromInactiveElements();
RetrieveElementActions(element as T, preCreate);
return element as T;
}
public void ReturnElement(PoolableElement element)
{
ReturnElementActions(element);
activeElements.Remove(element);
inactiveElements.Add(element);
}
public void ReturnAllElements()
{
foreach (PoolableElement element in activeElements)
{
ReturnElementActions(element);
}
inactiveElements.AddRange(activeElements);
activeElements.Clear();
}
public List<T> GetActiveElements<T>() where T : PoolableElement
{
List<T> elements = new List<T>();
for(int i = 0; i < activeElements.Count; i++)
{
elements.Add(activeElements[i] as T);
}
return elements;
}
public void DestroyElements()
{
foreach(PoolableElement element in activeElements)
{
UnityEngine.GameObject.Destroy(element.gameObject);
}
foreach(PoolableElement element in inactiveElements)
{
UnityEngine.GameObject.Destroy(element.gameObject);
}
activeElements.Clear();
inactiveElements.Clear();
}
private PoolableElement Instantiate()
{
var randomPrefabIndex = UnityEngine.Random.Range(0, elementPrefabs.Count);
var element = UnityEngine.Object.Instantiate(elementPrefabs[randomPrefabIndex]);
MonoBehaviour.DontDestroyOnLoad(element);
element.name = elementPrefabs[randomPrefabIndex].name;
element.transform.SetParent(holder.transform, false);
element.Deactivate();
return element;
}
private PoolableElement GetFromInactiveElements()
{
var randomInactiveElementIndex = UnityEngine.Random.Range(0, inactiveElements.Count);
var element = inactiveElements[randomInactiveElementIndex];
inactiveElements.RemoveAt(randomInactiveElementIndex);
return element;
}
private void RetrieveElementActions<T>(T element, Action<T> preCreate = null) where T : PoolableElement
{
preCreate?.Invoke(element);
activeElements.Add(element);
element.Activate();
element.Subscribe();
element.OnRetrieved();
}
private void ReturnElementActions(PoolableElement element)
{
element.Unsubscribe();
element.OnReturned();
element.Deactivate();
element.transform.SetParent(holder.transform, false);
}
}
}
}
fileFormatVersion: 2
guid: 9ef85b313a1ce4ad194fa4e953923edc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: ef65f6720412c44b5a462b3084b57ad3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
namespace LightDev.Scriptable
{
/// <summary>
/// Automatically loaded by ScriptableManager.
///
/// Note: must be placed in Resources folder.
/// </summary>
public class AutoLoadableScriptable : ScriptableObject
{
}
}
fileFormatVersion: 2
guid: 7f39ead05df9944c39278d9a8160bde3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections.Generic;
using LightDev.Core;
using UnityEngine;
namespace LightDev.Scriptable
{
/// <summary>
/// Load all ScriptableObjects that placed in Resources folder and derived from AutoLoadableScriptable.
/// </summary>
public class ScriptableManager : IAutoLoadable
{
private static readonly Dictionary<Type, AutoLoadableScriptable> scriptables = new Dictionary<Type, AutoLoadableScriptable>();
static ScriptableManager()
{
foreach (AutoLoadableScriptable settings in Resources.LoadAll<AutoLoadableScriptable>(""))
{
scriptables.Add(settings.GetType(), settings);
}
}
/// <summary>
/// Returns ScriptableObject that derived from AutoLoadableScriptable and placed in Resources folder.
/// </summary>
public static T GetScriptableObject<T>() where T : AutoLoadableScriptable
{
return scriptables[typeof(T)] as T;
}
}
}
fileFormatVersion: 2
guid: 5aa3c64d8c53b4bf2b994da7e2514c7d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 42de7de658340421c93ce1f49c8970ad
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 3368e33e98d73427cbaf5dc8c08b4688
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using LightDev.Core;
using DG.Tweening;
namespace LightDev.UI
{
[RequireComponent(typeof(Image))]
public abstract class BaseButton : Base, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
public UnityEvent onClick;
protected Image image;
public bool IsRaycaseTarget() { return image.raycastTarget; }
public void SetRaycastTarget(bool raycaseTarget) { image.raycastTarget = raycaseTarget; }
protected virtual void Awake()
{
image = GetComponent<Image>();
}
public virtual void OnPointerClick(PointerEventData eventData)
{
onClick.Invoke();
}
public virtual void OnPointerDown(PointerEventData eventData)
{
KillSequences();
}
public virtual void OnPointerUp(PointerEventData eventData)
{
KillSequences();
}
public virtual void AnimateFadeShow(float time = 0.3f)
{
KillSequences();
SetFade(0);
Sequence(
Fade(1, time).SetEase(Ease.InSine)
);
}
public virtual void AnimateScaleShow(float time = 0.3f)
{
KillSequences();
SetScale(0);
Sequence(
Scale(1, time).SetEase(Ease.OutBack)
);
}
}
}
fileFormatVersion: 2
guid: b606175890cba491eafbfe80a09874ed
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace LightDev.UI
{
[RequireComponent(typeof(Image))]
public class BaseButtonColor : BaseButton
{
[Space]
public Color pressedColor = new Color(200 / 255f, 200 / 255f, 200 / 255f, 255 / 255f);
protected Color normalColor;
protected override void Awake()
{
base.Awake();
normalColor = GetColor();
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
Sequence(Color(pressedColor, 0.2f));
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
Sequence(Color(normalColor, 0.2f));
}
}
}
fileFormatVersion: 2
guid: bb48a8a7263d3441d81be3622f8d32fe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace LightDev.UI
{
[RequireComponent(typeof(Image))]
public class BaseButtonImage : BaseButton
{
[Space]
public Sprite normalImage;
public Sprite pressedImage;
protected override void Awake()
{
base.Awake();
image.sprite = normalImage;
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
image.sprite = pressedImage;
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
image.sprite = normalImage;
}
}
}
fileFormatVersion: 2
guid: ed64069059c2f45ddbdd9895ff9b6c06
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace LightDev.UI
{
[RequireComponent(typeof(Image))]
public class BaseButtonScale : BaseButton
{
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
Sequence(Scale(0.8f, 0.1f));
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
Sequence(Scale(1f, 0.1f));
}
}
}
fileFormatVersion: 2
guid: bc2f3c546be454d1b802756ce5446caf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using LightDev.Core;
namespace LightDev.UI
{
/// <summary>
/// UI element that controlled by CanvasManager.
///
/// GameObject would be deactived, you need to subscribe on Events to Show.
/// </summary>
public abstract class CanvasElement : Base
{
[Range(0, 10)]
public float showTime;
[Range(0, 10)]
public float hideTime;
private Coroutine showCoroutine;
private Coroutine hideCoroutine;
/// <summary>
/// Called by CanvasManager in Awake method.
///
/// Used for subscribing on events in order to know when to Show UI.
/// </summary>
public virtual void Subscribe()
{
}
/// <summary>
/// Called by CanvasManager in OnDestroy method.
///
/// Unsubscribe from all events.
/// </summary>
public virtual void Unsubscribe()
{
}
protected virtual void OnStartShowing()
{
}
protected virtual void OnFinishShowing()
{
}
protected virtual void OnStartHiding()
{
}
protected virtual void OnFinishHiding()
{
}
/// <summary>
/// 1) Activates GameObject.
/// 2) Calls OnStartShowing().
/// 3) After showTime delay calls OnFinishShowing().
/// </summary>
protected void Show()
{
StopShowCoroutine();
StopHideCoroutine();
Activate();
OnStartShowing();
showCoroutine = DelayAction(showTime, OnFinishShowing);
}
/// <summary>
/// 1) Activates GameObject.
/// 2) Calls OnStartShowing() and then OnFinishShowing() without showTime delay.
/// </summary>
protected void InstantShow()
{
StopShowCoroutine();
StopHideCoroutine();
Activate();
OnStartShowing();
OnFinishShowing();
}
/// <summary>
/// 1) Calls OnStartHiding().
/// 2) After hideTime delay calls OnFinishShowing().
/// 3) Deactivates GameObject.
/// </summary>
protected void Hide()
{
if(gameObject.activeSelf == false) return;
StopShowCoroutine();
StopHideCoroutine();
OnStartHiding();
hideCoroutine = DelayAction(hideTime, () =>
{
OnFinishHiding();
Deactivate();
});
}
/// <summary>
/// 1) Calls OnStartHiding() and then without hideTime delay OnFinishShowing().
/// 2) Deactivates GameObject.
/// </summary>
protected void InstantHide()
{
if(gameObject.activeSelf == false) return;
StopShowCoroutine();
StopHideCoroutine();
OnStartHiding();
OnFinishHiding();
Deactivate();
}
private void StopShowCoroutine()
{
if(showCoroutine != null)
{
StopCoroutine(showCoroutine);
showCoroutine = null;
}
}
private void StopHideCoroutine()
{
if(hideCoroutine != null)
{
StopCoroutine(hideCoroutine);
hideCoroutine = null;
}
}
}
}
fileFormatVersion: 2
guid: 49b982c145a9f4b22993d028ef09e823
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment