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(自定义方法)
- 用途:定义可重复调用的方法,封装复杂逻辑。
- 特点:支持
void
或IEnumerator
返回类型,可包含命令或原生 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
:是否为触发器(true
或false
,可选,默认false
)。- 示例:
AddCollider("sphere", , 1) // 添加半径为 1 的球形碰撞体 AddCollider("box", (2,2,2), , true) // 添加触发器盒状碰撞体
AddRigidbody(mass, drag, isKinematic)
添加刚体。mass
:质量(默认 1)。drag
:阻力(默认 0)。isKinematic
:是否为运动学刚体(true
或false
,默认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 轴(true
或false
)。- 示例:
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. 编写脚本的步骤
选择对象:
- 在游戏中按
C
键进入选择模式,点击对象高亮显示。 - 按左键显示脚本编辑界面。
- 在游戏中按
编写脚本:
- 在输入框中编写脚本,使用上述语法。
- 确保周期块用
:
和{}
包裹,语句逐行编写。
保存和运行:
- 编辑完成后点击开始编译,脚本自动保存并编译,结果在下方控制台输出。
- 编译成功后,脚本会附加到对象并执行。
查看输出:
- 使用
print
命令查看运行结果,输出面板显示彩色消息。
- 使用
11. 常见问题与提示
脚本不生效?
- 检查语法是否正确(如括号匹配、参数数量)。
- 确保对象有必要的组件(如刚体需要
Rigidbody
)。 - 查看 Unity 控制台的错误日志。
如何调试?
- 使用
print
命令输出变量或状态。 - 添加注释
[调试信息]
记录逻辑。
- 使用
中文还是英文?
- 中文关键字更直观,适合初学者(如
移动
、打印
)。 - 英文关键字更接近 C#,适合进阶学习。
- 中文关键字更直观,适合初学者(如
参数忘了怎么办?
- 很多参数有默认值(如
Move
的moveType
默认"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)
}
[提示]
- 用 [] 写注释
- 参数可选,用逗号占位(如 移动(上,,瞬时))
- 中文和英文关键字都可以用
- 多用 打印 调试
此方悬停