初始化仓库

This commit is contained in:
SepComet
2026-02-08 17:08:52 +08:00
commit 8763955323
1132 changed files with 285326 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: edd16bf2e418bec43bc774c7fc6c60d6
folderAsset: yes
timeCreated: 1528026145
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,140 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using UnityEngine;
using UnityGameFramework.Runtime;
/// <summary>
/// 游戏入口。
/// </summary>
public partial class GameEntry : MonoBehaviour
{
/// <summary>
/// 获取游戏基础组件。
/// </summary>
public static BaseComponent Base { get; private set; }
/// <summary>
/// 获取配置组件。
/// </summary>
public static ConfigComponent Config { get; private set; }
/// <summary>
/// 获取数据结点组件。
/// </summary>
public static DataNodeComponent DataNode { get; private set; }
/// <summary>
/// 获取数据表组件。
/// </summary>
public static DataTableComponent DataTable { get; private set; }
/// <summary>
/// 获取调试组件。
/// </summary>
public static DebuggerComponent Debugger { get; private set; }
/// <summary>
/// 获取下载组件。
/// </summary>
public static DownloadComponent Download { get; private set; }
/// <summary>
/// 获取实体组件。
/// </summary>
public static EntityComponent Entity { get; private set; }
/// <summary>
/// 获取事件组件。
/// </summary>
public static EventComponent Event { get; private set; }
/// <summary>
/// 获取文件系统组件。
/// </summary>
public static FileSystemComponent FileSystem { get; private set; }
/// <summary>
/// 获取有限状态机组件。
/// </summary>
public static FsmComponent Fsm { get; private set; }
/// <summary>
/// 获取本地化组件。
/// </summary>
public static LocalizationComponent Localization { get; private set; }
/// <summary>
/// 获取网络组件。
/// </summary>
public static NetworkComponent Network { get; private set; }
/// <summary>
/// 获取对象池组件。
/// </summary>
public static ObjectPoolComponent ObjectPool { get; private set; }
/// <summary>
/// 获取流程组件。
/// </summary>
public static ProcedureComponent Procedure { get; private set; }
/// <summary>
/// 获取资源组件。
/// </summary>
public static ResourceComponent Resource { get; private set; }
/// <summary>
/// 获取场景组件。
/// </summary>
public static SceneComponent Scene { get; private set; }
/// <summary>
/// 获取配置组件。
/// </summary>
public static SettingComponent Setting { get; private set; }
/// <summary>
/// 获取声音组件。
/// </summary>
public static SoundComponent Sound { get; private set; }
/// <summary>
/// 获取界面组件。
/// </summary>
public static UIComponent UI { get; private set; }
/// <summary>
/// 获取网络组件。
/// </summary>
public static WebRequestComponent WebRequest { get; private set; }
private static void InitBuiltinComponents()
{
Base = UnityGameFramework.Runtime.GameEntry.GetComponent<BaseComponent>();
Config = UnityGameFramework.Runtime.GameEntry.GetComponent<ConfigComponent>();
DataNode = UnityGameFramework.Runtime.GameEntry.GetComponent<DataNodeComponent>();
DataTable = UnityGameFramework.Runtime.GameEntry.GetComponent<DataTableComponent>();
Debugger = UnityGameFramework.Runtime.GameEntry.GetComponent<DebuggerComponent>();
Download = UnityGameFramework.Runtime.GameEntry.GetComponent<DownloadComponent>();
Entity = UnityGameFramework.Runtime.GameEntry.GetComponent<EntityComponent>();
Event = UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponent>();
FileSystem = UnityGameFramework.Runtime.GameEntry.GetComponent<FileSystemComponent>();
Fsm = UnityGameFramework.Runtime.GameEntry.GetComponent<FsmComponent>();
Localization = UnityGameFramework.Runtime.GameEntry.GetComponent<LocalizationComponent>();
Network = UnityGameFramework.Runtime.GameEntry.GetComponent<NetworkComponent>();
ObjectPool = UnityGameFramework.Runtime.GameEntry.GetComponent<ObjectPoolComponent>();
Procedure = UnityGameFramework.Runtime.GameEntry.GetComponent<ProcedureComponent>();
Resource = UnityGameFramework.Runtime.GameEntry.GetComponent<ResourceComponent>();
Scene = UnityGameFramework.Runtime.GameEntry.GetComponent<SceneComponent>();
Setting = UnityGameFramework.Runtime.GameEntry.GetComponent<SettingComponent>();
Sound = UnityGameFramework.Runtime.GameEntry.GetComponent<SoundComponent>();
UI = UnityGameFramework.Runtime.GameEntry.GetComponent<UIComponent>();
WebRequest = UnityGameFramework.Runtime.GameEntry.GetComponent<WebRequestComponent>();
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 98387342fa09ebd46a2ab54100d80c2f
timeCreated: 1528026146
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,24 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using CustomComponent;
using UnityEngine;
/// <summary>
/// 游戏入口。
/// </summary>
public partial class GameEntry : MonoBehaviour
{
public static BuiltinDataComponent BuiltinData { get; private set; }
public static CombineComponent Combine { get; private set; }
private static void InitCustomComponents()
{
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>();
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f95ee7b97daca3f44a2f5cf743bb39ac
timeCreated: 1528026146
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+20
View File
@@ -0,0 +1,20 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using UnityEngine;
/// <summary>
/// 游戏入口。
/// </summary>
public partial class GameEntry : MonoBehaviour
{
private void Start()
{
InitBuiltinComponents();
InitCustomComponents();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3d09b8a3e8c0e7e4dbcfd2fa52bf69ea
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: -110
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 33ba0562010e2da46883baefb271f573
folderAsset: yes
timeCreated: 1528026146
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,62 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework;
using StarForce;
using UI;
using UnityEngine;
using UnityEngine.Serialization;
using UnityGameFramework.Runtime;
namespace CustomComponent
{
public class BuiltinDataComponent : GameFrameworkComponent
{
[FormerlySerializedAs("m_BuildInfoTextAsset")] [SerializeField] private TextAsset _buildInfoTextAsset = null;
[FormerlySerializedAs("m_DefaultDictionaryTextAsset")] [SerializeField] private TextAsset _defaultDictionaryTextAsset = null;
[FormerlySerializedAs("m_UpdateResourceFormTemplate")] [SerializeField] private UpdateResourceForm _updateResourceFormTemplate = null;
private BuildInfo _buildInfo = null;
public BuildInfo BuildInfo => _buildInfo;
public UpdateResourceForm UpdateResourceFormTemplate => _updateResourceFormTemplate;
public void InitBuildInfo()
{
if (_buildInfoTextAsset == null || string.IsNullOrEmpty(_buildInfoTextAsset.text))
{
Log.Info("Build info can not be found or empty.");
return;
}
_buildInfo = Utility.Json.ToObject<BuildInfo>(_buildInfoTextAsset.text);
if (_buildInfo == null)
{
Log.Warning("Parse build info failure.");
return;
}
}
public void InitDefaultDictionary()
{
if (_defaultDictionaryTextAsset == null || string.IsNullOrEmpty(_defaultDictionaryTextAsset.text))
{
Log.Info("Default dictionary can not be found or empty.");
return;
}
if (!GameEntry.Localization.ParseData(_defaultDictionaryTextAsset.text))
{
Log.Warning("Parse default dictionary failure.");
return;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: cfb0b001fcb30fe45ac95ddb8c28ba57
timeCreated: 1528026146
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 20cdfc6b68f9f074a88435387f8f30a3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,51 @@
using UnityEngine;
namespace Components
{
public class InputComponent : MonoBehaviour
{
private PlayerInputActions _inputActions;
private bool _isListening = false;
private Vector3 _direction = Vector3.zero;
public Vector3 Direction => _direction;
public void OnInit()
{
_inputActions = new();
}
public void OnUpdate(float elapseSeconds, float realElapseSeconds)
{
if (_isListening && _inputActions != null)
{
ReadInput();
}
}
public void OnReset()
{
_inputActions = null;
_isListening = false;
}
private void ReadInput()
{
Vector2 rawDir = _inputActions.Game.Move.ReadValue<Vector2>();
_direction = new Vector3(rawDir.x, 0, rawDir.y);
}
public void SetListening(bool isListening)
{
_isListening = isListening;
if (_isListening)
{
_inputActions.Enable();
}
else
{
_inputActions.Disable();
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f754cc5f339dcfa4aaec3aa32260c4b8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,41 @@
using UnityEngine;
namespace Components
{
public class MovementComponent : MonoBehaviour
{
private bool _isMoving = false;
private Vector3 _direction = Vector3.forward;
private float _speed = 0;
private Transform _cachedTransform;
public void OnInit(float speed, Transform transform)
{
_speed = speed;
_cachedTransform = transform;
}
public void OnUpdate(float elapseSeconds, float realElapseSeconds)
{
if (_isMoving && _cachedTransform != null)
{
Move(elapseSeconds);
}
}
public void OnReset()
{
_speed = 0;
_cachedTransform = null;
_isMoving = false;
}
private void Move(float deltaTime = 0)
{
_cachedTransform.Translate(_direction * _speed * deltaTime);
}
public void SetMove(bool isMoving) => _isMoving = isMoving;
public void SetDirection(Vector3 direction) => _direction = direction;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9baf591df06b9bb44ba5313457ba84b3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 35199cfd0c69c8c42895c16263b21b7b
folderAsset: yes
timeCreated: 1528026146
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,56 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using System.IO;
using UnityEngine;
namespace StarForce
{
public static class BinaryReaderExtension
{
public static Color32 ReadColor32(this BinaryReader binaryReader)
{
return new Color32(binaryReader.ReadByte(), binaryReader.ReadByte(), binaryReader.ReadByte(), binaryReader.ReadByte());
}
public static Color ReadColor(this BinaryReader binaryReader)
{
return new Color(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static DateTime ReadDateTime(this BinaryReader binaryReader)
{
return new DateTime(binaryReader.ReadInt64());
}
public static Quaternion ReadQuaternion(this BinaryReader binaryReader)
{
return new Quaternion(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Rect ReadRect(this BinaryReader binaryReader)
{
return new Rect(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Vector2 ReadVector2(this BinaryReader binaryReader)
{
return new Vector2(binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Vector3 ReadVector3(this BinaryReader binaryReader)
{
return new Vector3(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
public static Vector4 ReadVector4(this BinaryReader binaryReader)
{
return new Vector4(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle());
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f303871e05cae2d489d6ba3adb6e39d3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,86 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2021-06-16 21:54:35.576
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// 实体表。
/// </summary>
public class DREntity : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取实体编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: a48a9c6b974d6674f8a0421fc603dc56
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,86 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2021-06-16 21:54:35.591
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// 音乐配置表。
/// </summary>
public class DRMusic : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取音乐编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5539646031a664344b90aeb64f92930d
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,97 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2021-06-16 21:54:35.610
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// 场景配置表。
/// </summary>
public class DRScene : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取场景编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
/// <summary>
/// 获取背景音乐编号。
/// </summary>
public int BackgroundMusicId
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
BackgroundMusicId = int.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
BackgroundMusicId = binaryReader.Read7BitEncodedInt32();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 0ce61902e6e3c23409f9ef10ccc8c550
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,141 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2021-06-16 21:54:35.625
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// 声音配置表。
/// </summary>
public class DRSound : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取声音编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
/// <summary>
/// 获取优先级(默认0,128最高,-128最低)。
/// </summary>
public int Priority
{
get;
private set;
}
/// <summary>
/// 获取是否循环。
/// </summary>
public bool Loop
{
get;
private set;
}
/// <summary>
/// 获取音量(0~1)。
/// </summary>
public float Volume
{
get;
private set;
}
/// <summary>
/// 获取声音空间混合量(0为2D,1为3D,中间值混合效果)。
/// </summary>
public float SpatialBlend
{
get;
private set;
}
/// <summary>
/// 获取声音最大距离。
/// </summary>
public float MaxDistance
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
Priority = int.Parse(columnStrings[index++]);
Loop = bool.Parse(columnStrings[index++]);
Volume = float.Parse(columnStrings[index++]);
SpatialBlend = float.Parse(columnStrings[index++]);
MaxDistance = float.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
Priority = binaryReader.Read7BitEncodedInt32();
Loop = binaryReader.ReadBoolean();
Volume = binaryReader.ReadSingle();
SpatialBlend = binaryReader.ReadSingle();
MaxDistance = binaryReader.ReadSingle();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: fc0abcc42a26c844d91d422da22eb94d
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,119 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2021-06-16 21:54:35.652
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// 界面配置表。
/// </summary>
public class DRUIForm : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取界面编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
/// <summary>
/// 获取界面组名称。
/// </summary>
public string UIGroupName
{
get;
private set;
}
/// <summary>
/// 获取是否允许多个界面实例。
/// </summary>
public bool AllowMultiInstance
{
get;
private set;
}
/// <summary>
/// 获取是否暂停被其覆盖的界面。
/// </summary>
public bool PauseCoveredUIForm
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
UIGroupName = columnStrings[index++];
AllowMultiInstance = bool.Parse(columnStrings[index++]);
PauseCoveredUIForm = bool.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
UIGroupName = binaryReader.ReadString();
AllowMultiInstance = binaryReader.ReadBoolean();
PauseCoveredUIForm = binaryReader.ReadBoolean();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f28db9f996bc3d04eb73541b1f8b1036
timeCreated: 1528026148
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,108 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2021-06-16 21:54:35.666
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// 声音配置表。
/// </summary>
public class DRUISound : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取声音编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
/// <summary>
/// 获取优先级(默认0,128最高,-128最低)。
/// </summary>
public int Priority
{
get;
private set;
}
/// <summary>
/// 获取音量(0~1)。
/// </summary>
public float Volume
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
Priority = int.Parse(columnStrings[index++]);
Volume = float.Parse(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
Priority = binaryReader.Read7BitEncodedInt32();
Volume = binaryReader.ReadSingle();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d69c673440234c24a9718897060d4e14
timeCreated: 1528026148
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,91 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.DataTable;
using System;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
public static class DataTableExtension
{
private const string DataRowClassPrefixName = "StarForce.DR";
internal static readonly char[] DataSplitSeparators = new char[] { '\t' };
internal static readonly char[] DataTrimSeparators = new char[] { '\"' };
public static void LoadDataTable(this DataTableComponent dataTableComponent, string dataTableName, string dataTableAssetName, object userData)
{
if (string.IsNullOrEmpty(dataTableName))
{
Log.Warning("Data table name is invalid.");
return;
}
string[] splitedNames = dataTableName.Split('_');
if (splitedNames.Length > 2)
{
Log.Warning("Data table name is invalid.");
return;
}
string dataRowClassName = DataRowClassPrefixName + splitedNames[0];
Type dataRowType = Type.GetType(dataRowClassName);
if (dataRowType == null)
{
Log.Warning("Can not get data row type with class name '{0}'.", dataRowClassName);
return;
}
string name = splitedNames.Length > 1 ? splitedNames[1] : null;
DataTableBase dataTable = dataTableComponent.CreateDataTable(dataRowType, name);
dataTable.ReadData(dataTableAssetName, Constant.AssetPriority.DataTableAsset, userData);
}
public static Color32 ParseColor32(string value)
{
string[] splitedValue = value.Split(',');
return new Color32(byte.Parse(splitedValue[0]), byte.Parse(splitedValue[1]), byte.Parse(splitedValue[2]), byte.Parse(splitedValue[3]));
}
public static Color ParseColor(string value)
{
string[] splitedValue = value.Split(',');
return new Color(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]), float.Parse(splitedValue[3]));
}
public static Quaternion ParseQuaternion(string value)
{
string[] splitedValue = value.Split(',');
return new Quaternion(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]), float.Parse(splitedValue[3]));
}
public static Rect ParseRect(string value)
{
string[] splitedValue = value.Split(',');
return new Rect(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]), float.Parse(splitedValue[3]));
}
public static Vector2 ParseVector2(string value)
{
string[] splitedValue = value.Split(',');
return new Vector2(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]));
}
public static Vector3 ParseVector3(string value)
{
string[] splitedValue = value.Split(',');
return new Vector3(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]));
}
public static Vector4 ParseVector4(string value)
{
string[] splitedValue = value.Split(',');
return new Vector4(float.Parse(splitedValue[0]), float.Parse(splitedValue[1]), float.Parse(splitedValue[2]), float.Parse(splitedValue[3]));
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 23740ffb8ecb90b48ad986504e1d2474
timeCreated: 1528026147
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 5479812568543994bbbcdbee6c42fce1
folderAsset: yes
timeCreated: 1528026148
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,85 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.Debugger;
using GameFramework.Localization;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace StarForce
{
public class ChangeLanguageDebuggerWindow : IDebuggerWindow
{
private Vector2 m_ScrollPosition = Vector2.zero;
private bool m_NeedRestart = false;
public void Initialize(params object[] args)
{
}
public void Shutdown()
{
}
public void OnEnter()
{
}
public void OnLeave()
{
}
public void OnUpdate(float elapseSeconds, float realElapseSeconds)
{
if (m_NeedRestart)
{
m_NeedRestart = false;
UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Restart);
}
}
public void OnDraw()
{
m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition);
{
DrawSectionChangeLanguage();
}
GUILayout.EndScrollView();
}
private void DrawSectionChangeLanguage()
{
GUILayout.Label("<b>Change Language</b>");
GUILayout.BeginHorizontal("box");
{
if (GUILayout.Button("Chinese Simplified", GUILayout.Height(30)))
{
GameEntry.Localization.Language = Language.ChineseSimplified;
SaveLanguage();
}
if (GUILayout.Button("Chinese Traditional", GUILayout.Height(30)))
{
GameEntry.Localization.Language = Language.ChineseTraditional;
SaveLanguage();
}
if (GUILayout.Button("English", GUILayout.Height(30)))
{
GameEntry.Localization.Language = Language.English;
SaveLanguage();
}
}
GUILayout.EndHorizontal();
}
private void SaveLanguage()
{
GameEntry.Setting.SetString(Constant.Setting.Language, GameEntry.Localization.Language.ToString());
GameEntry.Setting.Save();
m_NeedRestart = true;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 278a7992e66d1ea4081597614f912f3d
timeCreated: 1528026148
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 2d30f1c0886d45b40b4497064082c7f1
folderAsset: yes
timeCreated: 1528026148
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: c9bfd67d99634cc45a60985500514160
folderAsset: yes
timeCreated: 1528026148
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,39 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace StarForce
{
public static partial class Constant
{
/// <summary>
/// 资源优先级。
/// </summary>
public static class AssetPriority
{
public const int ConfigAsset = 100;
public const int DataTableAsset = 100;
public const int DictionaryAsset = 100;
public const int FontAsset = 50;
public const int MusicAsset = 20;
public const int SceneAsset = 0;
public const int SoundAsset = 30;
public const int UIFormAsset = 50;
public const int UISoundAsset = 30;
public const int MyAircraftAsset = 90;
public const int PlayerAsset = 90;
public const int AircraftAsset = 80;
public const int ThrusterAsset = 30;
public const int WeaponAsset = 30;
public const int ArmorAsset = 30;
public const int BulletAsset = 80;
public const int AsteroiAsset = 80;
public const int EnemyAsset = 80;
public const int EffectAsset = 80;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: be044f4c80eead74cb105ed3c02de870
timeCreated: 1528830649
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using UnityEngine;
namespace StarForce
{
public static partial class Constant
{
/// <summary>
/// 层。
/// </summary>
public static class Layer
{
public const string DefaultLayerName = "Default";
public static readonly int DefaultLayerId = LayerMask.NameToLayer(DefaultLayerName);
public const string UILayerName = "UI";
public static readonly int UILayerId = LayerMask.NameToLayer(UILayerName);
public const string TargetableObjectLayerName = "Targetable Object";
public static readonly int TargetableObjectLayerId = LayerMask.NameToLayer(TargetableObjectLayerName);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: a43e7bbaf538cc045aaacf091c7d612e
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace StarForce
{
public static partial class Constant
{
public static class Setting
{
public const string Language = "Setting.Language";
public const string SoundGroupMuted = "Setting.{0}Muted";
public const string SoundGroupVolume = "Setting.{0}Volume";
public const string MusicMuted = "Setting.MusicMuted";
public const string MusicVolume = "Setting.MusicVolume";
public const string SoundMuted = "Setting.SoundMuted";
public const string SoundVolume = "Setting.SoundVolume";
public const string UISoundMuted = "Setting.UISoundMuted";
public const string UISoundVolume = "Setting.UISoundVolume";
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 28dc5d8fb274e45429ff40494dedac8a
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: af9011f89c35904448c0225db21e8266
folderAsset: yes
timeCreated: 1528026149
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,54 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace StarForce
{
public class BuildInfo
{
public string GameVersion
{
get;
set;
}
public int InternalGameVersion
{
get;
set;
}
public string CheckVersionUrl
{
get;
set;
}
public string WindowsAppUrl
{
get;
set;
}
public string MacOSAppUrl
{
get;
set;
}
public string IOSAppUrl
{
get;
set;
}
public string AndroidAppUrl
{
get;
set;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 265686b0408d79949a657768398c72cc
timeCreated: 1528026149
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,75 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace StarForce
{
public class VersionInfo
{
// 是否需要强制更新游戏应用
public bool ForceUpdateGame
{
get;
set;
}
// 最新的游戏版本号
public string LatestGameVersion
{
get;
set;
}
// 最新的游戏内部版本号
public int InternalGameVersion
{
get;
set;
}
// 最新的资源内部版本号
public int InternalResourceVersion
{
get;
set;
}
// 资源更新下载地址
public string UpdatePrefixUri
{
get;
set;
}
// 资源版本列表长度
public int VersionListLength
{
get;
set;
}
// 资源版本列表哈希值
public int VersionListHashCode
{
get;
set;
}
// 资源版本列表压缩后长度
public int VersionListCompressedLength
{
get;
set;
}
// 资源版本列表压缩后哈希值
public int VersionListCompressedHashCode
{
get;
set;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f1245482e9f20354796d50d6d85d2fe0
timeCreated: 1528026150
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 2fc27161191c61549a74f80fd54e9645
folderAsset: yes
timeCreated: 1528026150
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,12 @@
namespace Definition.Enum
{
public enum CombinePartType : byte
{
Dou = 0,
Sheng = 1,
Gong = 2,
Qiao = 3,
Ang = 4,
Custom = 255
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dfb218ff0d5740e89f056a5f9c7fda0b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 7330dc72b718ca14ea10a999060be9f8
folderAsset: yes
timeCreated: 1528026150
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,30 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework;
using System.IO;
using UnityEngine;
using UnityGameFramework.Editor;
using UnityGameFramework.Editor.ResourceTools;
namespace StarForce.Editor
{
public static class GameFrameworkConfigs
{
[BuildSettingsConfigPath]
public static string BuildSettingsConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/BuildSettings.xml"));
[ResourceCollectionConfigPath]
public static string ResourceCollectionConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceCollection.xml"));
[ResourceEditorConfigPath]
public static string ResourceEditorConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceEditor.xml"));
[ResourceBuilderConfigPath]
public static string ResourceBuilderConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceBuilder.xml"));
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 36618c709c84656438dd91e565226606
timeCreated: 1528026150
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,52 @@
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using System.IO;
[InitializeOnLoad]
public class SceneSwitchLeft
{
static SceneSwitchLeft()
{
// 注册到全局工具栏绘制事件
SceneView.duringSceneGui += OnSceneGUI;
}
static void OnSceneGUI(SceneView sceneView)
{
// 在 Scene 视图的左上角绘制一个下拉菜单
Handles.BeginGUI();
GUILayout.BeginArea(new Rect(10, 10, 200, 100));
if (EditorGUILayout.DropdownButton(new GUIContent("快速切换场景"), FocusType.Passive, EditorStyles.toolbarDropDown))
{
ShowSceneMenu();
}
GUILayout.EndArea();
Handles.EndGUI();
}
static void ShowSceneMenu()
{
GenericMenu menu = new GenericMenu();
// 查找项目中所有启用(Enabled)的场景
string[] sceneGuids = AssetDatabase.FindAssets("t:Scene");
foreach (string guid in sceneGuids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
string name = Path.GetFileNameWithoutExtension(path);
menu.AddItem(new GUIContent(name), false, () => {
if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
{
EditorSceneManager.OpenScene(path);
}
});
}
menu.ShowAsContext();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e7f70b2d5386e4941ab913255891bb99
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,90 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityGameFramework.Editor.ResourceTools;
namespace StarForce.Editor
{
public sealed class StarForceBuildEventHandler : IBuildEventHandler
{
public bool ContinueOnFailure
{
get
{
return false;
}
}
public void OnPreprocessAllPlatforms(string productName, string companyName, string gameIdentifier, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName, bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName, string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions,
string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath)
{
string streamingAssetsPath = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "StreamingAssets"));
string[] fileNames = Directory.GetFiles(streamingAssetsPath, "*", SearchOption.AllDirectories);
foreach (string fileName in fileNames)
{
if (fileName.Contains(".gitkeep"))
{
continue;
}
File.Delete(fileName);
}
Utility.Path.RemoveEmptyDirectory(streamingAssetsPath);
}
public void OnPostprocessAllPlatforms(string productName, string companyName, string gameIdentifier, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName, bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName, string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions,
string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath)
{
}
public void OnPreprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath)
{
}
public void OnBuildAssetBundlesComplete(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, AssetBundleManifest assetBundleManifest)
{
}
public void OnOutputUpdatableVersionListData(Platform platform, string versionListPath, int versionListLength, int versionListHashCode, int versionListCompressedLength, int versionListCompressedHashCode)
{
}
public void OnPostprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, bool isSuccess)
{
if (!outputPackageSelected)
{
return;
}
if (platform != Platform.Windows)
{
return;
}
string streamingAssetsPath = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "StreamingAssets"));
string[] fileNames = Directory.GetFiles(outputPackagePath, "*", SearchOption.AllDirectories);
foreach (string fileName in fileNames)
{
string destFileName = Utility.Path.GetRegularPath(Path.Combine(streamingAssetsPath, fileName.Substring(outputPackagePath.Length)));
FileInfo destFileInfo = new FileInfo(destFileName);
if (!destFileInfo.Directory.Exists)
{
destFileInfo.Directory.Create();
}
File.Copy(fileName, destFileName);
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 64311189c3f9ae140b59a31db9831950
timeCreated: 1528026151
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: f7c4b051e63f0c2418a55e8817bf4ba9
folderAsset: yes
timeCreated: 1528026151
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 58efe0589d7e90f498c8bcbbf94c6be4
folderAsset: yes
timeCreated: 1528026151
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,62 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using System;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public abstract class EntityDataBase
{
[SerializeField]
private int m_Id = 0;
[SerializeField]
private int m_TypeId = 0;
[SerializeField]
private Vector3 m_Position = Vector3.zero;
[SerializeField]
private Quaternion m_Rotation = Quaternion.identity;
public EntityDataBase(int entityId, int typeId)
{
m_Id = entityId;
m_TypeId = typeId;
}
/// <summary>
/// 实体编号。
/// </summary>
public int Id => m_Id;
/// <summary>
/// 实体类型编号。
/// </summary>
public int TypeId => m_TypeId;
/// <summary>
/// 实体位置。
/// </summary>
public Vector3 Position
{
get => m_Position;
set => m_Position = value;
}
/// <summary>
/// 实体朝向。
/// </summary>
public Quaternion Rotation
{
get => m_Rotation;
set => m_Rotation = value;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: afb91fe3ed8105e4a96b7bd5917ecc2b
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,68 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.DataTable;
using System;
using Entity;
using Entity.EntityData;
using UnityGameFramework.Runtime;
namespace StarForce
{
public static class EntityExtension
{
private static int s_SerialId = 0;
public static EntityBase GetGameEntity(this EntityComponent entityComponent, int entityId)
{
UnityGameFramework.Runtime.Entity entity = entityComponent.GetEntity(entityId);
if (entity == null)
{
return null;
}
return (EntityBase)entity.Logic;
}
public static void HideEntity(this EntityComponent entityComponent, EntityBase entity)
{
entityComponent.HideEntity(entity.Entity);
}
public static void AttachEntity(this EntityComponent entityComponent, EntityBase entityBase, int ownerId,
string parentTransformPath = null, object userData = null)
{
entityComponent.AttachEntity(entityBase.Entity, ownerId, parentTransformPath, userData);
}
private static void ShowEntity(this EntityComponent entityComponent, Type logicType, string entityGroup,
int priority, EntityDataBase data)
{
if (data == null)
{
Log.Warning("Data is invalid.");
return;
}
IDataTable<DREntity> dtEntity = GameEntry.DataTable.GetDataTable<DREntity>();
DREntity drEntity = dtEntity.GetDataRow(data.TypeId);
if (drEntity == null)
{
Log.Warning("Can not load entity id '{0}' from data table.", data.TypeId.ToString());
return;
}
entityComponent.ShowEntity(data.Id, logicType, AssetUtility.GetEntityAsset(drEntity.AssetName), entityGroup,
priority, data);
}
public static int GenerateSerialId(this EntityComponent entityComponent)
{
return --s_SerialId;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 626632079980ad34595c3b43a062a664
timeCreated: 1528026153
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 74fbdf043ed3bc141a0a0b09756bc7d2
folderAsset: yes
timeCreated: 1528026153
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,122 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using Entity.EntityData;
using GameFramework;
using StarForce;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace Entity
{
public abstract class EntityBase : EntityLogic
{
[SerializeField] private EntityDataBase _entityData = null;
public int Id => Entity.Id;
public Animation CachedAnimation
{
get;
private set;
}
#if UNITY_2017_3_OR_NEWER
protected override void OnInit(object userData)
#else
protected internal override void OnInit(object userData)
#endif
{
base.OnInit(userData);
CachedAnimation = GetComponent<Animation>();
}
#if UNITY_2017_3_OR_NEWER
protected override void OnRecycle()
#else
protected internal override void OnRecycle()
#endif
{
base.OnRecycle();
}
#if UNITY_2017_3_OR_NEWER
protected override void OnShow(object userData)
#else
protected internal override void OnShow(object userData)
#endif
{
base.OnShow(userData);
_entityData = userData as EntityDataBase;
if (_entityData == null)
{
Log.Error("Entity data is invalid.");
return;
}
Name = Utility.Text.Format("[Entity {0}]", Id);
CachedTransform.localPosition = _entityData.Position;
CachedTransform.localRotation = _entityData.Rotation;
CachedTransform.localScale = Vector3.one;
}
#if UNITY_2017_3_OR_NEWER
protected override void OnHide(bool isShutdown, object userData)
#else
protected internal override void OnHide(bool isShutdown, object userData)
#endif
{
base.OnHide(isShutdown, userData);
}
#if UNITY_2017_3_OR_NEWER
protected override void OnAttached(EntityLogic childEntity, Transform parentTransform, object userData)
#else
protected internal override void OnAttached(EntityLogic childEntity, Transform parentTransform, object userData)
#endif
{
base.OnAttached(childEntity, parentTransform, userData);
}
#if UNITY_2017_3_OR_NEWER
protected override void OnDetached(EntityLogic childEntity, object userData)
#else
protected internal override void OnDetached(EntityLogic childEntity, object userData)
#endif
{
base.OnDetached(childEntity, userData);
}
#if UNITY_2017_3_OR_NEWER
protected override void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
#else
protected internal override void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
#endif
{
base.OnAttachTo(parentEntity, parentTransform, userData);
}
#if UNITY_2017_3_OR_NEWER
protected override void OnDetachFrom(EntityLogic parentEntity, object userData)
#else
protected internal override void OnDetachFrom(EntityLogic parentEntity, object userData)
#endif
{
base.OnDetachFrom(parentEntity, userData);
}
#if UNITY_2017_3_OR_NEWER
protected override void OnUpdate(float elapseSeconds, float realElapseSeconds)
#else
protected internal override void OnUpdate(float elapseSeconds, float realElapseSeconds)
#endif
{
base.OnUpdate(elapseSeconds, realElapseSeconds);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 878fbbe82b4bde944812bcb7c964cff8
timeCreated: 1528026154
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+3
View File
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 89f8b2eba44e48318f34b578b91b1be1
timeCreated: 1770510146
@@ -0,0 +1,25 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class CombineCompletedEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(CombineCompletedEventArgs).GetHashCode();
public override int Id => EventId;
public CombineCompletedEventArgs()
{
}
public static CombineCompletedEventArgs Create()
{
return ReferencePool.Acquire<CombineCompletedEventArgs>();
}
public override void Clear()
{
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8482dddcf83e4cbb90f9be95e807f65a
timeCreated: 1770511198
@@ -0,0 +1,32 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class CombineGuideMessageEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(CombineGuideMessageEventArgs).GetHashCode();
public override int Id => EventId;
public string Message { get; private set; }
public CombineGuideMessageEventArgs()
{
Message = "";
}
public static CombineGuideMessageEventArgs Create(string message)
{
var args = ReferencePool.Acquire<CombineGuideMessageEventArgs>();
args.Message = message;
return args;
}
public override void Clear()
{
Message = "";
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7d6ccdc983514de981ac731659f6fa0e
timeCreated: 1770510601
@@ -0,0 +1,32 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class CombinePartMessageEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(CombinePartMessageEventArgs).GetHashCode();
public override int Id => EventId;
public string Message { get; private set; }
public CombinePartMessageEventArgs()
{
Message = "";
}
public static CombinePartMessageEventArgs Create(string message)
{
var args = ReferencePool.Acquire<CombinePartMessageEventArgs>();
args.Message = message;
return args;
}
public override void Clear()
{
Message = "";
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: fd83ff85d4a8443db7a9cba10c02529f
timeCreated: 1770510848
@@ -0,0 +1,37 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class CombineProgressEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(CombineProgressEventArgs).GetHashCode();
public override int Id => EventId;
public int CurrentStep { get; private set; }
public int TotalSteps { get; private set; }
public CombineProgressEventArgs()
{
CurrentStep = 0;
TotalSteps = 0;
}
public static CombineProgressEventArgs Create(int currentStep, int totalSteps)
{
var args = ReferencePool.Acquire<CombineProgressEventArgs>();
args.CurrentStep = currentStep;
args.TotalSteps = totalSteps;
return args;
}
public override void Clear()
{
CurrentStep = 0;
TotalSteps = 0;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a349f69307a242d99a2e7760beb11cbc
timeCreated: 1770510177
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3c1a6b69591248579f9cade5744deae0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3232d5f1486b49029ab0a7f5db041bd0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,651 @@
using System.Collections.Generic;
using System.Linq;
using Definition.Enum;
using Event;
using UI;
using UnityEngine;
using UnityEngine.Events;
using UnityGameFramework.Runtime;
namespace CustomComponent
{
/// <summary>
/// 核心玩法A控制器,负责拼装规则校验、进度统计与完成判定。
/// </summary>
[DisallowMultipleComponent]
public class CombineComponent : GameFrameworkComponent
{
#region Inspector Config
/// <summary>
/// 是否自动收集子节点中的槽位和部件。
/// </summary>
[SerializeField] private bool _autoCollectChildren = true;
/// <summary>
/// 组件启用时是否自动开始拼装。
/// </summary>
[SerializeField] private bool _autoStartOnEnable = false;
/// <summary>
/// 是否对所有槽位启用全局严格顺序。
/// </summary>
[SerializeField] private bool _strictGlobalOrder = true;
/// <summary>
/// 拖拽时的临时父节点。
/// </summary>
[SerializeField] private Transform _dragRoot = null;
/// <summary>
/// 拼装节点根对象。
/// </summary>
[SerializeField] private Transform _puzzleRoot = null;
/// <summary>
/// 拼装开始时提示文本。
/// </summary>
[SerializeField]
[TextArea(2, 4)]
private string _startHint = "Assemble dougong from lower-to-upper and inner-to-outer.";
/// <summary>
/// 放置顺序错误提示文本。
/// </summary>
[SerializeField]
[TextArea(2, 4)]
private string _wrongOrderHint = "Wrong order. Place lower or inner parts first.";
/// <summary>
/// 部件不匹配提示文本。
/// </summary>
[SerializeField]
[TextArea(2, 4)]
private string _wrongPartHint = "Part does not match this slot.";
/// <summary>
/// 槽位已占用提示文本。
/// </summary>
[SerializeField]
[TextArea(2, 4)]
private string _slotOccupiedHint = "This slot is already occupied.";
/// <summary>
/// 拼装完成提示文本。
/// </summary>
[SerializeField]
[TextArea(2, 4)]
private string _completeHint = "Dougong assembly completed.";
/// <summary>
/// 当前参与拼装的槽位列表。
/// </summary>
[SerializeField] private List<CombineSlot> _slots = new List<CombineSlot>();
/// <summary>
/// 当前参与拼装的可拖拽部件列表。
/// </summary>
[SerializeField] private List<CombineDraggablePart> _parts = new List<CombineDraggablePart>();
/// <summary>
/// 拼装完成事件。
/// </summary>
[SerializeField] private UnityEvent _onPuzzleCompleted = new UnityEvent();
#endregion
#region Runtime State
private CombineFormContext _formContext;
private CombineFormController _formController;
/// <summary>
/// 按顺序排序后的槽位缓存。
/// </summary>
private readonly List<CombineSlot> _orderedSlots = new List<CombineSlot>();
/// <summary>
/// 当前期望放置的槽位索引。
/// </summary>
private int _nextOrderSlotIndex = 0;
/// <summary>
/// 当前已放置部件数量。
/// </summary>
private int _placedCount = 0;
/// <summary>
/// 拼装是否已开始。
/// </summary>
private bool _isStarted = false;
/// <summary>
/// 拼装是否已完成。
/// </summary>
private bool _isCompleted = false;
/// <summary>
/// 拼装是否处于暂停状态。
/// </summary>
private bool _isPaused = false;
#endregion
#region Public Query
/// <summary>
/// 获取拼装是否完成。
/// </summary>
public bool IsCompleted => _isCompleted;
/// <summary>
/// 获取当前步数。
/// </summary>
public int CurrentStep => _placedCount;
/// <summary>
/// 获取总步数。
/// </summary>
public int TotalStep => _orderedSlots.Count;
#endregion
#region Unity Lifecycle
/// <summary>
/// 组件启用时可选自动开始拼装。
/// </summary>
private void OnEnable()
{
if (_autoStartOnEnable)
{
StartPuzzle();
}
}
#endregion
#region Level Lifecycle
/// <summary>
/// 使用关卡数据启动关卡,并打开玩法UI。
/// </summary>
public int? StartLevel(CombineFormContext context)
{
if (context == null)
{
Log.Warning("CoreGameplayA start failed. context is null.");
return null;
}
ClearRuntimeContext();
SetFormContext(context);
EnsureFormController();
// 先关闭上一次UI,避免重复打开。
_formController.CloseUI();
int? serialId = _formController.OpenUI(context);
if (!serialId.HasValue)
{
Log.Warning("CoreGameplayA start failed. OpenUI returned null.");
return null;
}
return serialId;
}
/// <summary>
/// 停止当前关卡并清理运行态。
/// </summary>
public void StopLevel()
{
_formController?.CloseUI();
ClearRuntimeContext();
}
#endregion
#region Puzzle Flow
/// <summary>
/// 启动拼装流程。
/// </summary>
public void StartPuzzle()
{
if (_autoCollectChildren)
{
CollectChildren();
}
BuildOrderedSlotList();
PrepareSlots();
PrepareParts();
_placedCount = 0;
_nextOrderSlotIndex = 0;
_isStarted = true;
_isCompleted = false;
_isPaused = false;
GameEntry.Event.Fire(this, CombineProgressEventArgs.Create(_placedCount, _orderedSlots.Count));
if (!string.IsNullOrEmpty(_startHint))
{
GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(_startHint));
}
}
/// <summary>
/// 暂停拼装输入。
/// </summary>
public void PausePuzzle()
{
_isPaused = true;
}
/// <summary>
/// 恢复拼装输入。
/// </summary>
public void ResumePuzzle()
{
_isPaused = false;
}
/// <summary>
/// 重置并重新开始拼装。
/// </summary>
public void ResetPuzzle()
{
StartPuzzle();
}
#endregion
#region Placement
/// <summary>
/// 尝试将部件放置到目标槽位。
/// </summary>
public bool TryPlacePart(CombineDraggablePart part, CombineSlot slot)
{
if (!CanPlacePart(part, slot))
{
return false;
}
if (!ValidateSlotAvailability(part, slot))
{
return false;
}
if (!ValidatePartType(part, slot))
{
return false;
}
if (!ValidateOrder(part, slot))
{
return false;
}
ApplyPlacement(part, slot);
return true;
}
/// <summary>
/// 放置前通用状态校验。
/// </summary>
private bool CanPlacePart(CombineDraggablePart part, CombineSlot slot)
{
return _isStarted && !_isCompleted && !_isPaused && part != null && slot != null;
}
/// <summary>
/// 校验槽位是否可放置。
/// </summary>
private bool ValidateSlotAvailability(CombineDraggablePart part, CombineSlot slot)
{
if (!slot.IsOccupied)
{
return true;
}
RejectPlace(part, _slotOccupiedHint);
return false;
}
/// <summary>
/// 校验部件类型是否匹配槽位。
/// </summary>
private bool ValidatePartType(CombineDraggablePart part, CombineSlot slot)
{
if (slot.RequiredPartType == part.PartType)
{
return true;
}
string hint = string.IsNullOrEmpty(slot.MismatchHint) ? _wrongPartHint : slot.MismatchHint;
RejectPlace(part, hint);
return false;
}
/// <summary>
/// 校验放置顺序是否符合规则。
/// </summary>
private bool ValidateOrder(CombineDraggablePart part, CombineSlot slot)
{
if (!NeedValidateOrder(slot) || IsExpectedOrderSlot(slot))
{
return true;
}
RejectPlace(part, _wrongOrderHint);
return false;
}
/// <summary>
/// 应用成功放置结果,并推进进度。
/// </summary>
private void ApplyPlacement(CombineDraggablePart part, CombineSlot slot)
{
slot.SetOccupiedPart(part);
part.PlaceToSlot(slot);
_placedCount++;
AdvanceOrderCursor();
PublishExplanation(part, slot);
GameEntry.Event.Fire(this, CombineProgressEventArgs.Create(_placedCount, _orderedSlots.Count));
TryCompletePuzzle();
}
/// <summary>
/// 检查是否完成全部步骤并触发完成事件。
/// </summary>
private void TryCompletePuzzle()
{
if (_placedCount < _orderedSlots.Count)
{
return;
}
_isCompleted = true;
if (!string.IsNullOrEmpty(_completeHint))
{
GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(_completeHint));
}
_onPuzzleCompleted.Invoke();
}
/// <summary>
/// 处理放置失败:部件回弹并提示。
/// </summary>
private void RejectPlace(CombineDraggablePart part, string hint)
{
part.ReturnToSpawn();
if (!string.IsNullOrEmpty(hint))
{
GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(hint));
}
}
#endregion
#region Runtime Context
/// <summary>
/// 绑定运行时上下文根节点。
/// </summary>
/// <param name="puzzleRoot">拼装根节点。</param>
/// <param name="dragRoot">拖拽根节点。</param>
public void BindRuntimeContext(Transform puzzleRoot, Transform dragRoot = null)
{
_puzzleRoot = puzzleRoot;
if (dragRoot != null)
{
_dragRoot = dragRoot;
}
}
/// <summary>
/// 设置当前UI上下文数据。
/// </summary>
public void SetFormContext(CombineFormContext context)
{
_formContext = context;
}
/// <summary>
/// 获取当前UI上下文数据。
/// </summary>
public CombineFormContext GetFormContext()
{
return _formContext;
}
/// <summary>
/// 清理运行时上下文与状态。
/// </summary>
public void ClearRuntimeContext()
{
_formContext = null;
_puzzleRoot = null;
_dragRoot = null;
_slots.Clear();
_parts.Clear();
_orderedSlots.Clear();
_nextOrderSlotIndex = 0;
_placedCount = 0;
_isStarted = false;
_isCompleted = false;
_isPaused = false;
}
/// <summary>
/// 获取当前拖拽根节点。
/// </summary>
public Transform GetDragRoot()
{
return _dragRoot;
}
/// <summary>
/// 确保表单控制器已创建。
/// </summary>
private void EnsureFormController()
{
if (_formController == null)
{
_formController = new CombineFormController(this);
}
}
#endregion
#region Collection And Preparation
/// <summary>
/// 收集拼装所需的槽位与部件。
/// </summary>
private void CollectChildren()
{
_slots.Clear();
_parts.Clear();
Transform collectRoot = _puzzleRoot != null ? _puzzleRoot : transform;
_slots = collectRoot.GetComponentsInChildren<CombineSlot>(true).ToList();
CollectUniqueParts(collectRoot);
if (_dragRoot != null && !ReferenceEquals(_dragRoot, collectRoot))
{
CollectUniqueParts(_dragRoot);
}
if (_slots.Count == 0 || _parts.Count == 0)
{
Log.Warning("CoreGameplayA collect failed. slots={0}, parts={1}.", _slots.Count.ToString(),
_parts.Count.ToString());
}
}
/// <summary>
/// 从指定根节点收集不重复的可拖拽部件。
/// </summary>
private void CollectUniqueParts(Transform root)
{
if (root == null)
{
return;
}
CombineDraggablePart[] parts = root.GetComponentsInChildren<CombineDraggablePart>(true);
for (int i = 0; i < parts.Length; i++)
{
CombineDraggablePart part = parts[i];
if (part == null || _parts.Contains(part))
{
continue;
}
_parts.Add(part);
}
}
/// <summary>
/// 构建按 BuildOrder 排序后的槽位列表。
/// </summary>
private void BuildOrderedSlotList()
{
_orderedSlots.Clear();
for (int i = 0; i < _slots.Count; i++)
{
CombineSlot slot = _slots[i];
if (slot != null)
{
_orderedSlots.Add(slot);
}
}
_orderedSlots.Sort((a, b) => a.BuildOrder.CompareTo(b.BuildOrder));
}
/// <summary>
/// 初始化槽位控制器绑定与占用状态。
/// </summary>
private void PrepareSlots()
{
for (int i = 0; i < _orderedSlots.Count; i++)
{
CombineSlot slot = _orderedSlots[i];
slot.BindController(this);
slot.ResetSlot();
}
}
/// <summary>
/// 初始化部件控制器绑定与出生点状态。
/// </summary>
private void PrepareParts()
{
for (int i = 0; i < _parts.Count; i++)
{
CombineDraggablePart part = _parts[i];
if (part == null)
{
continue;
}
part.BindController(this);
part.CacheSpawnState();
part.ResetToSpawn();
}
}
#endregion
#region Rule Helpers
/// <summary>
/// 是否需要校验严格顺序。
/// </summary>
private bool NeedValidateOrder(CombineSlot slot)
{
return _strictGlobalOrder || slot.RequireStrictOrder;
}
/// <summary>
/// 当前槽位是否是下一步期望槽位。
/// </summary>
private bool IsExpectedOrderSlot(CombineSlot slot)
{
if (_nextOrderSlotIndex < 0 || _nextOrderSlotIndex >= _orderedSlots.Count)
{
return false;
}
return ReferenceEquals(_orderedSlots[_nextOrderSlotIndex], slot);
}
/// <summary>
/// 推进顺序游标到下一个未占用槽位。
/// </summary>
private void AdvanceOrderCursor()
{
while (_nextOrderSlotIndex < _orderedSlots.Count && _orderedSlots[_nextOrderSlotIndex].IsOccupied)
{
_nextOrderSlotIndex++;
}
}
/// <summary>
/// 发布当前放置对应的力学说明文案。
/// </summary>
private void PublishExplanation(CombineDraggablePart part, CombineSlot slot)
{
string explanation = slot.MechanicsExplanation;
if (string.IsNullOrEmpty(explanation))
{
explanation = part.MechanicsExplanation;
}
if (string.IsNullOrEmpty(explanation))
{
explanation = GetDefaultExplanation(part.PartType);
}
if (!string.IsNullOrEmpty(explanation))
{
GameEntry.Event.Fire(this, CombinePartMessageEventArgs.Create(explanation));
}
}
/// <summary>
/// 兜底力学说明文案。
/// </summary>
private static string GetDefaultExplanation(CombinePartType partType)
{
switch (partType)
{
case CombinePartType.Dou:
return "Dou transfers upper load and works as the base node.";
case CombinePartType.Sheng:
return "Sheng raises layer height to form the bracket hierarchy.";
case CombinePartType.Gong:
return "Gong spreads force laterally through overhang.";
case CombinePartType.Qiao:
return "Qiao continues force transfer to the outer side.";
case CombinePartType.Ang:
return "Ang uses leverage to redirect eave load inward.";
default:
return string.Empty;
}
}
#endregion
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0103c893efce444d9c6fe671306746fe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: e0da7117df4943347ad5ceaff9f70602
folderAsset: yes
timeCreated: 1528026155
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,77 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.Localization;
using System;
using System.Xml;
using UnityGameFramework.Runtime;
namespace StarForce
{
/// <summary>
/// XML 格式的本地化辅助器。
/// </summary>
public class XmlLocalizationHelper : DefaultLocalizationHelper
{
/// <summary>
/// 解析字典。
/// </summary>
/// <param name="dictionaryString">要解析的字典字符串。</param>
/// <param name="userData">用户自定义数据。</param>
/// <returns>是否解析字典成功。</returns>
public override bool ParseData(ILocalizationManager localizationManager, string dictionaryString, object userData)
{
try
{
string currentLanguage = GameEntry.Localization.Language.ToString();
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(dictionaryString);
XmlNode xmlRoot = xmlDocument.SelectSingleNode("Dictionaries");
XmlNodeList xmlNodeDictionaryList = xmlRoot.ChildNodes;
for (int i = 0; i < xmlNodeDictionaryList.Count; i++)
{
XmlNode xmlNodeDictionary = xmlNodeDictionaryList.Item(i);
if (xmlNodeDictionary.Name != "Dictionary")
{
continue;
}
string language = xmlNodeDictionary.Attributes.GetNamedItem("Language").Value;
if (language != currentLanguage)
{
continue;
}
XmlNodeList xmlNodeStringList = xmlNodeDictionary.ChildNodes;
for (int j = 0; j < xmlNodeStringList.Count; j++)
{
XmlNode xmlNodeString = xmlNodeStringList.Item(j);
if (xmlNodeString.Name != "String")
{
continue;
}
string key = xmlNodeString.Attributes.GetNamedItem("Key").Value;
string value = xmlNodeString.Attributes.GetNamedItem("Value").Value;
if (!localizationManager.AddRawString(key, value))
{
Log.Warning("Can not add raw string with key '{0}' which may be invalid or duplicate.", key);
return false;
}
}
}
return true;
}
catch (Exception exception)
{
Log.Warning("Can not parse dictionary data with exception '{0}'.", exception.ToString());
return false;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 44a338771c89a5348b00b9b0c13c1907
timeCreated: 1528026156
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 592f0282ee9175f489b89f82c448c9f5
folderAsset: yes
timeCreated: 1528026156
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace StarForce
{
public abstract class CSPacketBase : PacketBase
{
public override PacketType PacketType
{
get
{
return PacketType.ClientToServer;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 2cb68d4d5daf52a4a9305c8d5598419f
timeCreated: 1528026156
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
namespace StarForce
{
public sealed class CSPacketHeader : PacketHeaderBase
{
public override PacketType PacketType
{
get
{
return PacketType.ClientToServer;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5c73747d4a0a4e14599e43950c085856
timeCreated: 1528026156
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,280 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework;
using GameFramework.Event;
using GameFramework.Network;
using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UnityGameFramework.Runtime;
namespace StarForce
{
public class NetworkChannelHelper : INetworkChannelHelper
{
private readonly Dictionary<int, Type> m_ServerToClientPacketTypes = new Dictionary<int, Type>();
private readonly MemoryStream m_CachedStream = new MemoryStream(1024 * 8);
private INetworkChannel m_NetworkChannel = null;
/// <summary>
/// 获取消息包头长度。
/// </summary>
public int PacketHeaderLength
{
get
{
return sizeof(int);
}
}
/// <summary>
/// 初始化网络频道辅助器。
/// </summary>
/// <param name="networkChannel">网络频道。</param>
public void Initialize(INetworkChannel networkChannel)
{
m_NetworkChannel = networkChannel;
// 反射注册包和包处理函数。
Type packetBaseType = typeof(SCPacketBase);
Type packetHandlerBaseType = typeof(PacketHandlerBase);
Assembly assembly = Assembly.GetExecutingAssembly();
Type[] types = assembly.GetTypes();
for (int i = 0; i < types.Length; i++)
{
if (!types[i].IsClass || types[i].IsAbstract)
{
continue;
}
if (types[i].BaseType == packetBaseType)
{
PacketBase packetBase = (PacketBase)Activator.CreateInstance(types[i]);
Type packetType = GetServerToClientPacketType(packetBase.Id);
if (packetType != null)
{
Log.Warning("Already exist packet type '{0}', check '{1}' or '{2}'?.", packetBase.Id.ToString(), packetType.Name, packetBase.GetType().Name);
continue;
}
m_ServerToClientPacketTypes.Add(packetBase.Id, types[i]);
}
else if (types[i].BaseType == packetHandlerBaseType)
{
IPacketHandler packetHandler = (IPacketHandler)Activator.CreateInstance(types[i]);
m_NetworkChannel.RegisterHandler(packetHandler);
}
}
GameEntry.Event.Subscribe(UnityGameFramework.Runtime.NetworkConnectedEventArgs.EventId, OnNetworkConnected);
GameEntry.Event.Subscribe(UnityGameFramework.Runtime.NetworkClosedEventArgs.EventId, OnNetworkClosed);
GameEntry.Event.Subscribe(UnityGameFramework.Runtime.NetworkMissHeartBeatEventArgs.EventId, OnNetworkMissHeartBeat);
GameEntry.Event.Subscribe(UnityGameFramework.Runtime.NetworkErrorEventArgs.EventId, OnNetworkError);
GameEntry.Event.Subscribe(UnityGameFramework.Runtime.NetworkCustomErrorEventArgs.EventId, OnNetworkCustomError);
}
/// <summary>
/// 关闭并清理网络频道辅助器。
/// </summary>
public void Shutdown()
{
GameEntry.Event.Unsubscribe(UnityGameFramework.Runtime.NetworkConnectedEventArgs.EventId, OnNetworkConnected);
GameEntry.Event.Unsubscribe(UnityGameFramework.Runtime.NetworkClosedEventArgs.EventId, OnNetworkClosed);
GameEntry.Event.Unsubscribe(UnityGameFramework.Runtime.NetworkMissHeartBeatEventArgs.EventId, OnNetworkMissHeartBeat);
GameEntry.Event.Unsubscribe(UnityGameFramework.Runtime.NetworkErrorEventArgs.EventId, OnNetworkError);
GameEntry.Event.Unsubscribe(UnityGameFramework.Runtime.NetworkCustomErrorEventArgs.EventId, OnNetworkCustomError);
m_NetworkChannel = null;
}
/// <summary>
/// 准备进行连接。
/// </summary>
public void PrepareForConnecting()
{
m_NetworkChannel.Socket.ReceiveBufferSize = 1024 * 64;
m_NetworkChannel.Socket.SendBufferSize = 1024 * 64;
}
/// <summary>
/// 发送心跳消息包。
/// </summary>
/// <returns>是否发送心跳消息包成功。</returns>
public bool SendHeartBeat()
{
m_NetworkChannel.Send(ReferencePool.Acquire<CSHeartBeat>());
return true;
}
/// <summary>
/// 序列化消息包。
/// </summary>
/// <typeparam name="T">消息包类型。</typeparam>
/// <param name="packet">要序列化的消息包。</param>
/// <param name="destination">要序列化的目标流。</param>
/// <returns>是否序列化成功。</returns>
public bool Serialize<T>(T packet, Stream destination) where T : Packet
{
PacketBase packetImpl = packet as PacketBase;
if (packetImpl == null)
{
Log.Warning("Packet is invalid.");
return false;
}
if (packetImpl.PacketType != PacketType.ClientToServer)
{
Log.Warning("Send packet invalid.");
return false;
}
m_CachedStream.SetLength(m_CachedStream.Capacity); // 此行防止 Array.Copy 的数据无法写入
m_CachedStream.Position = 0L;
CSPacketHeader packetHeader = ReferencePool.Acquire<CSPacketHeader>();
Serializer.Serialize(m_CachedStream, packetHeader);
ReferencePool.Release(packetHeader);
Serializer.SerializeWithLengthPrefix(m_CachedStream, packet, PrefixStyle.Fixed32);
ReferencePool.Release((IReference)packet);
m_CachedStream.WriteTo(destination);
return true;
}
/// <summary>
/// 反序列化消息包头。
/// </summary>
/// <param name="source">要反序列化的来源流。</param>
/// <param name="customErrorData">用户自定义错误数据。</param>
/// <returns>反序列化后的消息包头。</returns>
public IPacketHeader DeserializePacketHeader(Stream source, out object customErrorData)
{
// 注意:此函数并不在主线程调用!
customErrorData = null;
return (IPacketHeader)RuntimeTypeModel.Default.Deserialize(source, ReferencePool.Acquire<SCPacketHeader>(), typeof(SCPacketHeader));
}
/// <summary>
/// 反序列化消息包。
/// </summary>
/// <param name="packetHeader">消息包头。</param>
/// <param name="source">要反序列化的来源流。</param>
/// <param name="customErrorData">用户自定义错误数据。</param>
/// <returns>反序列化后的消息包。</returns>
public Packet DeserializePacket(IPacketHeader packetHeader, Stream source, out object customErrorData)
{
// 注意:此函数并不在主线程调用!
customErrorData = null;
SCPacketHeader scPacketHeader = packetHeader as SCPacketHeader;
if (scPacketHeader == null)
{
Log.Warning("Packet header is invalid.");
return null;
}
Packet packet = null;
if (scPacketHeader.IsValid)
{
Type packetType = GetServerToClientPacketType(scPacketHeader.Id);
if (packetType != null)
{
packet = (Packet)RuntimeTypeModel.Default.DeserializeWithLengthPrefix(source, ReferencePool.Acquire(packetType), packetType, PrefixStyle.Fixed32, 0);
}
else
{
Log.Warning("Can not deserialize packet for packet id '{0}'.", scPacketHeader.Id.ToString());
}
}
else
{
Log.Warning("Packet header is invalid.");
}
ReferencePool.Release(scPacketHeader);
return packet;
}
private Type GetServerToClientPacketType(int id)
{
Type type = null;
if (m_ServerToClientPacketTypes.TryGetValue(id, out type))
{
return type;
}
return null;
}
private void OnNetworkConnected(object sender, GameEventArgs e)
{
UnityGameFramework.Runtime.NetworkConnectedEventArgs ne = (UnityGameFramework.Runtime.NetworkConnectedEventArgs)e;
if (ne.NetworkChannel != m_NetworkChannel)
{
return;
}
Log.Info("Network channel '{0}' connected, local address '{1}', remote address '{2}'.", ne.NetworkChannel.Name, ne.NetworkChannel.Socket.LocalEndPoint.ToString(), ne.NetworkChannel.Socket.RemoteEndPoint.ToString());
}
private void OnNetworkClosed(object sender, GameEventArgs e)
{
UnityGameFramework.Runtime.NetworkClosedEventArgs ne = (UnityGameFramework.Runtime.NetworkClosedEventArgs)e;
if (ne.NetworkChannel != m_NetworkChannel)
{
return;
}
Log.Info("Network channel '{0}' closed.", ne.NetworkChannel.Name);
}
private void OnNetworkMissHeartBeat(object sender, GameEventArgs e)
{
UnityGameFramework.Runtime.NetworkMissHeartBeatEventArgs ne = (UnityGameFramework.Runtime.NetworkMissHeartBeatEventArgs)e;
if (ne.NetworkChannel != m_NetworkChannel)
{
return;
}
Log.Info("Network channel '{0}' miss heart beat '{1}' times.", ne.NetworkChannel.Name, ne.MissCount.ToString());
if (ne.MissCount < 2)
{
return;
}
ne.NetworkChannel.Close();
}
private void OnNetworkError(object sender, GameEventArgs e)
{
UnityGameFramework.Runtime.NetworkErrorEventArgs ne = (UnityGameFramework.Runtime.NetworkErrorEventArgs)e;
if (ne.NetworkChannel != m_NetworkChannel)
{
return;
}
Log.Info("Network channel '{0}' error, error code is '{1}', error message is '{2}'.", ne.NetworkChannel.Name, ne.ErrorCode.ToString(), ne.ErrorMessage);
ne.NetworkChannel.Close();
}
private void OnNetworkCustomError(object sender, GameEventArgs e)
{
UnityGameFramework.Runtime.NetworkCustomErrorEventArgs ne = (UnityGameFramework.Runtime.NetworkCustomErrorEventArgs)e;
if (ne.NetworkChannel != m_NetworkChannel)
{
return;
}
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 93389fd43ee07b54980956fe99a706c2
timeCreated: 1528026156
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: bfccba061fa0c774bb6a7c677dc006f3
folderAsset: yes
timeCreated: 1528026156
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,32 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using ProtoBuf;
using System;
namespace StarForce
{
[Serializable, ProtoContract(Name = @"CSHeartBeat")]
public class CSHeartBeat : CSPacketBase
{
public CSHeartBeat()
{
}
public override int Id
{
get
{
return 1;
}
}
public override void Clear()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: bae20fa3c2aff8147a2e6dfa010dd09f
timeCreated: 1528026157
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,32 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using ProtoBuf;
using System;
namespace StarForce
{
[Serializable, ProtoContract(Name = @"SCHeartBeat")]
public class SCHeartBeat : SCPacketBase
{
public SCHeartBeat()
{
}
public override int Id
{
get
{
return 2;
}
}
public override void Clear()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 4a60e9cafc538ac4ba7b50d7ff811796
timeCreated: 1528026157
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,32 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.Network;
using ProtoBuf;
namespace StarForce
{
public abstract class PacketBase : Packet, IExtensible
{
private IExtension m_ExtensionObject;
public PacketBase()
{
m_ExtensionObject = null;
}
public abstract PacketType PacketType
{
get;
}
IExtension IExtensible.GetExtensionObject(bool createIfMissing)
{
return Extensible.GetExtensionObject(ref m_ExtensionObject, createIfMissing);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 527942a1a30fe9c4bb08a3392208d012
timeCreated: 1528026157
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 892cfad5ac0cd9d41a4679ac3a607e2a
folderAsset: yes
timeCreated: 1528026157
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.Network;
using UnityGameFramework.Runtime;
namespace StarForce
{
public class SCHeartBeatHandler : PacketHandlerBase
{
public override int Id
{
get
{
return 2;
}
}
public override void Handle(object sender, Packet packet)
{
SCHeartBeat packetImpl = (SCHeartBeat)packet;
Log.Info("Receive packet '{0}'.", packetImpl.Id.ToString());
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 28aefb1e04aa1e0478d3a457a949bd68
timeCreated: 1528026157
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Some files were not shown because too many files have changed in this diff Show More