C#Like是Unity的热更方案,使用纯C#语言写出可以热更新的代码,就像可以在所有平台使用DLL(动态链接库)文件一样.遵从KISS设计原则,让用户轻松构建或升级成Unity的热更新项目.
简介
本篇主要介绍C#Like支持的C#特性:参数修饰符
- C#Like免费版:不支持;
- C#Like完整版:支持ref out in param.
C#Like免费版:
示范代码如下,提供对应方案模拟:
using UnityEngine;
namespace CSharpLike
{
public partial class ExampleCSharp : LikeBehaviour
{
/// <summary>
/// 示范函数参数修饰符ref out in param
/// </summary>
void TestModifier()
{
Debug.LogError("示范函数参数修饰符: 你不能在C#Like免费版里使用函数参数修饰符'ref out in param'(在完整版已支持).强烈推荐升级到完整版:");
// 我们提供以下方案给免费用户:
// ref out in param : 各自做了模拟的使用方法
// 示范ref
Vector3 current = Vector3.zero;
Vector3 target = Vector3.one;
Vector3 currentVelocity = Vector3.zero;
Debug.Log("TestModifier ref:before:current=" + current + ",target=" + target + ",currentVelocity=" + currentVelocity);
//免费版:(需要在非热更代码里先修改)
SampleHowToUseModifier.currentVelocity = currentVelocity;
current = SampleHowToUseModifier.SmoothDamp(current, target, 0.5f);
currentVelocity = SampleHowToUseModifier.currentVelocity;
完整版:
//current = Vector3.SmoothDamp(current, target, ref currentVelocity, 0.5f);
Debug.Log("Test ref:after:current=" + current + ",target=" + target + ",currentVelocity=" + currentVelocity);
// 示范out
Dictionary<string, int> dicts = new Dictionary<string, int>();
dicts.Add("test", 1);
int iValue;
//免费版:(需要在非热更代码里先修改)
if (SampleHowToUseModifier.TryGetValue(dicts, "test"))
{
iValue = SampleHowToUseModifier.value;
Debug.Log("TestModifier out:iValue=" + iValue);
}
完整版:
//if (dicts.TryGetValue("test", out iValue))
// Debug.Log("TestModifier out:iValue=" + iValue);
// 示范in
iValue = 100;
//免费版:
SampleHowToUseModifier.TestModifierIn("test", iValue);//You can ignore 'in' keyword 'SampleHowToUseModifier.ModifierIn("test", iValue);'
完整版:
//SampleHowToUseModifier.ModifierIn("test", in iValue);//You can ignore 'in' keyword 'SampleHowToUseModifier.ModifierIn("test", iValue);'
// 示范params
//免费版:(需要在非热更代码里先修改)
SampleHowToUseModifier.TestModifierParams("free version");
SampleHowToUseModifier.TestModifierParams("free version", "test");
SampleHowToUseModifier.TestModifierParams("free version", "test", 1);
SampleHowToUseModifier.TestModifierParams("free version", "test", 1, 0.5f);
完整版:
//SampleHowToUseModifier.ModifierParams("free version");
//SampleHowToUseModifier.ModifierParams("free version", "test");
//SampleHowToUseModifier.ModifierParams("free version", "test", 1);
//SampleHowToUseModifier.ModifierParams("free version", "test", 1, 0.5f);
}
}
}
对应非热更新部分的代码:
using UnityEngine;
namespace CSharpLike
{
public class SampleHowToUseModifier
{
#region Modifier ref
public static Vector3 currentVelocity = Vector3.zero;
public static Vector3 SmoothDamp(Vector3 current, Vector3 target, float smoothTime)
{
return Vector3.SmoothDamp(current, target, ref currentVelocity, smoothTime);
}
#endregion
#region Modifier out
public static int value = 0;
public static bool TryGetValue(Dictionary<string, int> dics, string key)
{
return dics.TryGetValue(key, out value);
}
#endregion
#region Modifier in
public static void TestModifierIn(string str, int iValue)
{
ModifierIn(str,in iValue);
}
public static void ModifierIn(string str, in int iValue)
{
Debug.Log("ModifierIn:"+str + iValue);
}
#endregion
#region Modifier params
public static void TestModifierParams(string str)
{
ModifierParams(str);
}
public static void TestModifierParams(string str, object v1)
{
ModifierParams(str, v1);
}
public static void TestModifierParams(string str, object v1, object v2)
{
ModifierParams(str, v1, v2);
}
public static void TestModifierParams(string str, object v1, object v2, object v3)
{
ModifierParams(str, v1, v2, v3);
}
public static void ModifierParams(string str, params object[] values)
{
string strTemp = "ModifierParams:" + str;
foreach (var value in values)
strTemp += "," + value;
Debug.Log(strTemp);
}
#endregion
}
}
C#Like完整版:
示范代码如下:
using UnityEngine;
namespace CSharpLike
{
public partial class ExampleCSharp : LikeBehaviour
{
/// <summary>
/// 示范函数参数修饰符ref out in param
/// </summary>
void TestModifier()
{
Debug.LogError("Test Modifier:");
//示范调用热更脚本中带ref/out/in修饰符的函数
int v1 = 0;
int v2;
Vector2 v3 = new Vector2();
Vector2 v4;
int v5 = 5;
TestRefOutIn(ref v1, out v2, ref v3, out v4, v5);
//下面输出 v1=1,v2=16,v3=(1.0, 16.0),v4=(16.0, 1.0),v5=5
Debug.Log("TestModifier:TestRefOutIn:v1=" + v1 + ",v2=" + v2 + ",v3=" + v3 + ",v4=" + v4 + ",v5=" + v5);
//示范调用静态热更脚本中带ref/out/in修饰符的函数
v3 = new Vector2(2, 10);
v5 = 100;
TestRefOutInStatic(ref v1, out v2, ref v3, out v4, v5);
//下面输出 v1=1,v2=16,v3=(2.0, 112.0),v4=(16.0, 1.0),v5=100
Debug.Log("TestModifier:TestRefOutInStatic:v1=" + v1 + ",v2=" + v2 + ",v3=" + v3 + ",v4=" + v4 + ",v5=" + v5);
//示范调用热更脚本中带param修饰符的函数
Debug.Log("TestModifier:TestParams:" + TestParam("param1"));//输出 param1:
Debug.Log("TestModifier:TestParams:" + TestParam("param2", 1));//输出 param2:1,
Debug.Log("TestModifier:TestParams:" + TestParam("param3", 0, "abc"));//输出 param3:0,abc,
Debug.Log("TestModifier:TestParams:" + TestParam("param4", 3, "cba", 'x'));//输出 param4:3,cba,x,
//示范调用非热更脚本中带ref/out/in修饰符的函数
SampleNotHotUpdateScript example = new SampleNotHotUpdateScript();
string str1 = "Sunday";
string str2 = "Saturday";
v2 = 1;
example.TestRefOutIn(str1, ref str2, out v1, v2);
Debug.Log("TestModifier:(not hot update)TestRefOutIn:str2=" + str2 + ",v1=" + v1);//输出 str2=Sunday test,v1=11
//示范调用静态非热更脚本中带ref/out/in修饰符的函数
string str3 = "Monday";
SampleNotHotUpdateScript.TestRefOutInStatic("abc", ref str3, out v1, 123);
Debug.Log("TestModifier:(not hot update)TestRefOutInStatic:str2=" + str2 + ",v1=" + v1);//输出 str2=Sunday test,v1=137
//示范调用非热更脚本中带param修饰符的函数
Debug.Log("TestModifier:(not hot update)TestParams:" + example.TestParam());//输出 :
Debug.Log("TestModifier:(not hot update)TestParams:" + example.TestParam(10));//输出 :10,
Debug.Log("TestModifier:(not hot update)TestParams:" + example.TestParam(1, "xyz"));//输出 :1,xyz,
Debug.Log("TestModifier:(not hot update)TestParams:" + example.TestParam('y', "cba", 123));//输出 :y,cba,123,
}
void TestRefOutIn(ref int i, out int j, ref Vector2 k, out Vector2 l, in int m)
{
i += 1;
j = 10 + i + m;
k.x = i;
k.y = j;
l = new Vector2(j, i);
}
static void TestRefOutInStatic(ref int i, out int j, ref Vector2 k, out Vector2 l, in int m)
{
i += 1;
j = 10 + i + m;
k.x = i;
k.y = j;
l = new Vector2(j, i);
}
string TestParam(string strValue, params object[] objs)
{
string str = strValue + ":";
foreach (var obj in objs)
str += obj + ",";
return str;
}
}
}
namespace CSharpLike
{
/// <summary>
/// 非热更脚本部分(用于热更脚本测试ref out in param)
/// </summary>
public class SampleNotHotUpdateScript
{
public static void TestRefOutInStatic(string str1, ref string str2, out int i, in int j)
{
str2 = str1 + " testStatic";
i = str2.Length + j;
}
public void TestRefOutIn(string str1, ref string str2, out int i, in int j)
{
str2 = str1 + " test";
i = str2.Length * j;
}
public string TestParam(params object[] objs)
{
string str = "";
foreach (var obj in objs)
str += obj + ",";
return str;
}
}
}
本系列文章导读:
- Unity热更新方案C#Like(一)-序言
- Unity热更新方案C#Like(二)-导出官方示范的例子,确认方案可行性
- Unity热更新方案C#Like(三)-详解支持的C#特性:类
- Unity热更新方案C#Like(四)-详解支持的C#特性:委托和Lambda
- Unity热更新方案C#Like(五)-详解支持的C#特性:运算表达式
- Unity热更新方案C#Like(六)-详解支持的C#特性:循环语法
- Unity热更新方案C#Like(七)-详解支持的C#特性:get/set访问器
- Unity热更新方案C#Like(八)-详解支持的C#特性:多线程
- Unity热更新方案C#Like(九)-详解支持的C#特性:Using和命名空间
- Unity热更新方案C#Like(十)-详解支持的C#特性:宏和区域
- Unity热更新方案C#Like(十一)-详解支持的C#特性:枚举
- Unity热更新方案C#Like(十二-详解支持的C#特性:参数修饰符
- Unity热更新方案C#Like(十三)-详解支持的C#特性:函数重载和默认参数
- Unity热更新方案C#Like(十四)-详解支持的C#特性:异常处理
- Unity热更新方案C#Like(十五)-详解支持的C#特性:关键字:unsafe typeof nameof $ @ #pragma #warning #error
- Unity热更新方案C#Like(十六)-详解支持的C#特性:其他杂项:初始值设定项,表达式主体,内联变量声明
- Unity热更新方案C#Like(十七)-详解支持的长链接Socket和WebSocket
- Unity热更新方案C#Like(十八)-详解如何和Unity交互
- Unity热更新方案C#Like(十九)-详解KissJSON:唯一可以在本热更新框架使用的JSON库
- Unity热更新方案C#Like(二十)-详解KissCSV:一个简易实用的CSV表格读取方式
- Unity热更新方案C#Like(廿一)-详解KissFrameworkServer:对应的示范例子和官网所用的服务器框架
- Unity热更新方案C#Like(廿二)-详解内置的例子C#Like Demo:飞机大战,简易聊天室,简易账号/物品/邮件系统
- Unity热更新方案C#Like(廿三)-实战:示范如何把Unity官方免费例子Tanks! Tutorial转成可热更新项目
- Unity热更新方案C#Like(廿四)-实战:示范如何把Unity官方免费例子Platformer Microgame转成可热更新项目
- Unity热更新方案C#Like(廿五)-实战:示范如何建立初始包CSharpLikeFreeDemo项目
- Unity热更新方案C#Like(廿六)-(可选)详解免费版的演示如何升级到完整版的演示