自定义语法书写规范

1. 脚本结构概述

脚本由周期块(Cycle Blocks)组成,每个周期块决定代码的执行时机。脚本支持以下六种周期类型:

  • Now:立即执行一次,执行完后脚本自动销毁。
  • Once:在对象初始化时(Start 方法)执行一次。
  • Loop:每帧执行(Update 方法),持续运行。
  • Import:定义需要引入的命名空间(如 UnityEngine)。
  • Value:定义变量(如 int x = 5)。
  • Method:定义自定义方法,可在其他地方调用。

每个周期块用冒号 : 开始,后面跟大括号 {} 包裹具体语句。语句可以是命令(如 Move)、原生 C# 代码注释

基本格式

CycleType: {
    Statement1
    Statement2
    ...
}

示例脚本

Now: {
    Move(up, 1)  // 立即向上移动 1 单位
}
Once: {
    Rotate((0, 90, 0))  // 初始化时旋转 90 度
}
Loop: {
    Move(north, 0.1)  // 每帧向前移动 0.1 单位
}

2. 周期类型详解

2.1 Now(立即执行)

  • 用途:适合执行一次性动作,如初始化位置、打印消息等。
  • 特点:生成临时脚本,执行完后销毁。
  • 示例
    Now: {
        Move(up, 2)  // 向上移动 2 单位
        print("Game started!", "green")  // 打印绿色消息
    }
    

2.2 Once(初始化执行)

  • 用途:适合设置初始状态,如旋转对象、添加碰撞体等。
  • 特点:在对象加载时执行一次。
  • 示例
    Once: {
        Scale((2, 2, 2))  // 将对象缩放为 2 倍
        AddCollider("box")  // 添加盒状碰撞体
    }
    

2.3 Loop(循环执行)

  • 用途:适合持续运行的动作,如移动、检测碰撞等。
  • 特点:每帧执行,适合动画或持续交互。
  • 示例
    Loop: {
        Move(forward, 0.05)  // 每帧向前移动 0.05 单位
        print("Moving...", "blue")  // 每帧打印蓝色消息
    }
    

2.4 Import(引入命名空间)

  • 用途:声明需要使用的命名空间,通常用于原生 C# 语句。
  • 特点:语句会添加到生成的 C# 脚本顶部。
  • 示例
    Import: {
        UnityEngine
        System.Collections
    }
    

2.5 Value(变量声明)

  • 用途:定义变量,供脚本其他部分使用。
  • 特点:变量声明会添加到生成的 C# 脚本类中。
  • 示例
    Value: {
        float speed = 2.5
        int count = 0
    }
    

2.6 Method(自定义方法)

  • 用途:定义可重复调用的方法,封装复杂逻辑。
  • 特点:支持 voidIEnumerator 返回类型,可包含命令或原生 C# 语句。
  • 格式
    Method: {
        [public|private] [void|IEnumerator] MethodName(params) {
            Statements
        }
    }
    
  • 示例
    Method: {
        public void Jump() {
            Move(up, 3, "Instant")
            print("Jumped!", "yellow")
        }
    }
    Now: {
        Jump()  // 调用自定义方法
    }
    

3. 支持的命令(方法)

命令是脚本的核心,用于控制游戏对象的动作、事件和交互。以下是所有支持的命令及其用法,参数用逗号分隔。

3.1 移动相关

  • Move(direction, amount, moveType, duration)
    移动对象到指定方向。

    • direction:方向(如 up, north, (1,2,3))或方向+距离(如 up 1)。
    • amount:移动距离(可选,默认 1)。
    • moveType:移动类型("Smooth", "Instant", "Easing",可选,默认 "Smooth")。
    • duration:移动持续时间(秒,可选,默认 1)。
    • 示例
      Move(up, 1)  // 向上移动 1 单位
      Move(north 2, "Instant")  // 立即向前移动 2 单位
      Move((1, 0, 0), 1, "Smooth", 2)  // 沿 X 轴移动 1 单位,耗时 2 秒
      
  • MoveTo(position)
    立即移动到指定位置。

    • position:目标位置,如 (1,2,3)
    • 示例
      MoveTo((0, 5, 0))  // 移动到 Y=5 的位置
      

3.2 旋转相关

  • Rotate(rotation, rotateType, duration)
    旋转对象。
    • rotation:旋转角度,如 (0, 90, 0)(绕 Y 轴旋转 90 度)。
    • rotateType:旋转类型("Smooth", "Instant", 可选,默认 "Smooth")。
    • duration:旋转持续时间(秒,可选,默认 1)。
    • 示例
      Rotate((0, 45, 0))  // 绕 Y 轴旋转 45 度
      Rotate((90, 0, 0), "Instant")  // 立即绕 X 轴旋转 90 度
      

3.3 缩放相关

  • Scale(scale, scaleType, duration)
    缩放对象。
    • scale:缩放比例,如 (2,2,2)(放大 2 倍)。
    • scaleType:缩放类型("Smooth", "Instant", 可选,默认 "Smooth")。
    • duration:缩放持续时间(秒,可选,默认 1)。
    • 示例
      Scale((1.5, 1.5, 1.5))  // 放大 1.5 倍
      Scale((2, 1, 1), "Instant")  // 立即沿 X 轴放大 2 倍
      

3.4 物理相关

  • Force(direction, applyPoint, duration)
    施加力到刚体。

    • direction:力方向,如 up 10(0, 100, 0)
    • applyPoint:施力点("center", 可选,默认 "center")。
    • duration:持续时间(秒,可选,默认 1)。
    • 示例
      Force(up 50)  // 向上施加 50 单位力
      
  • AddCollider(colliderType, size, radius, isTrigger)
    添加碰撞体。

    • colliderType:类型("box", "sphere", "capsule", 默认 "box")。
    • size:盒状碰撞体尺寸,如 (1,1,1)(可选)。
    • radius:球形碰撞体半径(可选,默认 0.5)。
    • isTrigger:是否为触发器(truefalse,可选,默认 false)。
    • 示例
      AddCollider("sphere", , 1)  // 添加半径为 1 的球形碰撞体
      AddCollider("box", (2,2,2), , true)  // 添加触发器盒状碰撞体
      
  • AddRigidbody(mass, drag, isKinematic)
    添加刚体。

    • mass:质量(默认 1)。
    • drag:阻力(默认 0)。
    • isKinematic:是否为运动学刚体(truefalse,默认 false)。
    • 示例
      AddRigidbody(2, 0.5)  // 添加质量为 2 的刚体
      
  • ApplyImpulse(impulse, applyPoint)
    施加瞬时冲量。

    • impulse:冲量,如 (0, 100, 0)
    • applyPoint:施力点("center", 默认 "center")。
    • 示例
      ApplyImpulse((0, 200, 0))  // 向上施加 200 单位冲量
      
  • LockRotation(lockX, lockY, lockZ)
    锁定刚体旋转。

    • lockX, lockY, lockZ:是否锁定 X、Y、Z 轴(truefalse)。
    • 示例
      LockRotation(true, false, true)  // 锁定 X 和 Z 轴旋转
      
  • SetPhysicsMaterial(friction, bounciness)
    设置物理材质。

    • friction:摩擦系数(0-1,默认 0.5)。
    • bounciness:弹性系数(0-1,默认 0)。
    • 示例
      SetPhysicsMaterial(0.2, 0.8)  // 设置低摩擦、高弹性材质
      

3.5 检测相关

  • Meet(direction, distance, origin)
    沿指定方向发射射线,返回击中的对象。

    • direction:射线方向,如 north(0,0,1)
    • distance:射线距离。
    • origin:起点对象(可选,默认主相机)。
    • 示例
      Meet(north, 10)  // 向前检测 10 单位
      
  • ?Meet(direction, distance, origin, expectedName)
    检查是否击中指定对象。

    • expectedName:预期对象名称(可选)。
    • 示例
      ?Meet(up, 5, , "Enemy")  // 检查上方 5 单位是否有名为 "Enemy" 的对象
      
  • RaycastFromMouse(distance, expectedName)
    从鼠标位置发射射线。

    • distance:射线距离(默认 100)。
    • expectedName:预期对象名称(可选)。
    • 示例
      RaycastFromMouse(50)  // 从鼠标位置检测 50 单位
      
  • RaycastFromCamera(direction, distance, expectedName)
    从相机中心沿指定方向发射射线。

    • 示例
      RaycastFromCamera(forward, 20, "Target")  // 从相机向前检测 20 单位
      

3.6 事件相关

  • OnCollision(target, otherName, action, actionParams)
    注册碰撞事件。

    • target:目标对象(通常 this)。
    • otherName:碰撞对象的名称。
    • action:触发动作(如 Move)。
    • actionParams:动作参数。
    • 示例
      OnCollision(this, "Enemy", "Delete")  // 碰撞 "Enemy" 时销毁
      
  • OnTrigger(target, otherName, action, actionParams)
    注册触发器进入事件。

    • 示例
      OnTrigger(this, "Player", "Move", "up 1")  // 触发器进入 "Player" 时向上移动
      
  • OnKeyPress(target, keyName, action, actionParams)
    注册键盘按键事件。

    • keyName:按键名称(如 "Space", "A")。
    • 示例
      OnKeyPress(this, "Space", "Jump")  // 按空格键调用 Jump 方法
      
  • OnMouseClick(target, action, actionParams)
    注册鼠标点击事件。

    • 示例
      OnMouseClick(this, "Scale", "(2,2,2)")  // 点击对象时放大 2 倍
      

3.7 相机控制

  • CameraFollow(target, offset, smoothSpeed)
    相机跟随目标。

    • offset:偏移量,如 (0,2,0)(可选)。
    • smoothSpeed:平滑速度(0-1,默认 0.125)。
    • 示例
      CameraFollow(this, (0, 3, -5))  // 相机跟随对象,偏移 Y=3, Z=-5
      
  • CameraLookAt(target, targetPosition)
    相机朝向目标或位置。

    • target:目标对象(可选)。
    • targetPosition:目标位置(可选)。
    • 示例
      CameraLookAt(this)  // 相机朝向对象
      CameraLookAt(, (0, 0, 0))  // 相机朝向原点
      

3.8 对象操作

  • generate(prefabName, position)
    生成预制体。

    • prefabName:预制体名称(需在 Resources 文件夹)。
    • position:生成位置。
    • 示例
      generate("Cube", (0, 5, 0))  // 在 Y=5 生成 Cube 预制体
      
  • Delete()
    销毁对象。

    • 示例
      Delete()  // 销毁自身
      
  • Write(content, cycleType)
    附加脚本内容。

    • content:脚本内容。
    • cycleType:周期类型(默认 "Now")。
    • 示例
      Write("Move(up, 1)", "Now")  // 附加立即执行的移动脚本
      

3.9 其他

  • print(message, color)
    打印消息到输出面板。

    • message:消息内容。
    • color:颜色(如 "red", (1,0,0),默认 "black")。
    • 示例
      print("Hello, World!", "blue")  // 打印蓝色消息
      print("Error!", "(1, 0, 0)")  // 打印红色消息
      
  • Wait(time, condition)
    等待指定时间或条件。

    • time:等待时间(秒,可选)。
    • condition:等待条件(对象名称,可选)。
    • 示例
      Wait(2)  // 等待 2 秒
      Wait(, "Enemy")  // 等待直到检测到 "Enemy"
      
  • ChangeTimeScale(scale)
    更改游戏时间缩放。

    • scale:时间缩放值(如 0 表示暂停)。
    • 示例
      ChangeTimeScale(0.5)  // 游戏速度减半
      

4. 方向和向量

方向关键字简化移动和旋转命令,自动转换为 Vector3

  • 基本方向
    • up(0, 1, 0)
    • down(0, -1, 0)
    • north(0, 0, 1)(向前)
    • south(0, 0, -1)(向后)
    • east(1, 0, 0)(向右)
    • west(-1, 0, 0)(向左)
  • 轴方向
    • x+(1, 0, 0), x-(-1, 0, 0)
    • y+(0, 1, 0), y-(0, -1, 0)
    • z+(0, 0, 1), z-(0, 0, -1)
  • 向量格式
    • (x, y, z):如 (1, 2, 3)
    • 方向+距离:如 up 1(等价于 Vector3.up * 1)。

示例

Move(up 2)  // 向上移动 2 单位
Rotate((0, 90, 0))  // 绕 Y 轴旋转 90 度
Force(north 100)  // 向前施加 100 单位力

5. 中文支持

脚本支持中文关键字,降低学习门槛。以下是常用中文关键字及其对应英文:

  • 周期
    • 立即执行Now
    • 初始执行Once
    • 始终执行Loop
    • 引入Import
    • 变量Value
    • 方法Method
  • 方法类型
    • 函数void
    • 协程函数IEnumerator
  • 访问修饰
    • 公共public
    • 私有private
  • 控制流
    • if
    • or
    • and
    • 返回return
  • 对象操作
    • 销毁destroy
    • 启用enable
    • 禁用disable
    • 已启用enabled
  • 内置对象
    • 对象Object
    • 摄像机Camera
    • 鼠标Mouse
  • 输入检测
    • 按下Input.GetKeyDown
    • 松开Input.GetKeyUp
    • 按住Input.GetKey
    • 按键KeyCode

示例

立即执行: {
    移动(上, 1)
    打印("开始游戏!", 红)
}
方法: {
    公共 函数 跳跃() {
        移动(上, 3, "瞬时")
    }
}

6. 赋值和变量

6.1 变量声明

Value 块中声明变量,支持 C# 类型(如 int, float, string)。

示例

Value: {
    float speed = 2.5
    string message = "Hello"
}

6.2 赋值

支持简单赋值,修改坐标、旋转或缩放。

格式

variable = value
variable += value
variable -= value

支持的变量

  • 坐标:x, y, z
  • 旋转:rotate.x, rotate.y, rotate.z
  • 缩放:scale.x, scale.y, scale.z

示例

x = 5  // 设置 X 坐标为 5
rotate.y = 90  // 绕 Y 轴旋转到 90 度
scale.x += 0.1  // X 轴缩放增加 0.1

7. 原生 C# 语句

脚本支持直接嵌入原生 C# 语句,适合高级用户。未识别为命令的语句会作为 RawStatement 保留。

示例

Value: {
    int counter = 0
}
Loop: {
    if (counter < 5) {
        Move(up, 0.2)
        counter += 1
    }
}

注意

  • 需确保语法正确,否则编译会报错。
  • 建议配合 Import 块引入必要命名空间。

8. 注释

注释用于记录脚本说明,不影响执行。

格式

[Comment text]

示例

[这是一个测试脚本]
Now: {
    Move(up, 1)  [向上移动]
}

9. 综合示例

以下是一个完整的示例脚本,展示多种功能:

[这是一个控制方块的脚本]
Import: {
    UnityEngine
    System.Collections
}
Value: {
    float speed = 2
    int jumpCount = 0
}
Now: {
    MoveTo((0, 1, 0))  // 移动到初始位置
    AddCollider("box")  // 添加盒状碰撞体
    AddRigidbody(1)  // 添加刚体
    print("方块初始化完成", "green")
}
Once: {
    Rotate((0, 45, 0))  // 旋转 45 度
    CameraFollow(this, (0, 3, -5))  // 相机跟随
    OnCollision(this, "Enemy", "Delete")  // 碰撞 Enemy 时销毁
    OnKeyPress(this, "Space", "Jump")  // 按空格键跳跃
}
Loop: {
    Move(north, 0.05 * speed)  // 持续向前移动
    if (?Meet(north, 5, , "Wall")) {
        Rotate((0, 180, 0))  // 遇到墙壁转向
    }
}
Method: {
    public void Jump() {
        if (jumpCount < 3) {
            ApplyImpulse((0, 200, 0))  // 向上冲量
            jumpCount += 1
            print("跳跃次数: " + jumpCount, "yellow")
        }
    }
}

解释

  • 初始化:方块移动到 (0,1,0),添加碰撞体和刚体,打印绿色消息。
  • 一次性设置:旋转 45 度,相机跟随,注册碰撞和按键事件。
  • 持续运行:每帧向前移动,检测前方墙壁并转向。
  • 自定义方法Jump 方法限制跳跃次数,施加冲量并打印。

10. 编写脚本的步骤

  1. 选择对象

    • 在游戏中按 C 键进入选择模式,点击对象高亮显示。
    • 按左键显示脚本编辑界面。
  2. 编写脚本

    • 在输入框中编写脚本,使用上述语法。
    • 确保周期块用 :{} 包裹,语句逐行编写。
  3. 保存和运行

    • 编辑完成后点击开始编译,脚本自动保存并编译,结果在下方控制台输出。
    • 编译成功后,脚本会附加到对象并执行。
  4. 查看输出

    • 使用 print 命令查看运行结果,输出面板显示彩色消息。

11. 常见问题与提示

  • 脚本不生效?

    • 检查语法是否正确(如括号匹配、参数数量)。
    • 确保对象有必要的组件(如刚体需要 Rigidbody)。
    • 查看 Unity 控制台的错误日志。
  • 如何调试?

    • 使用 print 命令输出变量或状态。
    • 添加注释 [调试信息] 记录逻辑。
  • 中文还是英文?

    • 中文关键字更直观,适合初学者(如 移动打印)。
    • 英文关键字更接近 C#,适合进阶学习。
  • 参数忘了怎么办?

    • 很多参数有默认值(如 MovemoveType 默认 "Smooth")。
    • 空参数用逗号占位,如 Move(up,,Instant)

中文版示例:

[这是一个自定义脚本语法教程,帮助你快速学会控制 Unity 游戏对象]

[周期类型]
立即执行: {
    移动(上, 1)  [立即向上移动 1 单位]
    打印("游戏开始!", 红)  [打印红色消息]
}
初始执行: {
    旋转((0, 90, 0))  [初始化时旋转 90 度]
    添加碰撞体("盒状")  [添加盒状碰撞体]
}
始终执行: {
    移动(北, 0.1)  [每帧向前移动 0.1 单位]
}
引入: {
    UnityEngine
    System.Collections
}
变量: {
    浮点 speed = 2.5
    整数 count = 0
}
方法: {
    公共 函数 跳跃() {
        移动(上, 3, "瞬时")
        打印("跳了!", 黄)
    }
}

[常用命令]
移动(方向, 距离, 移动类型, 持续时间)
    示例: 移动(上, 1) 或 移动(北 2, "瞬时")
旋转(旋转角度, 旋转类型, 持续时间)
    示例: 旋转((0, 90, 0))
缩放(缩放比例, 缩放类型, 持续时间)
    示例: 缩放((2, 2, 2))
打印(消息, 颜色)
    示例: 打印("你好", 蓝) 或 打印("错误", "(1,0,0)")
等待(时间, 条件)
    示例: 等待(2) 或 等待(, "敌人")
添加碰撞体(类型, 尺寸, 半径, 是否触发器)
    示例: 添加碰撞体("球形", , 1)
当碰撞(目标, 其他对象, 动作, 动作参数)
    示例: 当碰撞(自身, "敌人", "销毁")
当按键(目标, 按键名, 动作, 动作参数)
    示例: 当按键(自身, "空格", "跳跃")

[方向]
上: (0, 1, 0)
下: (0, -1, 0)
北: (0, 0, 1)
南: (0, 0, -1)
东: (1, 0, 0)
西: (-1, 0, 0)
向量: (x, y, z) 如 (1, 2, 3)
方向+距离: 如 上 1

[综合示例]
引入: {
    UnityEngine
}
变量: {
    浮点 speed = 2
}
立即执行: {
    移动到((0, 1, 0))
    打印("方块就位", 绿)
}
初始执行: {
    旋转((0, 45, 0))
    当按键(自身, "空格", "移动", "上 1")
}
始终执行: {
    移动(北, 0.05 * speed)
}

[提示]
- 用 [] 写注释
- 参数可选,用逗号占位(如 移动(上,,瞬时))
- 中文和英文关键字都可以用
- 多用 打印 调试

此方悬停
相册 小说 Ai