【打发时间之US脚本】读书笔记4
2014-02-08 20:36
309 查看
读书笔记3搁浅了,可能是UDN教程上的炮台模型的骨骼坐标出现问题,yaw pitch roll变量全部乱了,如果按照他那个坐标来的话,我估计会疯掉,先写4吧
一、Delegates(代理)
1.开头:
Delegates是到实例中到函数的引用(cry,原文是什么个意思)
Delegates由两个编程概念组成:函数和变量。
代理和变量类似,因为它可以存储值并且可以在运行时改变。
2.概述:
当运行时要求代码执行具有动态性和灵活性时,通常会使用代理(=。=多态?)
2.1代码1
这段代码是在运行时动态地改变代码执行的一种方法。不灵活,需要添加很多条件时,需要很多精力去维护Bar()。
2.2代码2
这段代码比上一段好点,首先,它删除了全局变量和运行Bar()时对该变量的判断。
但是仍然很麻烦。
2.3代码3
这段代码更加好,删除了switch。无论添加多少个不同条件,都不需要维护Foo()或Bar()函数(虽然不是很清楚delegate内部,接着往下看吧)
3.声明代理(Delegate)
代理(Delgate)的声明方法和函数声明一样。但是她没有使用关键字function,而是使用关键字delegate
delegate Foo();
这个类现在有一个名称为Foo()的代理
3.1代理参数
和函数一样,代理可以具有参数。当函数和代理结合使用时,函数也必须包含和代理一样的参数,请考虑以下情况:
把FooBoom()分配给Foo()是有效的,但是把FooFail()分配给Foo()是无效的。
注意:不过有这么一个例外
可以吧FooBoom()分配给Foo()仍然是幼小的,但不能在FooBoom()中使用Moe。代理也可以具有返回参数。
3.2默认行为
打印:
不是默认行为!
默认行为!
小节:大概理解代理的意思,有点像C++中的。。。那个。。。我也忘记了,好久没看C++都忘记了,反正就是像那啥来着的~
4.代理变量
可以像使用变量那样来使用代理。不能进行算术计算,但是可以赋值。
delegate Foo();
function Bar();
function PostBeginPlay()
{
Foo = Bar;
}
有时候比较代理来查看它们当前正在引用的函数式什么。请考虑以下情况:
delegate Foo();
function Bar();
function Rod();
function PostBeginPlay()
{
Foo = Bar;
if(Foo == Bar)
`Log("Foo是Bar");
}
5.传递Delegate给函数
delegate Foo();
function Bar();
function PassDelegate()
{
ReceiveDelegate(Bar);
}
function ReceiveDelegate(delegate<Foo> FooDelegate)
{
Foo = FooDelegate;
}
代理是私有的或保护的,所以其他类不能正常地访问代理,比如:
class Pizza extends Object;
private delegate Eat();
function EatMe()
{
Eat();
}
function HowToEat(delegate<Eat> EatDelegate)
{
Eat = EatDelegate;
}
class Mushroom extends Object;
function SpitOut()
{
`Log("卧槽,我吐了,太难吃了");
}
function EatPizza(Pizza pizza)
{
if(pizza != none)
{
pizza.HowToEat(SpitOut);
pizza.EatMe();
}
}
6.代理和内存
当代理引用了世界中的actor实例中纯在的函数时,删除那个actor实例是安全的。
但是代理引用了存在于另一个对象实例中的函数,则必须把代理设为none,因为
US不能根据请求来销毁对象实例,所以所有的循环引用都必须被删除,否则将不
能对该对象实例进行垃圾回收,那么当前关卡改变或当游戏退出时可能会发生内
存泄露。
一、Delegates(代理)
1.开头:
Delegates是到实例中到函数的引用(cry,原文是什么个意思)
Delegates由两个编程概念组成:函数和变量。
代理和变量类似,因为它可以存储值并且可以在运行时改变。
2.概述:
当运行时要求代码执行具有动态性和灵活性时,通常会使用代理(=。=多态?)
2.1代码1
var int GlobalVar; function Foo(float value) { GlobalVar = value; Bar(); } function Bar() { switch(GlobalVar) { case 0: DoThis(); break; case 1: DoThat(); break; default: DoDefault(); break; } }
这段代码是在运行时动态地改变代码执行的一种方法。不灵活,需要添加很多条件时,需要很多精力去维护Bar()。
2.2代码2
delegate Bar(); function Foo(float value) { switch(value) { case 0: Bar = DoThis(); break; case 1: Bar = DoThat(); break; default: Bar = DoDefault(); break; } Bar(); }
这段代码比上一段好点,首先,它删除了全局变量和运行Bar()时对该变量的判断。
但是仍然很麻烦。
2.3代码3
delegate Bar(); function Foo(delegate<Bar> BarDelegate) { Bar = BarDelegate; Bar(); }
这段代码更加好,删除了switch。无论添加多少个不同条件,都不需要维护Foo()或Bar()函数(虽然不是很清楚delegate内部,接着往下看吧)
3.声明代理(Delegate)
代理(Delgate)的声明方法和函数声明一样。但是她没有使用关键字function,而是使用关键字delegate
delegate Foo();
这个类现在有一个名称为Foo()的代理
3.1代理参数
和函数一样,代理可以具有参数。当函数和代理结合使用时,函数也必须包含和代理一样的参数,请考虑以下情况:
delegate Foo(const float Bar, const float Doh); function FooBoom(const float Bar, const float Doh); function FooFail(const float Bar);
把FooBoom()分配给Foo()是有效的,但是把FooFail()分配给Foo()是无效的。
注意:不过有这么一个例外
delegate Foo(const float Bar, const float Doh, optional float Moe); function FooBoom(const float Bar, const float Doh);
可以吧FooBoom()分配给Foo()仍然是幼小的,但不能在FooBoom()中使用Moe。代理也可以具有返回参数。
3.2默认行为
delegate Foo() { `Log("默认行为!"); } function Bar() { `Log("不是默认行为!"); } function Bing() { Foo = Bar; Foo(); Foo() = none; Foo() ; }
打印:
不是默认行为!
默认行为!
小节:大概理解代理的意思,有点像C++中的。。。那个。。。我也忘记了,好久没看C++都忘记了,反正就是像那啥来着的~
4.代理变量
可以像使用变量那样来使用代理。不能进行算术计算,但是可以赋值。
delegate Foo();
function Bar();
function PostBeginPlay()
{
Foo = Bar;
}
有时候比较代理来查看它们当前正在引用的函数式什么。请考虑以下情况:
delegate Foo();
function Bar();
function Rod();
function PostBeginPlay()
{
Foo = Bar;
if(Foo == Bar)
`Log("Foo是Bar");
}
5.传递Delegate给函数
delegate Foo();
function Bar();
function PassDelegate()
{
ReceiveDelegate(Bar);
}
function ReceiveDelegate(delegate<Foo> FooDelegate)
{
Foo = FooDelegate;
}
代理是私有的或保护的,所以其他类不能正常地访问代理,比如:
class Pizza extends Object;
private delegate Eat();
function EatMe()
{
Eat();
}
function HowToEat(delegate<Eat> EatDelegate)
{
Eat = EatDelegate;
}
class Mushroom extends Object;
function SpitOut()
{
`Log("卧槽,我吐了,太难吃了");
}
function EatPizza(Pizza pizza)
{
if(pizza != none)
{
pizza.HowToEat(SpitOut);
pizza.EatMe();
}
}
6.代理和内存
当代理引用了世界中的actor实例中纯在的函数时,删除那个actor实例是安全的。
但是代理引用了存在于另一个对象实例中的函数,则必须把代理设为none,因为
US不能根据请求来销毁对象实例,所以所有的循环引用都必须被删除,否则将不
能对该对象实例进行垃圾回收,那么当前关卡改变或当游戏退出时可能会发生内
存泄露。
相关文章推荐
- 【打发时间之US脚本】读书笔记2
- 【打发时间之US脚本】读书笔记1
- js日期时间控件脚本
- perl脚本学习指南--读书笔记
- Scripts:基于时间显示闪回日志中redo的脚本fdb_redo_time_matrix.sql
- Shell实现系统时间和BIOS时间同步校准脚本分享
- 如何使用Docker构建运行时间较长的脚本
- python多线程异步post请求脚本,可以设置持续运行时间、线程数、时间间隔
- JavaScript-2.内置对象---简单脚本之弹出对话框显示当前时间 ---ShinePans
- 记: 无聊的时间用写代码来打发~~~
- DI 获取系统时间 用sql脚本插入数据库
- 【Powershell】【CPU使用率】脚本实时获取所有cpu使用时间非0的进程
- Unity脚本时间执行顺序
- PHP设置脚本最大执行时间的三种方法
- shell 计算脚本执行时间
- 获取两个日期间隔时间的shell脚本代码
- PHP-获取脚本执行时间
- 设置shell脚本开始执行时间以及结束时间
- Server.ScriptTimeOut:处理脚本运行时间长的方法
- 《Linux命令、编辑器与Shell编程》读书笔记12-函数和脚本