GEngine

GEngine概述

GEngine,基于Unity引擎封装库,以我名字首字母命名。该库并不涉及引擎底层,主要是把游戏开发中所需要的东西整合起来而已。个人能力有限,错误或考虑不周在所难免,有任何疑问和建设性意见的请留言。方案调整或错误修复后,我会更新相关信息。

打包(GEngine.Packge.Gzip)

GEngine的打包库采用DotNetZip,结合了Nini进行配置,可在打包的时候配置不想打包的文件、文件夹,同时支持强行包含文件、文件夹。配置时,主要配置需要忽略打包的条件,如果忽略打包中有需要的再强制设置为打包包含。

源码与实例:

GZip类:

using System.Collections.Generic;
using System.IO;
using Nini.Config;
using Ionic.Zip;

namespace GEngine.Package
{
	public sealed class GZip 
	{
		bool openFilter ;																					//开启压缩过滤模式
		List<string> ignoreFiles_Extension = new List<string> ();					//压缩时,忽略扩展名类文件
		List<string> ignoreFiles_Name = new List<string>();							//压缩时,忽略文件名包含串文件
		List<string> ignoreFolders_Extension = new List<string> ();				//压缩时,忽略扩展名类文件夹
		List<string> ignoreFolders_Name = new List<string> ();						//压缩时,忽略文件夹名包含串文件夹

		List<string> containFiles_Extension = new List<string>();					//压缩时,强制包含扩展名类文件
		List<string> containFiles_Name = new List<string>();							//压缩时,强制包含文件名包含串文件
		List<string> containFolders_Extension = new List<string>();				//压缩时,强制包含扩展名类文件夹
		List<string> containFolders_Name = new List<string>();					//压缩时,强制包含文件夹名包含串文件夹

		static GZip zip;

		/// <summary>
		/// 获取GZip实例
		/// </summary>
		public static GZip Inst
		{
			get
			{
				if(zip == null)
				{
					zip = new GZip();
				}

				return zip;
			}
		}
		
		/// <summary>
		/// 初始化压缩、解压系统
		/// </summary>	
		public void OpenFilter(string filterFile)
		{	
			CloseFilter();			
			openFilter = true;

			IniConfigSource source = new IniConfigSource(filterFile);
			
			IConfig config = source.Configs["IgnoreFile_Extension"];
			string[] vls = config.GetValues();
			foreach(string vl in vls)
			{
				ignoreFiles_Extension.Add(vl);
			}
			config = source.Configs["IgnoreFile_Name"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				ignoreFiles_Name.Add(vl);
			}
			
			config = source.Configs["IgnoreFolder_Extension"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				ignoreFolders_Extension.Add(vl);
			}
			config = source.Configs["IgnoreFolder_Name"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				ignoreFolders_Name.Add(vl);
			}

			config = source.Configs["ContainFile_Extension"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				containFiles_Extension.Add(vl);
			}
			config = source.Configs["ContainFile_Name"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				containFiles_Name.Add(vl);
			}

			config = source.Configs["ContainFolder_Extension"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				containFolders_Extension.Add(vl);
			}
			config = source.Configs["ContainFolder_Name"];
			vls = config.GetValues();
			foreach(string vl in vls)
			{
				containFolders_Name.Add(vl);
			}
		}

		public void CloseFilter()
		{
			openFilter = false;

			ignoreFiles_Extension.Clear();
			ignoreFiles_Name.Clear();
			ignoreFolders_Extension.Clear();
			ignoreFolders_Name.Clear();
			
			containFiles_Extension.Clear();
			containFiles_Name.Clear();
			containFolders_Extension.Clear();
			containFolders_Name.Clear();
		}
		
		/// <summary>
		/// 压缩指定路径文件
		/// </summary>
		/// <param name="filePath">压缩源文件</param>
		/// <param name="savePath">压缩目标文件</param>
		public void Compress(string filePath, string savePath)
		{
			if(File.Exists(filePath) && !IsIgnoreFile(filePath))
			{
				using (ZipFile zip = new ZipFile())
				{
					zip.AddFile(filePath, "");
					zip.Save(savePath);
				}
			}
			else if(Directory.Exists(filePath) && !IsIgnoreFolder(filePath))
			{
				string[] files = Directory.GetFiles(filePath, "*", SearchOption.AllDirectories);
				if(files.Length < 1)
					return;
				
				using (ZipFile zip = new ZipFile())
				{
					foreach(string file in files)
					{
						if(IsIgnoreFile(file))
							continue;
						
						DirectoryInfo dicInfo = Directory.GetParent(file);
						if(IsIgnoreFolder(dicInfo.FullName))
							continue;
						
						if(dicInfo.FullName != filePath)
						{					
							zip.AddFile(file, dicInfo.Name);
						}
						else
						{
							zip.AddFile(file, "");
						}
					}
					zip.Save(savePath);
				}
			}
		}

		/// <summary>
		/// 解压指定路径文件
		/// </summary>
		/// <param name="filePath">解压源文件</param>
		/// <param name="savePath">解压目标文件</param>
		public void Decompress(string filePath, string savePath)
		{
			using (ZipFile zip = new ZipFile(filePath))
			{
					zip.ExtractAll(savePath);
			}
		}
		
		/// <summary>
		/// 忽略文件
		/// </summary>
		/// <returns><c>true</c> 被忽略返回; 否则返回, <c>false</c>.</returns>
		/// <param name="file">待检测文件</param>
		bool IsIgnoreFile(string file)
		{
			if (!openFilter)
				return false;

			string extension = Path.GetExtension(file);

			if(containFiles_Extension.Count > 0 && containFiles_Extension.Contains(extension))
				return false;

			if(containFiles_Name.Count > 0)
			{
				foreach(string containStr in containFiles_Name)
				{
					if(file.Contains(containStr))
						return false;
				}
			}

			if(ignoreFiles_Extension.Contains(extension))
				return true;

			foreach(string filterStr in ignoreFiles_Name)
			{
				if(file.Contains(filterStr))
					return true;
			}

			return false;
		}
		
		/// <summary>
		/// 忽略文件夹
		/// </summary>
		/// <returns><c>true</c> 被忽略返回; 否则返回, <c>false</c>.</returns>
		/// <param name="folder">待检测文件夹</param>
		bool IsIgnoreFolder(string folder)
		{
			if (!openFilter)
				return false;
			
			string extension = Path.GetExtension(folder);

			if(containFolders_Extension.Count > 0)
			{
				if(containFolders_Extension.Contains(extension))
					return false;
			}

			if(containFolders_Name.Count > 0)
			{
				foreach(string filterStr in containFolders_Name)
				{
					if(folder.Contains(filterStr))
						return false;
				}
			}

			if(ignoreFolders_Extension.Contains(extension))
				return true;

			foreach(string filterStr in ignoreFolders_Name)
			{
				if(folder.Contains(filterStr))
					return true;
			}

			return false;
		}
	}
}

调用方法:

using UnityEngine;
using System.IO;
using GEngine.Package;

public class NewBehaviourScript : MonoBehaviour 
{
	void Start () 
	{
		string dir = Directory.GetCurrentDirectory();
		string assetFolder = dir + @"\Assets";

		string configFile = dir + @"\Assets\Configs\zip.ini";

		GZip.Inst.OpenFilter(configFile);
		GZip.Inst.Compress( assetFolder, "ZipTest.zip");
		GZip.Inst.Decompress("ZipTest.zip", "DZ");
	}
}

配置(GEngine.ConfigSystem)

GEngine配置采用Nini库,基于C#库,支持中文编码,但不支持重复Key,自定义相关还没研究。基本上够用了,先暂时用这个库。配置系统待整合。

加密、解密(GEngine.Security.GDES)

GEngine加密解密算法采用DES算法,支持字符串、二进制、文件的加密、解密。

源码与实例:

GDES类:

using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace GEngine.Security
{
	/// <summary>
	/// 加密解密
	/// </summary>
	public sealed class GDES
	{
		/// <summary>
		/// 密钥
		/// </summary>
		private static byte[] keys = Encoding.UTF8.GetBytes("83721590");

		/// <summary>
		/// 密钥向量
		/// </summary>
		private static byte[] ivs = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

		/// <summary>
		/// 默认编码模式
		/// </summary>
		private static Encoding defualtEncoding = Encoding.UTF8;

		/// <summary>
		/// 加密
		/// </summary>
		/// <returns>返回加密后的byte[]数据</returns>
		/// <param name="bytes">需要加密的byte[]数据</param>
		public static byte[] EncryptToBytes(byte[] bytes)
		{
			if(bytes == null)
				return null;
			
			byte[] encrypted;
			ICryptoTransform encryptor = new DESCryptoServiceProvider().CreateEncryptor(keys, ivs);
			
			using (MemoryStream mStream = new MemoryStream())
			{
				using (CryptoStream cStream = new CryptoStream(mStream, encryptor, CryptoStreamMode.Write))
				{
					cStream.Write(bytes, 0, bytes.Length);
				}				
				encrypted = mStream.ToArray();
			}
			
			return encrypted;
		}

		/// <summary>
		/// 加密
		/// </summary>
		/// <returns>返回加密后的byte[]数据</returns>
		/// <param name="plainText">需要加密的string数据</param>
		/// <param name="encoding">编码模式</param>
		public static byte[] EncryptToBytes(string plainText, Encoding encoding = null)
		{
			if(string.IsNullOrEmpty(plainText))
				return null;

			if(encoding != null)
				return EncryptToBytes(encoding.GetBytes(plainText));
			
			byte[] encrypted;
			ICryptoTransform encryptor = new DESCryptoServiceProvider().CreateEncryptor(keys, ivs);

			using (MemoryStream mStream = new MemoryStream())
			{
				using (CryptoStream cStream = new CryptoStream(mStream, encryptor, CryptoStreamMode.Write))
				{
					using (StreamWriter sWriter = new StreamWriter(cStream))
					{
						sWriter.Write(plainText);
					}
					encrypted = mStream.ToArray();
				}
			}

			return encrypted;
		}

		/// <summary>
		/// 加密文件
		/// </summary>
		/// <param name="filePath">待加密的源文件</param>
		/// <param name="savePath">加密存储的目标文件</param>
		/// <param name="deleteOldFile">是否删除源文件</param>
		public static void EncryptToFile(string filePath, string savePath, bool deleteOldFile = false)
		{
			if(!File.Exists(filePath))
				return;

			byte[] bytes = File.ReadAllBytes(filePath);
			if(deleteOldFile)
				File.Delete(filePath);

			EncryptToFile(bytes, savePath);
		}

		/// <summary>
		/// 加密到文件
		/// </summary>
		/// <param name="bytes">待解密的byte[]数据</param>
		/// <param name="savePath">加密存储的目标文件</param>
		public static void EncryptToFile(byte[] bytes, string savePath)
		{
			if(bytes == null)
				return;

			string folder = Directory.GetParent(savePath).FullName;
			if(!Directory.Exists(folder))
			{
				Directory.CreateDirectory(folder);
			}

			byte[] encrypted = EncryptToBytes(bytes);
			File.WriteAllBytes(savePath, encrypted);
		}

		/// <summary>
		/// 解密
		/// </summary>
		/// <returns>返回解密后的byte[]数据</returns>
		/// <param name="bytes">待解密的byte[]数据</param>
		public static byte[] DecryptToBytes(byte[] bytes)
		{
			if(bytes == null)
				return null;
			
			byte[] decrypted = null;
			ICryptoTransform decryptor = new DESCryptoServiceProvider().CreateDecryptor(keys, ivs);
			
			using (MemoryStream mStream = new MemoryStream())
			{
				using (CryptoStream cStream = new CryptoStream(mStream, decryptor, CryptoStreamMode.Write))
				{
					cStream.Write(bytes, 0, bytes.Length);
				}				
				decrypted = mStream.ToArray();
			}				
			
			return decrypted;
		}

		/// <summary>
		/// 解密
		/// </summary>
		/// <returns>返回解密后的string数据</returns>
		/// <param name="bytes">待解密的byte[]数据</param>
		/// <param name="encoding">编码模式</param>
		public static string DecryptToString(byte[] bytes, Encoding encoding = null)
		{
			if(bytes == null)
				return null;

			byte[] decrypted = DecryptToBytes(bytes);
			if(decrypted == null)
				return null;

			if(encoding != null)
				return encoding.GetString(decrypted);
			else
				return defualtEncoding.GetString(decrypted);
		}

		/// <summary>
		/// 解密并存储到文件
		/// </summary>
		/// <param name="bytes">待解密的byte[]数据</param>
		/// <param name="savePath">解密后存储的目标文件</param>
		public static void DecryptToFile(byte[] bytes, string savePath)
		{
			if(bytes == null)
				return;

			byte[] decrypted = DecryptToBytes(bytes);

			string folder = Directory.GetParent(savePath).FullName;
			if(!Directory.Exists(folder))
			{
				Directory.CreateDirectory(folder);
			}
			File.WriteAllBytes(savePath, decrypted);
		}

		/// <summary>
		/// 解密并存储到文件
		/// </summary>
		/// <param name="filePath">待解密的源文件</param>
		/// <param name="savePath">解密后存储的目标文件</param>
		public static void DecryptToFile(string filePath, string savePath)
		{
			if(!File.Exists(filePath))
				return;
			
			byte[] bytes = File.ReadAllBytes(filePath);
			DecryptToFile(bytes, savePath);
		}
	}
}
调用方法:

using UnityEngine;
using System.IO;

using GEngine.Security;

public class NewBehaviourScript : MonoBehaviour 
{
	void Start () 
	{
		string dir = Directory.GetCurrentDirectory();
		string assetFolder = dir + @"\Assets";

		string configFile = dir + @"\Assets\Configs\zip.ini";

		string encPath = Path.ChangeExtension(configFile, "enc");
		GDES.EncryptToFile(configFile, encPath);
		string decPath = Path.ChangeExtension(configFile, "dec");
		GDES.DecryptToFile(encPath, decPath);
	}
}

相机角色中间物体透明(GEngine.BetweenTransparent)

两者中间对象透明组件,一般来说挂在主角上,监视者为主摄像机。剧情动画时可挂在动画主角上。该组件还支持反向检测、透明shader替换等(shader替换暂时做统一替换,如果需要,可以添加组件,然后让对象自定义替换shader)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值