UnrealScript的基本语法和基本使用,针对于Unreal3.

1:US设计目标 1> US内本身就存在有时间,状态和网络等方面的内部支持,简化了部分方面的复杂C++编程。 2> 它类似JAVA,提供了下列功能和特色。

@ 没有指针。 @ 有自动的垃圾回收。 @ 一个简单的继承类关系。 @ 编译时进行了强类型检查。 @ 像C/C++/JAVA代码一样熟悉的使用方式。

3> 为提高程序开发的简单性和强大性,US牺牲了执行速度。

2: 字符串操作符

$ 连接两个字符串。 例如:log( “A” $ “B” ); // 输出”AB” $= 连接两个字符串,并把值赋给前面那个。 例如:MyString $= “B”; // 等同于 MyString = MyString $ “B” @ 连接两个字符串,中间以一个空格间隔。 例如:log( “A” @ “B” ); // 输出”A B” @= 与$=类似,相当于在中间加有空格间隔。 例如:MyString @= “B”; // 等同于 MyString = MyString @ “B” < 按字母排序若第一个字符串的首位字母,ASC码小于第二个字符串的首位字母,则返回true。(注意:大小写敏感区分。大写字母ASC码均小于所有小写字母。) 例如:”Free” < “Knight” // true > 按字母排序若第一个字符串的首位字母,ASC码大于第二个字符串的首位字母,则返回true。(注意:大小写敏感区分。大写字母ASC码均小于所有小写字母。) 例如:”Free” < “Knight” // false <= 按字母排序若第一个字符串的首位字母,ASC码小于第二个字符串的首位字母,或两字符串完全相同,均返回true。(注意:大小写敏感区分。大写字母ASC码均小于所有小写字母。) 例如:”Free” <= “Knight” // true ”Free” <= ”Free” // true >= 按字母排序若第一个字符串的首位字母,ASC码大于第二个字符串的首位字母,或两字符串完全相同,均返回true。(注意:大小写敏感区分。大写字母ASC码均小于所有小写字母。) 例如:”Free” >= “Knight” // true ”Free” >= ”Free” // true == 若两字符串完全相同,则返回true(注意:大小写敏感区分) 例如:”Free” == “free” // false ”free” == “free” // true != 若两字符串不完全同,则返回true(注意:大小写敏感区分) 例如:”Free” != “free” // false ”free” != “free” // false ~= 若两字符串完全相同,则返回true(注意:大小写不再区分) 例如:”Free” ~= “free” // true ”free” ~= “free” // true -= 移除前面字符串中与B相同的部分。(注意:大小写敏感区分) 例如:MyString = “Free a: Freefree”;
MyString -= “Free”; log(MyString); // 输出” a: free”

3: 字符串相关函数 Len( string ) 返回string的长度,不包括尾部’/0’ 例如:Len( “Free” ); // 4

     Caps( string )
     返回 string 的大写版,建议对字符串进行比较前,进行大写规范化。
     例如:Caps( “Free” );   // FREE

     Locs( string )
    返回 string 的小写版,建议对字符串进行比较前,进行小写规范化。
     例如:Caps( “Free” );   // free

     InStr( string1, string2 )
     返回string1 里第一次出现string2的位置,若未找到,则返回-1。
     例如:InStr( “FreeKnight”, “free” );  // -1

     InStr( “freeknight”, “free” );  // 0
     InStr( “freeknight”, “knight” );  // 4

     Mid( string, int1, int2 )
     从 string 的 int1 个字符开始,复制int2个字符,被复制的部分自动产生一个新的字符串。若int2未指定,则复制到字符串末尾。
     例如:Mid( “FreeKnight”, 3, 2 );  // “eK”

     Mid( “FreeKnight”, 3 );   // “eKnight”

     Left( string, int1 )
     从 string 的最左边开始数,返回前 int1 个字节。
     例如:Left( “FreeKnight”, 5 );   // “FreeK”

     Right( string, int1 )
     从 string 的最右边开始数,返回后int1个字节。
     例如:Right( “FreeKnight”, 5 );   // “night”

     Chr( int1 )
    返回int1数字所表示的Unicode字符。Int1取值范围为: 0-65535
    例如:Chr( 65 );   // “A”

    Asc( string )
    返回string中第一个字母的数字编码,与Chr() 相反。
    例如:Asc( “A” );   // 65

    Divide( string, strD, str1, str2 )
    以StrD作为分割符,把String 分割为两个字符串。(若StrD出现多次,仅以第一次为有效。)
    例如:Divide( “FreeKnight”, “e”, str1, str2 );   // str1 = “Fr”,   str2 = “eKnight”

    Split( string, strD, array )
    以strD为分隔符将string分割为多个字符串。
    例如:Split( “FreeKnightFreeKnight”, “ee”, array );  // array[0] = ”Fr”, array[1] = ”KnightFr”, array[2] = “Knight”.

    Repl ( string, strS, strD, bool )
    用StrD代替string内的strS子字符串。Bool 标识是否大小写敏感。
    例如:Repl ( “FreeKnightfreeKnight”, “free”, “dark”, true );  // “FreeKnightdarkKnight”
    Repl ( “FreeKnightfreeKnight”, “free”, “dark”, false );  // “darkKnightdarkKnight”

    ReplaceText( string, strS, strD )
    类似于Repl,不同之处是替换后的结果保存到输入字符串内。大小写敏感。
    例如:MyStr = “FreeKnightfreeKnight”;
    Repl ( MyStr, “free”, “dark” );  // MyStr = “FreeKnightdarkKnight”

    StrCmp( string1, string2, int, bool )
    比较两个字符串有几个字符串相等。Int表示有多少字符串进行比较,默认为全部字符进行比较。Bool标志是否大小写敏感,默认为true,即大小敏感的。
    例如:StrCmp( “FreeKnight”, “freeKnight” );   // 9
    StrCmp( “FreeKnight”, “freeKnight”, 4 );  // 3
    StrCmp( “FreeKnight”, “freeKnight”, , true );  // 3
    StrCmp( “FreeKnight”, “freeKnight”, , false );  // 3

    Eval( bool, stringTrue, string False )
    根据bool的结果,true则返回stringTrue, false则返回 stringFalse。
    例如:Eval( 1 == 2, “true”, “false”);    // false

    EatStr( stringD, stringS, int )
    从stringS移动int个字符到stringD去。
    例如:D = “FreeKnight”;

    EatStr( S, D, 3 );   // S = “eKnight”,  D = “Fre”.

4:U3中US的新功能

1> Replication( 复制 )语句块只能适用于变量。 2> 函数复制Replication改为如下定义:function specifiers 3> 可以使用状态压栈和出栈。 4> US处理器允许宏和条件编译。 5> Structs允许设置默认属性。 6> 不再允许给配置或者局部变量默认值。 7> 在运行时,系统是随机的,不再允许执行 class ‘MyClass’.default.variable = 1 的操作。 8> 动态数组现在有一个新功能find(),可以用于查找一个元素的索引。 9> 新加一个foreach操作符可以进行动态数组的迭代。 10> UE3允许delegates作为函数的参数进行传递。 11> U3US增加了对接口的支持。 12> 从其他类中访问常量方式修改为: class ‘SomeClass’.const.SOMECONST 。 13> U3US支持多个定时器。 14> U3US可以指定操作函数参数的默认值。 15> 对US编辑器进行了修改,若US中属性声明的上面有一个 =/* tooltip text */= 形式的注释,则在编辑器属性窗口中,将鼠标放置在属性上可显示工具提示文本。 16> 可以通过将属性和各种类型的元数据进行关联,扩展游戏中和编辑器中的功能。

5:案例讲解

//----------------------------------------------------------------------------------------
// TriggerLight
// 一个可以通过出发进行开关的光源。
//----------------------------------------------------------------------------------------
Class TriggerLight extends Light;
//---------------------------------------------------------

// 变量
Var() float ChangeTIme;  // 光源从开到关所需要的时间
Var() bool bInitiallyOn;   // 记录开始是否是开启状态
Var() bool bDelayFullOn;  // 在到完全点亮之前是否有延迟时间
Var ELightType InitialType; // 光源的初始类型
Var float InitiallyOn;      // 光源的初始亮度
Var float Alpha,Direction;  // 光照透明度和朝向
Var actor Trigger;        // 陷阱器

//---------------------------------------------------------
// 引擎函数

// 在游戏开始播放时调用
Function BeginPlay()
{
    // 记忆光源的初始类型并为它设置一个新的类型
    Disable( ‘Tick’ );
    InitialType = LightType;
    InitialBrightness = LightBrightness;

    If( bInitiallyOn )
    {
        Alpha = 1.0;
        Direction = 1.0;
    }
    Else
    {
        LightType = LT_None;
        Alpha = 0.0;
        Direction = -1.0;
    }
}

// 当时间经过时调用
Function Tick( float DeltaTime )
{
    LightType = InitialType;
    Alpha += Direction * DeltaTime / ChangeTime;
    If( Alpha > 1.0 )
    {
           Alpha = 1.0;
           Disable( ‘Tick’ );
           If( Trigger != None )
           {
                 Trigger.ResetTrigger();
           }
    }
    Else if( Alpha < 0.0 )
    {
        Alpha = 0.0;
        Disable( ‘Tick’ );
        LightType = LT_None;
        If( Trigger != None )
        {
           Trigger.ResetTrigger();
        }
    }

    If( !bDelayFullOn )
    {
            LightBrightness = Alpha * InitalBrightness;
    }
    Else if( ( Direction > 0 & Alpha != 1 ) || Alpha == 0 )
    {
         LightBrightness = 0;
    }
    Else
    {
         LightBrightness = InitialBrightness;
    }
}

// 公有状态

// 触发打开光源
State() TriggerTurnsOn
{
    Function Trigger( actor Other, pawn EventInstigator )
    {
        Trigger = None;
        Direction = 1.0;
        Enable( ‘Tick’ );
    }
}

// 触发关闭光源
State() TriggerTurnsOff
{
    Function Trigger( actor Other, pawn EventInstigator )
    {
        Trigger = None;
        Direction = -1.0;
        Enable( ‘Tick’ );
    }
}

// 触发切换光源的开关
State() TriggerToggle
{
    Function Trigger( actor Other, pawn EventInstigator )
    {
        Log( “Toggle” );
        Trigger = Other;
        Direction *= -1;
        Enable( ‘Tick’ );
    }
}

// 触发控制光源
State() TriggerControl
{
    Function Trigger( actor Other, pawn EventInstigator )
    {
            Trigger = Other;
            If( bInitiallyOn )
            {
                Direction = -1.0;
            }
            Else
            {
                    Direction = 1.0;
            }
        Enable( ‘Tick’ );
    }

    Function UnTrigger( actor Other, pawn EventInstigator )
    {
            Trigger = Other;
            If( bInitiallyOn )
            {
                Direction = 1.0;
            }
            Else
            {
                Direction = -1.0;
            }
        Enable( ‘Tick’ );
    }
}

说明讲解:

1> 类的声明。每个类”extends”继承一个类。并且每个类属于一个”package”包。一组对象一起发布。属于一个类的所有功能和变量,仅属于哪个类的Actor可以访问。没有整个系统范围可以使用的全局函数或变量。 2> 变量声明。US支持多种变量类型,包括大多数C/JAVA类型,对象引用,结构体和数组。另外,变量可以被设置为可编辑的属性,这样设计人员在UE中级是不是用任何编码就可以访问这些变量了。这些属性通过var()语法来指定,而不再使用var。(注意小括号) 3> 函数。函数可以有多个参数,一个返回值,也可以有局部变量。有些函数是虚幻引擎本身调用的,例如BeginPlay,有些函数则是由其他脚本调用的,例如Trigger。 4> 代码。支持所有的标准的C和JAVA关键字。 5> Actor和Object对象引用。这里可以看到几个在另外一个对象中使用对象引用调用一个函数的情况。 6> 额外关键词state。这个脚本定义了多个state,它们是由函数,变量和这个物体在那个状态所执行的代码组成。 7> 对US来说,所有关键字变量名对象名函数名,都是大小写不敏感的。 8> 继承。Class MyClass extends MyParentClass; 此时MyClass继承了父类所有的变量函数和状态。