尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Unity基础:C#脚本的创建与挂载——让你的游戏物体活起来

Unity基础:C#脚本的创建与挂载——让你的游戏物体活起来 Unity基础C#脚本的创建与挂载——让你的游戏物体活起来大家好欢迎回到Unity教程系列。前面十五篇文章中我们一直在学习场景搭建、组件操作、编辑器使用——这些都是静态的内容。从今天开始我们要让游戏真正动起来了。而让游戏动起来的关键就是编写C#脚本。脚本是游戏逻辑的载体。角色的移动、敌人的AI、UI的交互、音效的播放——游戏中的一切动态行为都来源于脚本。对于很多新手来说第一次写脚本可能会感到紧张——别担心这篇文章我会从最基础的操作开始手把手带你进入Unity脚本编程的世界。一、脚本在Unity中的角色1.1 脚本是什么 在Unity中脚本Script是一种特殊的Component。当你创建一个C#脚本并将其挂载到GameObject上时这个脚本就成为该GameObject的一个组件拥有该组件的所有特性——可以在Inspector中查看、可以启用/禁用、可以通过GetComponent获取。理解脚本就是组件这个观念非常重要。它意味着脚本继承了MonoBehaviour而MonoBehaviour继承了Component脚本像其他组件一样有生命周期创建、启用、更新、禁用、销毁脚本可以通过GetComponent被其他组件访问1.2 脚本与GameObject的关系每个挂载了脚本的GameObject都是该脚本的一个实例。如果你将同一个脚本挂载到10个不同的GameObject上运行时会创建10个脚本实例每个实例有自己独立的变量值。Player对象 ──── PlayerController脚本实例moveSpeed5 Enemy_A对象 ── EnemyController脚本实例moveSpeed3 Enemy_B对象 ── EnemyController脚本实例moveSpeed4二、创建脚本2.1 在Unity中创建C#脚本创建脚本有多种方式方式一Project窗口右键① 在Project窗口中进入Scripts文件夹② 右键 → Create → C# Script③ 新脚本以蓝色图标出现名称处于可编辑状态④ 输入脚本名称如MyFirstScript按回车确认方式二Assets菜单Assets → Create → C# Script方式三GameObject的Add Component菜单① 选中GameObject② Inspector底部 → Add Component③ 输入New Script④ 点击New Script输入脚本名称 第三种方式会同时在Project窗口的Assets根目录创建脚本并自动将其挂载到选中的GameObject上。2.2 脚本命名规范⚠️ C#脚本的命名有几个重要规则文件名与类名必须一致创建的脚本文件名为MyFirstScript.cs那么内部的类名也必须是MyFirstScript。如果你手动修改了文件名必须同时修改类名否则Unity会报编译错误。使用PascalCase命名法每个单词首字母大写如PlayerController、EnemyAI、WeaponManager。不使用中文和特殊字符脚本名只能使用英文、数字和下划线且不能以数字开头。名称要有意义避免Script1、Test2这样的无意义命名。好的命名能让人一眼看出脚本的用途。2.3 打开和编辑脚本双击脚本文件在Project窗口中双击C#脚本文件Unity会在你配置的代码编辑器中打开它。默认是Visual Studio你也可以在Edit Preferences External Tools中更换为Rider或VS Code。在Inspector中打开如果脚本已经挂载到GameObject上选中该物体在Inspector中点击脚本组件名称右侧的齿轮图标或直接点击脚本名称行都可以跳转到脚本文件。三、脚本的基本结构3.1 默认生成的代码模板创建新脚本后Unity会自动生成以下模板代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassMyFirstScript:MonoBehaviour{// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){}}让我们逐段理解这个模板3.2 using语句usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;using语句相当于导入命名空间让你可以使用其他代码库中的类UnityEngineUnity引擎的核心命名空间包含MonoBehaviour、GameObject、Transform、Debug等所有Unity基础类。几乎每个脚本都需要它。System.Collections和System.Collections.GenericC#标准库的集合类型命名空间提供List、Dictionary、Queue等数据结构。3.3 类定义publicclassMyFirstScript:MonoBehaviour这行代码定义了一个名为MyFirstScript的类它继承自MonoBehaviour。public访问修饰符表示这个类可以被其他代码访问。class MyFirstScript定义类名。: MonoBehaviour继承关系。MonoBehaviour是Unity中所有脚本组件的基类。继承MonoBehaviour后你的类才能被挂载到GameObject上才能使用Start、Update等生命周期方法。3.4 Start方法voidStart(){// 初始化代码}Start是Unity生命周期中的一个方法在脚本实例被启用后、第一次Update之前调用。它只被调用一次适合用于初始化——获取组件引用、设置初始变量值、建立初始状态等。3.5 Update方法voidUpdate(){// 每帧执行的代码}Update在游戏的每一帧都会被调用。它是游戏逻辑的核心方法——输入检测、移动更新、状态检查等需要持续执行的逻辑都放在Update中。四、将脚本挂载到GameObject4.1 挂载的方式方式一拖拽最常用将脚本从Project窗口拖到Hierarchy中的GameObject上或拖到Scene视图中的物体上。方式二拖到Inspector选中GameObject将脚本从Project窗口拖到Inspector的空白区域组件列表下方。方式三Add Component按钮① 选中GameObject② Inspector底部 → Add Component③ 搜索脚本名称④ 点击添加方式四代码中动态添加gameObject.AddComponentMyFirstScript();4.2 验证脚本挂载成功脚本成功挂载到GameObject后在Inspector中可以看到脚本作为一个组件出现组件名称显示为脚本的类名脚本名称左侧有启用/禁用复选框public变量显示在Inspector中可直接编辑如果有[SerializeField]标记的private变量也会显示4.3 一个物体可以有多个脚本同一个GameObject上可以挂载任意数量的脚本组件每个脚本独立运作Player ├── Transform ├── MeshRenderer ├── Rigidbody ├── PlayerController处理输入和移动 ├── HealthComponent管理生命值 ├── WeaponComponent管理武器 └── AnimationController管理动画五、编写第一个脚本——让物体旋转5.1 创建Rotator脚本让我们写一个最简单的脚本让物体不停地旋转。usingUnityEngine;publicclassRotator:MonoBehaviour{// 旋转速度可在Inspector中调整publicfloatrotationSpeed30f;voidUpdate(){// 每帧绕Y轴旋转// Time.deltaTime使旋转速度与帧率无关transform.Rotate(Vector3.up*rotationSpeed*Time.deltaTime);}}5.2 代码解析public float rotationSpeed 30fpublic关键字让这个变量在Inspector中可见可编辑float是浮点数类型rotationSpeed是变量名 30f设置默认值transform.Rotate(…)transform是当前脚本所在GameObject的Transform组件引用Rotate是Transform的一个方法让物体旋转Vector3.up是Y轴正方向的简写即(0,1,0)* rotationSpeed乘以旋转速度* Time.deltaTime乘以帧间隔时间使旋转速度与帧率无关5.3 测试脚本① 创建一个Cube② 将Rotator脚本拖拽到Cube上③ 点击Play按钮④ 观察Cube在Scene视图和Game视图中旋转⑤ 在Inspector中修改rotationSpeed的值如改为100观察旋转速度变化⑥ 把Vector3.up改为new Vector3(1,1,0)观察旋转方向的变化✅ 恭喜你刚刚完成了第一个Unity脚本让一个物体在你的代码控制下动了起来六、让物体动起来——移动脚本6.1 键盘控制移动usingUnityEngine;publicclassSimpleMover:MonoBehaviour{publicfloatmoveSpeed5f;voidUpdate(){// 获取水平输入A/D键或左右方向键floathorizontalInput.GetAxis(Horizontal);// 获取垂直输入W/S键或上下方向键floatverticalInput.GetAxis(Vertical);// 构建移动方向向量Vector3movementnewVector3(horizontal,0,vertical);// 移动物体transform.Translate(movement*moveSpeed*Time.deltaTime);}}6.2 Input.GetAxis解析Input.GetAxis(Horizontal)从Unity的输入管理器获取Horizontal轴的值。这个值在-1到1之间平滑过渡按A键或左方向键值逐渐变化到-1按D键或右方向键值逐渐变化到1不按键值逐渐回到0Vertical轴对应W/S或上下方向键。平滑过渡意味着物体不会突然启动突然停止而是有一个自然的加速和减速过程——这就是你在游戏中感受到的手感。6.3 跳跃功能usingUnityEngine;publicclassPlayerMover:MonoBehaviour{publicfloatmoveSpeed5f;publicfloatjumpForce10f;privateRigidbodyrb;voidStart(){// 获取Rigidbody组件引用rbGetComponentRigidbody();}voidUpdate(){// 水平移动floathorizontalInput.GetAxis(Horizontal);floatverticalInput.GetAxis(Vertical);Vector3movementnewVector3(horizontal,0,vertical);transform.Translate(movement*moveSpeed*Time.deltaTime);// 跳跃if(Input.GetKeyDown(KeyCode.Space)){rb.AddForce(Vector3.up*jumpForce,ForceMode.Impulse);}}}⚠️ 使用Rigidbody实现跳跃需要在GameObject上添加Rigidbody组件。另外上述代码没有做在地面上才能跳的判断——玩家可以无限在空中跳。后续章节会添加地面检测来完善。七、脚本的调试7.1 使用Debug.Log输出信息当你的脚本行为不符合预期时第一件事就是在关键位置添加Debug.Log输出voidStart(){Debug.Log(脚本已启动);Debug.Log($物体的初始位置是{transform.position});}voidUpdate(){if(Input.GetKeyDown(KeyCode.Space)){Debug.Log(玩家按下了空格键);}}输出的信息会显示在Console窗口中。不同级别的日志Debug.Log(信息)普通白色消息Debug.LogWarning(警告)黄色警告消息Debug.LogError(错误)红色错误消息7.2 常见编译错误“; expected”某行代码末尾缺少分号。“does not contain a definition”调用了不存在的方法或访问了不存在的属性。可能是拼写错误或缺少using。“cannot convert”类型不匹配。例如把string赋值给int。“The name ‘xxx’ does not exist”使用了未定义的变量。遇到错误时双击Console窗口中的错误消息Unity会直接打开对应的脚本并跳转到出错行号。八、脚本文件管理8.1 推荐的文件组织Assets\Scripts\ ├── Player\ │ ├── PlayerController.cs │ ├── PlayerHealth.cs │ └── PlayerInput.cs ├── Enemies\ │ ├── EnemyAI.cs │ └── EnemyPatrol.cs ├── Managers\ │ ├── GameManager.cs │ └── AudioManager.cs ├── UI\ │ ├── MainMenu.cs │ └── HealthBar.cs └── Utils\ ├── ObjectPool.cs └── Singleton.cs8.2 脚本重命名⚠️ 重命名脚本要小心在Project窗口中重命名脚本文件后必须打开脚本文件同步修改类名。文件名和类名必须一致。如果只修改了文件名而没改类名Unity会显示错误“Script class does not match file name”。九、本篇总结✅ 本文核心知识点回顾C#脚本在Unity中是一种特殊的Component继承自MonoBehaviour脚本文件名必须与内部的类名一致Start()在脚本启用后调用一次初始化Update()每帧调用持续逻辑public变量自动显示在Inspector中可实时编辑transform是脚本所在GameObject的Transform组件的快捷引用Input.GetAxis()获取平滑的输入值Input.GetKeyDown()检测单次按键Time.deltaTime让移动速度与帧率无关Debug.Log()在Console窗口输出调试信息 下一篇文章将深入讲解Start与Update方法——Unity脚本生命周期的初步探索。动手任务① 创建一个Rotator脚本让物体自转② 创建一个Mover脚本用键盘控制物体移动③ 修改rotationSpeed和moveSpeed观察Inspector变量控制的效果④ 使用Debug.Log输出物体的实时位置关于作者拥有多年Unity开发经验的游戏开发者专注Unity系统化教学与最佳实践分享。
返回列表