This page has been translated automatically.
视频教程
界面
要领
高级
实用建议
专业(SIM)
UnigineEditor
界面概述
资源工作流程
版本控制
设置和首选项
项目开发
调整节点参数
Setting Up Materials
设置属性
照明
Sandworm
使用编辑器工具执行特定任务
如何擴展編輯器功能
嵌入式节点类型
Nodes
Objects
Effects
Decals
光源
Geodetics
World Nodes
Sound Objects
Pathfinding Objects
Players
编程
基本原理
搭建开发环境
使用范例
C++
C#
UUSL (Unified UNIGINE Shader Language)
Plugins
File Formats
材质和着色器
Rebuilding the Engine Tools
GUI
双精度坐标
应用程序接口
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
创建内容
内容优化
材质
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials

函数

警告
UnigineScript的应用范围仅限于实现与材质相关的逻辑(材质表达式,可编写脚本的材质,画笔材质)。 不要将UnigineScript用作应用程序逻辑的语言,请改用C#/C++,因为这些API是首选的。 无法保证UnigineScript中新引擎功能的可用性(超出其应用范围),因为当前的支持级别仅假设已解决关键问题。

function是一组语句,在程序的某处调用时便执行这些语句。以下是其格式:

源代码 (UnigineScript)
type name(parameter1, parameter2, ...) {
	// 语句 
}

函数用法举例:

源代码 (UnigineScript)
int foo(int a,int b) {
	return a + b;
}

int sum;
sum = foo(3,4); // 'sum' is 7

在使用函数之前仅能定义一种函数原型:

源代码 (UnigineScript)
int foo(int a,int b);
foo(5,2);

int foo(int a,int b) {
	return a + b;
}

所有函数为全局范围。

Returning a Value返回值#

voidvoid#

空函数代表函数中无变量,这种函数被用来在不返回结果的函数中作为返回值使用。

源代码 (UnigineScript)
// 这种函数不会返回任何数值。
	void func() {
	log.message("func is called\n");
}

Return Values返回值#

在可选的 return 语句帮助下返回数值。可返回任意 数据类型 ,除开下列类型 向量贴图枚举

使用void返回类型的函数总是返回0。

Parameter Passing Mechanism参数传递机制#

Passing Arguments by Reference使用引用传递参数#

默认情况下,函数参数通过数值进行传递因此如果在函数范围内更改了参数值,并不会对函数外的部分产生任何影响。如果想通过函数对其参数进行修改,就必须使用引用进行参数传递。

如果总是想通过引用进行函数参数的传递,在定义函数时使用(&)符号对其进行标记。

源代码 (UnigineScript)
void foo(int &a,int b) {
	a = 13; // 这样将影响到变量以外的部分因为'a' 被作为引用进行传递
	b = 14;
}

int a = -1;
int b = 20;
foo(a,b);
log.message("%d %d\n",a,b);

// 结果为: "13 20"

通常使用引用将容器和类的实例进行传递。例如:

源代码 (UnigineScript)
class Foo {
	int v;
};

void foo(int &v) {
	if(v) log.message("%d ",v);
	v = 13;
}

Foo f = new Foo();
foo(f.v);
foo(f.v);

int v[] = (0);
foo(v[0]);
foo(v[0]);

Foo f1[] = (new Foo());
foo(f1[0].v);
foo(f1[0].v);

//输出为: 13 13 13

Passing Containers as Arguments将容器作为参数进行传递#

要将 向量贴图 作为参数进行传递,需使用适当的函数说明,如下所示:

源代码 (UnigineScript)
void foo(int a[]) {
	a[13] = 321;
}

int arr[] = ( 1, 2, 3, 4 );
foo(arr);

Accessing Elements of the Function访问函数的元素#

可以下列方式对函数返回的数值元素进行访问:

源代码 (UnigineScript)
vec3 foo() { return vec3(1.0,2.0,3.0); }
log.message("%f %f\n",foo().x,foo()[0]); // 结果为: 1 1
log.message("%f %f\n",translate(1.0,2.0,3.0).m23,translate(1.0,2.0,3.0)[14]); // 结果为:3 3

请注意如果返回值为class,需对其强制转换为自身类型。

源代码 (UnigineScript)
class Bar {
	string toString() {
		return "bar";
    }
};

Bar bar() { return new Bar() };
log.message("%s\n",Bar(bar()).toString());

Default Argument Values默认参数值#

可为函数参数提供默认值。此后如果您参数为空,就会使用默认值。省略的参数可使用逗号进行表示(不需留空白区域)。

源代码 (UnigineScript)
void foo(int a = 1,int b = 2) {
	log.message("%d %d\n",a,b);
}

foo(); // 结果为: 1 2
foo(3,4); // 结果为: 3 4
foo(3); // 结果为: 3 2
foo(,4); // 结果为: 1 4

Technique of Using Functions函数使用方法#

Function Overloading函数过载#

在此处了解函数过载内容

Using Inline Functions使用内联函数#

拥有下列标记和实体的函数将自动进行内联,这样的方式可使用户自定义的类实现明显的速度优化:

源代码 (UnigineScript)
void get() { return a; }
void set(int b) { a = b; }
void get(int i) { return a[i]; }
void set(int i,int b) { a[i] = b; }

__FUNC____FUNC__#

__FUNC__预处理器常数会时刻对正确的函数进行报告。任何情况下都不会影响到性能。

源代码 (UnigineScript)
// __FUNC__ == 函数标记

class MyClass {
	int doSomethingWithNode(Node node) {
		if(node == NULL) {
			log.error("%s: node is NULL\n",__FUNC__);
		}
  
    }

};

// 输出: MyClass::doSomethingWithNode(): node is NULL

Using Anonymous Functions使用匿名函数#

使用匿名函数来创建无函数名的函数。 当您需要调用简短函数或在代码其它地方不需要再使用的函数(因此这种函数的名称并不重要),匿名函数就显得很有用。 使用C++的语法方式对匿名函数进行声明:

源代码 (UnigineScript)
[]() { log.message("hello!\n");

匿名函数的声明(the []() {}; construction)总是会返回函数的标识符。

注意
函数自身可返回任意数值。
因此,可声明匿名函数并将其作为参数传递给某个接受函数标识符的函数,例如:
  • 传递给Async类的run()函数(参看data/samples/systems/socket_3实例)。
  • 传递给call()容器函数:
    源代码 (UnigineScript)
    int a[0];
    // 将2种匿名函数附加给数组 
    a.append([](int a) { log.message("array callback 0 %d\n",a); });
    a.append([](int a) { log.message("array callback 1 %d\n",a); });
    // 调用存在数组中的所有函数
    a.call(1);
    
    // 输出:
    // array callback 0 1
    // array callback 1 1
  • 传递给call()的控制语句:
    源代码 (UnigineScript)
    call([]() { log.message("foo\n"); });
    call([](int a) { printf("foo %d\n",a); },1);
    
    // 输出:
    // foo
    // foo 1
    源代码 (UnigineScript)
    int f = []() { log.message("callback\n"); };
    call(f);
    
    //输出: callback
最新更新: 2017-07-03
Build: ()