Android游戏开发从零基础到上架应用商店完整教程Unity引擎实战项目详解
别慌,这其实没那么难
我猜你现在正盯着电脑屏幕,心里嘀咕着”游戏开发会不会太复杂了?”说实话,我第一次接触Unity的时候,看着那些密密麻麻的窗口和听不懂的术语,也有点发懵。但相信我,只要一步一步来,你完全可以做出自己的第一款游戏。
今天我要带你走的这条路,是从零开始,一直到把你的游戏发布到Google Play商店。我们会用Unity引擎,因为它是目前最适合新手的跨平台游戏开发工具。你不需要成为编程大师,也不需要画画高手——只要愿意动手,就能做出好玩的东西。
先搞定工具,别急着写代码
Unity Hub和Unity的安装,这一步很重要
很多新手在这个环节就放弃了,因为安装过程出了点小问题。我帮你把坑都踩了一遍,你直接走平坦大道。
首先,去Unity官网下载Unity Hub。这是一个管理工具,让你能同时安装多个Unity版本,还能管理你的项目。安装时选”Standard Assets”和”Android Build Support”,这样就不用后面再折腾了。
安装完Unity Hub后,点”Install Editor”,选一个稳定版本(我推荐2022.3 LTS,Long Term Support版本最稳定)。安装时记得勾选:
- Module: Android Build Support
- Module: OpenJDK(Java开发工具包)
- Module: Android SDK & NDK Tools
这三样是开发Android游戏的基础。如果你的电脑内存够大(16GB以上),建议装最新稳定版;如果内存有限,2021.3 LTS更轻量。
Android Studio,你可能不需要装
这是个常见误区。其实你只需要Unity里自带的Android SDK和NDK就能开发Android游戏了。Android Studio主要是用来:
- 管理模拟器
- 调试Android应用
- 打包APK文件(虽然Unity也能打包)
建议你装一个轻量版的Android Studio,用来跑模拟器调试。下载地址是developer.android.com/studio,选”Download Android Studio”,安装时把”Android Virtual Device”勾上就行。
硬件要求,别被忽悠了
说实话,游戏开发对电脑有一定要求,但也不是非要顶配:
- CPU:至少4核,建议6核以上(AMD Ryzen 5或Intel i5起步)
- 内存:16GB是底线,32GB更舒服(Unity吃内存很厉害)
- 显卡:集成显卡也能跑,但建议有独立显卡(NVIDIA GTX 1060以上)
- 硬盘:至少100GB可用空间,最好用SSD(加载速度快很多)
- 系统:Windows 10⁄11 64位,或macOS 10.15以上
如果你用的是mac,好消息是Unity对Mac的优化不错,而且上架App Store会比Android容易一些。但今天我们先专注Android,因为门槛更低。
Unity界面初体验,别被吓到
第一次打开Unity,你会看到几个主要窗口:
Scene视图:这是你编辑游戏的舞台。你看不到游戏实际运行时的样子,这里只是让你摆放物体、设置位置。
Game视图:这才是你玩游戏时看到的画面。你可以调整分辨率,比如手机常用的1080x1920。
Hierarchy面板:这里列出你场景里所有的物体。每个游戏物体都叫GameObject,比如主角、敌人、UI按钮。
Inspector面板:选中某个物体后,这里显示它的所有属性。比如一个球体,你会看到它的材质、碰撞体、脚本组件等。
Project面板:这是你的素材库。所有图片、音频、3D模型、脚本都放在这里。
别急着记住每个窗口的名字,先动手玩一玩。新建一个3D项目,选”3D Core”模板,然后试着移动场景里的相机和灯光。你会发现,游戏开发其实更像搭积木,而不是写代码。
第一个项目:一个简单的跑酷游戏
让我带你做一个真正的小游戏。我们不做大作,先做一个竖版跑酷游戏——角色自动向前跑,玩家点击屏幕跳跃,躲避障碍物。这个游戏虽小,但能学到核心概念。
创建项目
打开Unity Hub,点”New”,选”3D Core”模板,项目名称叫”RunningGame”,位置选一个你记得住的文件夹。点”Create”,等待项目加载。
加载完成后,你会看到默认的3D场景,有一盏灯、一个相机、一个地面。删掉这个地面(右键点Hierarchy里的”Ground”,选Delete),我们从头开始。
创建玩家角色
玩家不需要复杂的3D模型,用个简单的方块就行。在Hierarchy里右键,选3D Object > Cube。把它重命名为”Player”,在Inspector里把Scale改成(1,1,1),Position改成(0,0,0)。
现在给这个方块加上碰撞体和刚体。点”Add Component”,搜”Box Collider”和”Rigidbody”。Rigidbody是让物体受重力影响的关键,没有它,角色会飘在空中。
接下来,我们写第一个脚本。在Project面板右键,选Create > C# Script,命名为”PlayerController”。双击打开,你会看到Visual Studio(或你选择的代码编辑器)弹出来。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float jumpForce = 8f;
public float speed = 5f;
private Rigidbody rb;
private bool isGrounded;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
// 自动向前移动
transform.Translate(Vector3.forward * speed * Time.deltaTime);
// 检测是否在地面
isGrounded = Physics.Raycast(transform.position, Vector3.down, 1.1f);
// 点击屏幕跳跃
if (Input.GetMouseButtonDown(0) && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
void OnCollisionEnter(Collision collision)
{
// 碰到障碍物,游戏结束
if (collision.gameObject.CompareTag("Obstacle"))
{
Debug.Log("游戏结束!");
// 这里可以触发场景切换或UI提示
}
}
}
把这个脚本拖到Player物体上。你会看到Inspector里出现jumpForce和speed两个参数,你可以直接在这里调整数值,不用改代码。
创建地面和障碍物
地面是个长条平面。右键Hierarchy,选3D Object > Plane,命名为”Ground”,Scale改成(10,1,10),Position的Y值调到-0.5(让地面在玩家脚下)。
障碍物我们用多个方块。创建一个”Obstacle” prefab(预制体),这样我们可以批量生成。先建一个Cube,命名”Obstacle”,加上Tag(在Inspector顶部有个Tag下拉框,选”Add Tag…“,新建一个叫”Obstacle”的Tag,然后回到Obstacle物体上,把Tag设为Obstacle)。
现在写个障碍物生成脚本。右键Project,新建C# Script,命名为”ObstacleSpawner”。
using UnityEngine;
public class ObstacleSpawner : MonoBehaviour
{
public GameObject obstaclePrefab;
public float spawnInterval = 2f;
public float spawnDistance = 20f;
private float timer;
void Update()
{
timer += Time.deltaTime;
if (timer >= spawnInterval)
{
SpawnObstacle();
timer = 0;
}
}
void SpawnObstacle()
{
// 在玩家前方随机位置生成障碍物
float randomX = Random.Range(-2f, 2f);
Vector3 spawnPos = new Vector3(randomX, 0.5f, transform.position.z + spawnDistance);
Instantiate(obstaclePrefab, spawnPos, Quaternion.identity);
}
}
把这段代码拖到一个空物体上,把obstaclePrefab拖进Inspector。然后把这个空物体放在玩家前方20个单位处。
添加地面检测
玩家要能判断自己是否在地面,才能跳跃。我们在玩家脚下加个 invisible的检测点。在Player物体下新建一个空物体,命名为”GroundCheck”,Position设为(0,-0.6,0)。然后在PlayerController里已经有了Raycast检测,不需要额外代码。
相机跟随
相机要跟着玩家走。创建一个空物体,命名为”MainCamera”,把默认的Main Camera拖进去当子物体。然后写个跟随脚本”CameraFollow”:
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform player;
public Vector3 offset = new Vector3(0, 3, -5);
void LateUpdate()
{
// 相机跟随玩家,保持相对位置
transform.position = player.position + offset;
}
}
把这个脚本拖到MainCamera物体上,把Player物体拖到Inspector的player字段里。
运行测试
现在按Unity上方的播放按钮(▶),看看游戏是否能运行。玩家会一直向前跑,点击鼠标(或触屏)可以跳跃,障碍物会不断生成。如果发现问题,别急着改代码,先看Console里的错误信息。
音效和UI,让游戏更有感觉
添加背景音乐和跳跃音效
音效能让游戏生动很多。找个免费音效网站,比如freesound.org,下载一个跳跃音效(.wav或.mp3格式)和一段背景音乐。
把音效文件拖进Project面板的Assets文件夹。然后创建两个空物体:”AudioManager”和”BGM”。在BGM上加点AudioSource组件,把背景音乐拖进去,勾选”Loop”(循环播放)。
在AudioManager上写脚本控制音效:
using UnityEngine;
public class AudioManager : MonoBehaviour
{
public static AudioManager instance;
public AudioSource bgmSource;
public AudioSource sfxSource;
void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
public void PlayJumpSound()
{
sfxSource.PlayOneShot(jumpSound);
}
}
然后在PlayerController的跳跃逻辑里调用它:
if (Input.GetMouseButtonDown(0) && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
AudioManager.instance.PlayJumpSound();
}
计分系统
玩家每躲过一个障碍物,应该加分。我们在场景里加个空物体”GameManager”,写个脚本管理分数:
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public int score = 0;
public Text scoreText;
void Awake()
{
instance = this;
}
public void AddScore()
{
score++;
if (scoreText != null)
scoreText.text = "Score: " + score;
}
public void GameOver()
{
// 暂停游戏逻辑
Time.timeScale = 0f;
// 显示结束UI
}
}
在Obstacle里加个检测:当玩家碰到障碍物时,通知GameManager游戏结束。在Obstacle物体上加个脚本:
using UnityEngine;
public class ObstacleManager : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
GameManager.instance.GameOver();
}
}
}
注意这里用OnTriggerEnter而不是OnCollisionEnter,因为我们希望障碍物是触发器(Trigger),不是实体碰撞。所以在Inspector里把Obstacle的Box Collider勾选”Is Trigger”。
UI设计
Unity有内置的UI系统。在Hierarchy右键,选UI > Canvas。Canvas会自动创建EventSystem(处理点击事件)和几个默认UI物体。
在Canvas下创建Text物体显示分数。选Canvas,在Inspector里把Render Mode改成”Screen Space - Camera”,然后把Main Camera拖到Render Camera字段。这样UI会永远显示在屏幕最前面。
创建”ScoreText”,在Text组件里编辑默认文字。然后关联GameManager脚本里的scoreText字段。
再创建一个”GameOverPanel”,默认隐藏。在游戏结束时显示它,上面放个”Restart”按钮。按钮点击事件在Button组件的On Click()里添加方法。
打包成APK,准备上架
Build Settings设置
点File > Build Settings,选Android平台,点Switch Platform。等进度条走完,Unity会下载必要的工具。
点Player Settings,设置App的详细信息:
- Company Name:你的公司或名字
- Package Name:唯一标识符,格式像com.yourname.gamename(用点号分隔)
- Version:1.0
- Minimum API Level:选Android 5.0(API 21)以上,兼容大部分设备
- Target API Level:选最新的
- Optimization:勾选”Strip Engine Code”(减小包体积)
图标方面,需要准备不同尺寸的图片:
- mdpi: 48x48
- hdpi: 72x72
- xhdpi: 96x96
- xxhdpi: 128x128
- xxxhdpi: 192x192
可以在画世界或Photoshop里做,也可以用在线工具生成所有尺寸。
导出APK
点Build > Build And Run。第一次打包会弹出”Export Project”选项,选”External”(导出Android Studio项目)或”Internal”(直接打包APK)。建议选Internal,Unity会自动打包。
打包完成后,去你的项目文件夹找APK文件。把APK传到手机安装测试,确保没有崩溃。
用Google Play Console上架
上架前,你需要:
- 注册Google Play开发者账号,费用25美元(一次性)
- 准备应用截图(至少2张手机截图,建议16:9和9:16都准备)
- 写应用描述,突出游戏特色
- 准备隐私政策URL(可以用Google的免费模板生成)
登录play.google.com/console,点”Create App”,上传APK,填写信息,提交审核。审核一般1-3天,通过后就能在商店里搜到你的游戏了。
性能优化,让游戏跑得流畅
降低多边形数量
3D模型越复杂,手机越卡。新手喜欢用高模,这是大忌。如果要用3D模型,尽量:
- 用低多边形风格(像Monument Valley那种)
- 压缩贴图分辨率(1024x1024足够)
- 合并网格(Mesh Filter里有个”Merge”选项)
对象池,别频繁创建销毁
前面我们的障碍物生成用的是Instantiate和Destroy,这在频繁生成时会产生垃圾回收(GC)卡顿。用对象池技术:
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
public static ObjectPool instance;
public GameObject prefab;
public int poolSize = 10;
private Queue<GameObject> pool;
void Awake()
{
instance = this;
pool = new Queue<GameObject>();
for (int i = 0; i < poolSize; i++)
{
GameObject obj = Instantiate(prefab);
obj.SetActive(false);
pool.Enqueue(obj);
}
}
public GameObject GetObject()
{
if (pool.Count > 0)
{
GameObject obj = pool.Dequeue();
obj.SetActive(true);
return obj;
}
return null;
}
public void ReturnObject(GameObject obj)
{
obj.SetActive(false);
pool.Enqueue(obj);
}
}
修改ObstacleSpawner,用对象池获取障碍物:
void SpawnObstacle()
{
float randomX = Random.Range(-2f, 2f);
Vector3 spawnPos = new Vector3(randomX, 0.5f, transform.position.z + spawnDistance);
GameObject obstacle = ObjectPool.instance.GetObject();
if (obstacle != null)
{
obstacle.transform.position = spawnPos;
}
}
当障碍物超出屏幕后,调用ReturnObject放回池子。
减少Draw Call
Unity的渲染引擎每帧要绘制很多次,叫Draw Call。Draw Call太多会卡顿。优化方法:
- 合并静态物体(Static Batching)
- 使用纹理图集(Texture Atlas),把多个小图拼成一张大图
- 关闭不需要的阴影
在Unity里,选中静态物体(比如地面、背景),勾选Inspector里的”Static”,Unity会自动合并。
用Frame Debugger分析性能
Unity有个内置工具叫Frame Debugger,可以显示每帧渲染了多少次。点Window > Analysis > Frame Debugger,按Play,你会看到每帧的详细渲染过程。如果发现Draw Call超过100,就要优化了。
常见问题和解决方案
打包失败,提示”Java SDK not found”
这是因为Unity没找到JDK。去Oracle官网下载Java SE Development Kit 11,安装后在Unity的Edit > Preferences > External Tools里,把JDK路径指向安装目录。
游戏在手机上闪退
常见原因:
- 内存不足:检查Unity的Memory Profiler(Window > Analysis > Memory Profiler),看是否有内存泄漏
- 贴图太大:把贴图压缩格式改成ASTC或ETC2(适合Android)
- 代码错误:在Android上调试,用Logcat看日志(在Android Studio的Logcat窗口)
触屏点击不灵敏
Unity的Input.GetMouseButtonDown在手机上也能用,但如果你用的是新版的Input System,要注意配置。建议先用旧版Input系统,稳定后再换。
模拟器运行正常,真机卡顿
模拟器用的是电脑GPU,真机是手机GPU,性能差距很大。优化建议:
- 降低分辨率(Target Resolution设低一点)
- 关闭后处理效果(Bloom、Motion Blur等)
- 减少同时存在的物体数量
进阶:加入更多游戏机制
添加道具系统
比如收集金币、吃到加速道具。创建”Coin”物体,写上Collectible脚本:
using UnityEngine;
public class Collectible : MonoBehaviour
{
public int coinValue = 10;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
GameManager.instance.AddScore(coinValue);
Destroy(gameObject);
}
}
}
添加多关卡
用Unity的Scene管理,创建多个场景(比如Scene1、Scene2),在每个场景里设置不同的障碍物配置。在GameManager里记录当前场景,游戏结束后加载下一个场景:
using UnityEngine.SceneManagement;
public void NextLevel()
{
int nextScene = SceneManager.GetActiveScene().buildIndex + 1;
if (nextScene < SceneManager.sceneCountInBuildSettings)
{
SceneManager.LoadScene(nextScene);
}
else
{
// 通关,显示胜利界面
}
}
别忘了在File > Build Settings里把所有场景都加进去。
添加成就和排行榜
可以用Unity的Leaderboards插件,或者接入Google Play Games Services。这需要在Google Play Console里先配置游戏服务,然后在Unity里安装Google Play Games插件。
最后的建议:别追求完美,先完成再完美
我第一次做游戏的时候,总想加各种炫酷功能,结果做了半年,一个能玩的都没有。后来我学会了:先做出最小可玩版本(MVP),上架,收集反馈,再迭代更新。
你的第一款游戏可能很简单,可能只有跳跃和躲避,这完全没问题。任天堂的《超级马里奥》最初也只是简单的跳跃游戏。重要的是你完成了从0到1的过程。
现在,打开Unity,新建项目,跟着我上面的步骤走。遇到问题别慌,Google搜索错误信息,或者在Unity论坛提问。开发者的社区很友好,大家都是从新手过来的。
祝你做出好玩的游戏!