使用UnityWebGL开发密码加密网页记录
0.参考文档
(47条消息) 【问题汇总】Unity发布WebGL项目时需要注意的问题_unity webgl gzip_TypeOtaku的博客-CSDN博客
Unity开发优化方案:WebGL篇 | U3DC.COM | 优三帝研究院
(47条消息) C#实现 AES算法加密_c# aes加密算法_yangzm996的博客-CSDN博客
Unity单机或联机游戏项目上传至云服务器的一个小方法 - 知乎 (zhihu.com)
(47条消息) UnityWebGL2021 全屏--新版本_unity webgl 全屏_//记得注释的博客-CSDN博客
GitHub - kou-yeung/WebGLInput: IME for Unity WebGL
(49条消息) 分享一个unity发布webgl 的复制粘贴功能的插件,unity打包webgl的坑_unity webgl 复制粘贴_似水流年wxk的博客-CSDN博客
1.Unity发布WebGL项目时需要注意的问题
1.1 勾选DecompressionFallBack
1.1.1 为什么
Unity对该选项的解释:WebGL:压缩构建和服务器配置 - Unity 手册
如果没有勾选DecompressionFallBack,则需要配置您的web服务器设置,详情可以看WebGL:服务器配置代码示例 - Unity 手册
备注:使用腾讯云或阿里云的对象存储时,可以不用管这个问题,因为他们都自动设置了这些.
1.1.2 如何设置
勾选Edit-->ProjectSettings-->Player-->PublishingsSettings-->DecompressionFallback 选项
1.2 在web服务器中设置压缩请求头
1.2.1 为什么
Unity默认会对资源和代码做压缩处理,以提高网页加载速度,在Edit-->ProjectSettings-->Player-->PublishingsSettings-->CompressionFormat中可以设置是否压缩和压缩格式,默认为Gzip.
不设置压缩请求头会导致报错,如果你无法配置服务器,可以设置Edit-->ProjectSettings-->Player-->PublishingsSettings-->CompressionFormat为Disable,也就是不压缩,但是这会对导致网页加载速度变慢
备注:使用腾讯云或阿里云的对象存储时,可以不用管这个问题,因为他们都自动设置了这些.
1.2.2 如何设置
在Nginx的配置文件中添加以下代码,以支持解压Unity打包出的资源 其他的web服务器请自行搜索如何添加请求头
location ~.+\.(unityweb|gz|js.gz)$ {
add_header Content-Encoding gzip;
}
1.3 解决WebGL的InputField无法唤醒移动端键盘,且不支持复制和粘贴问题
1.3.1 为什么
目前我使用的版本是Unity2020.3.25,当前使用UGUI的InputField是无法唤醒移动端键盘和复制粘贴的
1.3.2 如何设置
这里提供一个UGUI的WebGL插件的GitHub地址:GitHub - kou-yeung/WebGLInput: IME for Unity WebGL
使用该插件即可解决本问题,插件本身自带演示场景,可以参考演示场景使用
1.4 设置WebGL网页为全屏
以下引用自这篇文章,(49条消息) UnityWebGL2021 全屏--新版本_unity webgl 全屏_//记得注释的博客-CSDN博客
一、首先设置:
1、打包之后的html 文件中 < script >中增加Reset方法
(在现有的html文件的< script > 此处 </ script >添加下面的代码即可)*示例图:*
*代码段:*
function Reset() { var canvas = document.getElementById("#canvas"); canvas.height= document.body.clientHeight; canvas.width = document.body.clientWidth; } function Reset(){ var canvas = document.getElementById("#canvas"); canvas.height= document.documentElement.clientHeight; canvas.width = document.documentElement.clientWidth; }
2、在Html文件的 < body >标签增加onload和onresize调用Reset方法
(同样在现有的html文件中,找到 中添加)示例图:
*代码段:*
onload="Reset()" onresize="Reset()"
3、style.css设置.
(找到打包webgl的TemplateData文件夹的style.css文件,添加如下代码).
*示例图:*
*代码段:*
html,body{width:100%;height:100%;margin:0;padding:0;overflow:hidden;} .webgl-content{width: 100%; height: 100%;} .unityContainer{width: 100%; height: 100%;}
以上设置之后,会发现手机能够完全全屏,但PC浏览不正常,于是进行下一步。
二、其次关于PC浏览器的设置
找到打包的Html文件,找到以下代码段,复制粘贴即可:(将示例图中的代码替换成代码段中的代码)
示例图:
*代码段:*
if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) { container.className = "unity-mobile"; config.devicePixelRatio = 1; } else { container.className = "unity-mobile"; config.devicePixelRatio = 1; }
三、删除以下内容:< div-“unity-footer”> 和 alert(message)
示例图:
四、正常这些已经满足全屏要求了,logo和背景修改很简单:
方式 1:文件夹把素材替换掉
方式 2:修改模板代码
2.如何使用ASE加密自己String
附上我的代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 加密算法
/// </summary>
public class Ep : MonoBehaviour
{
public static Ep ep;
public InputField inText;
public InputField outText;
public InputField keyText;
private void Awake()
{
ep = this;
WebGLInput.captureAllKeyboardInput = false;
}
public static void Encryption()
{
string key = "";
if (ep.keyText.text.Length < 250)
{
key = GetIv(256);
ep.keyText.text = key;
}
else
{
key = ep.keyText.text;
}
ep.outText.text = AESEncrypt(ep.inText.text, key);
Debug.Log(key);
}
public static void Decryption()
{
string key = ep.keyText.text;
Debug.Log(key);
ep.outText.text = AESDecrypt(ep.inText.text, key);
}
public static void Clear()
{
ep.inText.text = "";
ep.keyText.text = "";
ep.outText.text = "";
}
//定义默认密钥
private static byte[] _aesKeyByte = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
private static string _aesKeyStr = Encoding.UTF8.GetString(_aesKeyByte);
/// <summary>
/// 随机生成密钥,默认密钥长度为32,不足在加密时自动填充空格
/// </summary>
/// <param name="n">密钥长度</param>
/// <returns></returns>
public static string GetIv(int n)
{
string s = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] arrChar = new char[s.Length];
for (int i = 0; i < s.Length; i++)
{
arrChar[i] = Convert.ToChar(s.Substring(i, 1));
}
StringBuilder num = new StringBuilder();
System.Random rnd = new System.Random(DateTime.Now.Millisecond);
for (int i = 0; i < n; i++)
{
num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());
}
_aesKeyByte = Encoding.UTF8.GetBytes(num.ToString());
return _aesKeyStr = Encoding.UTF8.GetString(_aesKeyByte);
}
/// <summary>
/// AES加密(无向量)
/// </summary>
/// <param name="plainBytes">被加密的明文</param>
/// <param name="key">密钥</param>
/// <returns>密文</returns>
public static string AESEncrypt(String Data, String Key)
{
MemoryStream mStream = new MemoryStream();
RijndaelManaged aes = new RijndaelManaged();
byte[] plainBytes = Encoding.UTF8.GetBytes(Data);
Byte[] bKey = new Byte[32];
Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = 128;
//aes.Key = _key;
aes.Key = bKey;
//aes.IV = _iV;
CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
try
{
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
finally
{
cryptoStream.Close();
mStream.Close();
aes.Clear();
}
}
/// <summary>
/// AES解密(无向量)
/// </summary>
/// <param name="encryptedBytes">被加密的明文</param>
/// <param name="key">密钥</param>
/// <returns>明文</returns>
public static string AESDecrypt(String Data, String Key)
{
Byte[] encryptedBytes = Convert.FromBase64String(Data);
Byte[] bKey = new Byte[32];
Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
MemoryStream mStream = new MemoryStream(encryptedBytes);
//mStream.Write( encryptedBytes, 0, encryptedBytes.Length );
//mStream.Seek( 0, SeekOrigin.Begin );
RijndaelManaged aes = new RijndaelManaged();
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = 128;
aes.Key = bKey;
//aes.IV = _iV;
CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
try
{
byte[] tmp = new byte[encryptedBytes.Length + 32];
int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length + 32);
byte[] ret = new byte[len];
Array.Copy(tmp, 0, ret, 0, len);
return Encoding.UTF8.GetString(ret);
}
finally
{
cryptoStream.Close();
mStream.Close();
aes.Clear();
}
}
}