首页 > 代码库 > Unity3D热更新全书-脚本(二) 两级分化
Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行。
可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同的复杂度脚本将表现出完全不同的样貌,我们来看一下。
复杂度一:计算
执行字符串的核心函数应该是这样的
int i = Eval(“1+2”);
我们有一套例子,本文最后有如何取得例子的说明。
程序里就可以通过执行字符串来执行逻辑,字符串的变更就可以得到逻辑的变更。
试想如果要做公式计算,他看起来应该是这样
int i=Eval(“HP1+HP2*0.5);
这里HP1,HP2怎么来,就要把值传给脚本,让脚本计算
Script.SetValue(“HP1”,GetFromIni(“HP1”));
Script.SetValue(“HP2”,GetFromIni(“HP2”));
int i=Script.Eval(“HP1+HP2*0.5”);
复杂度二:包含逻辑分支和调用
当脚本逻辑的复杂度到一个程度,直接嵌入字符串就变得不可取了
我们希望在计算HP的同时,脚本打点Log,就要让脚本可以调用函数,同时脚本要知道今天星期几,也得给他一个函数调用
这时候最好就把脚本写到一个单独的文本文件里
Script1:
Debug.Log(“Today=”+Today());
if(Today()==Monday)
return HP1+HP2;
if(Today()==SunDay)
return HP1+HP2*2;
return HP1+HP2*0.5;
调用代码:
int i =Script.Eval(GetScriptFromFile(“Script1”));
复杂度三:函数与类型
当脚本逻辑再复杂下去,仅靠表达式已经很难组织逻辑了,此时的脚本就会引入函数甚至类型
Script1:
int Calc1()
{
…
}
int Calc2()
{
…
}
int Calc3()
{
…
}
int GetHP()
{
if(Today()==Monday)
{
return Calc1();
}
if(…)
{
….
}
….
}
调用代码:
Script.Build(GetScriptFromFile(“Script1”));
int i =Script.Eval(“GetHP();”);
复杂度四:进化
再进一步复杂,脚本就会进化为完全不同的东西
单个脚本无法完成逻辑,脚本和脚本之间可以产生关联
产生了项目的概念
Script1:
class ScriptClass1
{
static void Run()
{
ScriptClass2 s2 =new ScriptClass2();
s2.xxx
…
…
…
}
}
Script2:
class ScriptClass2
{
…
….
…
}
调用代码:
Script.BuildProject(“Scirpt1”,”Script2”)
Script.Run(“ScriptClass1.Run();”);
复杂度五:反客为主
当脚本已经产生项目的概念,他已经可以脱离专用的程序宿主
像Python那样用一个通用的Python.exe 启动程序,变成一种拥有独自运行能力的语言。
本系列会展示从各种复杂度展示脚本与Unity3D的整合
具体代码参考GitHub上的代码,使用