UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Landscape Tool
Using Editor Tools for Specific Tasks
FAQ
编程
Fundamentals
Setting Up Development Environment
Usage Examples
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
应用程序接口
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
CIGI Client Plugin
Rendering-Related Classes

函数

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;
}

所有函数为全局范围。

返回值#

void#

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

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

返回值#

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

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

参数传递机制#

使用引用传递参数#

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

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

源代码 (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

将容器作为参数进行传递#

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

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

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

访问函数的元素#

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

源代码 (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());

默认参数值#

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

源代码 (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

函数使用方法#

函数过载#

在此处了解函数过载内容

使用内联函数#

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

源代码 (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__预处理器常数会时刻对正确的函数进行报告。任何情况下都不会影响到性能。

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

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

};

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

使用匿名函数#

使用匿名函数来创建无函数名的函数。 当您需要调用简短函数或在代码其它地方不需要再使用的函数(因此这种函数的名称并不重要),匿名函数就显得很有用。 使用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