1. 环境准备与项目创建第一次打开Unity时可能会被复杂的界面吓到但别担心我们只需要关注几个核心区域。安装Unity Hub后建议选择2021 LTS版本长期支持版更稳定记得勾选Windows/Mac Build Support模块。创建项目时选择3D模板命名为RollABall我习惯把项目路径设为桌面方便查找。这里有个新手容易踩的坑Unity默认使用米作为物理单位所以后续设计场景时要注意比例。比如我们的小球半径设为0.5米那么平台尺寸最好在10米左右比较合理。创建完项目后先保存场景CtrlS我通常会在Assets下建立Scenes、Scripts、Materials三个文件夹保持整洁。2. 搭建基础场景2.1 创建地面与围墙在Hierarchy面板右键选择3D Object Plane作为地面在Inspector面板将Scale调整为(5,1,5)。按住CtrlD快速复制出四个Plane旋转90度后竖立起来作为围墙组成一个方形竞技场。这时候如果直接运行你会发现小球会穿墙而过——这是因为我们还没添加碰撞体。选中所有围墙对象在Inspector点击Add Component搜索并添加Box Collider。有个实用技巧按住Shift键可以同时选中多个物体批量添加组件。测试时如果发现小球卡在墙角可以适当调整Collider的Center和Size参数。2.2 设置玩家小球创建Sphere对象并重命名为Player将其Y轴位置设为1.5米让小球悬空。添加Rigidbody组件时要注意两个关键参数Mass质量保持默认1即可Drag空气阻力设为0.1防止小球滑动过长距离为了让小球更醒目我们新建材质球在Assets文件夹右键选择Create Material命名为PlayerMat。将Albedo颜色改为亮红色Metallic值调到0.8增加金属质感最后拖拽材质到小球上。3. 编写移动控制脚本3.1 基础移动逻辑在Scripts文件夹新建C#脚本PlayerController用VS Code打开后会看到默认的Start和Update方法。这里有个重要知识点物理运动必须放在FixedUpdate里而非Update因为物理引擎有独立的计算帧率。public class PlayerController : MonoBehaviour { public float moveSpeed 10f; private Rigidbody rb; void Start() { rb GetComponentRigidbody(); } void FixedUpdate() { float moveHorizontal Input.GetAxis(Horizontal); float moveVertical Input.GetAxis(Vertical); Vector3 movement new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * moveSpeed); } }3.2 优化控制体验测试时你可能会发现小球容易滚出平台我们可以通过三种方式改进限制最大速度在FixedUpdate末尾添加if(rb.velocity.magnitude 5f) { rb.velocity rb.velocity.normalized * 5f; }增加旋转反馈在移动代码后添加transform.Rotate(new Vector3(moveVertical, 0, -moveHorizontal) * 100f * Time.deltaTime);启用刹车效果在Rigidbody组件勾选Use Gravity并设置Angular Drag为14. 设计可收集物品4.1 创建收集物预制体新建Cube对象并缩放为(0.5,0.5,0.5)添加Box Collider并勾选Is Trigger。创建金色材质球应用后将其拖到Assets文件夹生成Prefab。我习惯在场景中复制出12-15个收集物随机摆放在平台上形成收集路线。4.2 实现碰撞检测新建脚本Collectible并挂载到预制体上void OnTriggerEnter(Collider other) { if(other.gameObject.CompareTag(Player)) { GameManager.instance.AddScore(); Destroy(gameObject); } }记得给Player对象添加Player标签。这里用到了单例模式的管理器我们接下来就创建它。5. 构建游戏管理系统5.1 分数统计与UI显示新建空对象命名为GameManager创建同名脚本public class GameManager : MonoBehaviour { public static GameManager instance; public Text scoreText; private int score; void Awake() { instance this; } public void AddScore() { score; scoreText.text Score: score; } }在Canvas下创建Text组件调整字体大小和位置后将文本对象拖拽到GameManager的scoreText字段。建议使用TextMeshPro组件获得更清晰的文字效果。5.2 胜利条件判断在GameManager中添加胜利检测逻辑public int totalCollectibles 12; public void AddScore() { score; scoreText.text Score: score; if(score totalCollectibles) { scoreText.text - Victory!; } }记得在编辑器中将场景中的收集物总数赋值给totalCollectibles变量。如果想增加重置功能可以添加if(Input.GetKeyDown(KeyCode.R)) { SceneManager.LoadScene(0); }6. 效果优化与发布6.1 添加环境光效在Window Rendering Lighting Settings中启用Baked Global Illumination调整Environment Lighting的Source为Gradient创建Directional Light并设置强度为0.86.2 构建游戏包File Build Settings中添加当前场景选择目标平台。对于Windows平台建议取消勾选Development Build减少体积在Player Settings中设置公司名称和产品名分辨率设为1280x720窗口模式第一次构建可能需要10-20分钟建议连接电源避免中断。构建完成后可以在输出文件夹找到.exe文件直接运行测试。