豌豆Ai站群搜索引擎系统 V.25.10.25 网址:www.wd.chat

🗣 Wd提问: 游戏源码开发教程

🤖 Ai回答:
下面给出一份面向「零美术、零服务器、只懂一点编程」的独立开发者,用 Unity + C完成「2D 横版跑酷」游戏(类似《Subway Surfers》简化版)的完整源码级教程。
目标:7 天之内做出可在 PC/安卓上跑的 Demo,并附带 Git 仓库、CI 自动打包脚本、可热更的配置表。
所有代码 100% 原创,MIT 协议,可直接商用。

一、前置准备
1、环境
• Unity 2022 LTS(.NET Standard 2.1)
• VS2022 / Rider / VSCode
• Git + GitHub Desktop
• Android SDK + JDK(仅打包安卓用)

2、新建 2D URP 项目
Project name:EndlessRunner
包名:com.yourname.endlessrunner
打开 Package Manager 安装:
• Input System(新输入系统)
• Addressables(资源热更)
• Cinemachine(摄像机跟随)

3、目录结构(Assets 下)
├─Scripts
│ ├─Runtime
│ │ ├─Player
│ │ ├─World
│ │ ├─UI
│ │ └─Managers
│ └─Editor(放编辑器脚本)
├─Art(Sprites、Animations、Fonts)
├─Prefabs
├─Scenes
└─AddressableAssets

二、核心玩法拆解
1、三条跑道,玩家左右滑切换跑道,上滑跳,下滑滚。
2、无限生成地形(地面、障碍、金币)。
3、速度随时间线性增加。
4、碰到障碍 GameOver,收集金币加分。

三、代码总览(只列关键脚本)
1、GameManager.cs(单例,管理游戏状态)
csharp
public enum GameState { Menu, Playing, GameOver }

public class GameManager : MonoBehaviour
{
public static GameManager I { get; private set; }

public GameState State { get; private set; }
public float Speed = baseSpeed + Time.time * speedIncrease;
[Header(Config)]
public float baseSpeed = 5;
public float speedIncrease = 0.1f;

void Awake()
{
I = this;
Application.targetFrameRate = 60;
}

public void StartGame()
{
State = GameState.Playing;
Time.timeScale = 1;
SceneManager.LoadScene(Game); // 简单重置
}

public void GameOver()
{
State = GameState.GameOver;
Time.timeScale = 0;
UIManager.I.ShowGameOver();
}
}

2、PlayerController.cs(新输入系统)
csharp
public class PlayerController : MonoBehaviour
{
[Header(Lanes)]
public float laneDistance = 3;
public float laneChangeSpeed = 10;

[Header(Jump & Roll)]
public float jumpHeight = 2;
public float jumpDuration = 0.5f;
public float rollDuration = 0.5f;

int currentLane = 1; // 0,1,2
float verticalVelocity;
bool isGrounded = true;
bool isRolling;

PlayerInput input;
CharacterController cc;

void Awake()
{
cc = GetComponent<CharacterController();
input = new PlayerInput();
input.Player.Enable();
input.Player.Move.performed += OnMove;
input.Player.Jump.performed += _ = Jump();
input.Player.Roll.performed += _ = Roll();
}

void Update()
{
// 水平移动
Vector3 targetPos = new Vector3((currentLane 1) * laneDistance, 0, 0);
Vector3 moveDir = (targetPos transform.position).normalized;
transform.position = Vector3.MoveTowards(transform.position,
targetPos + Vector3.forward * GameManager.I.Speed * Time.deltaTime,
laneChangeSpeed * Time.deltaTime);

// 重力 & 跳跃
if (!isGrounded)
verticalVelocity -= 9.81f * Time.deltaTime;
else
verticalVelocity = 0;

cc.Move(Vector3.up * verticalVelocity * Time.deltaTime);
}

void OnMove(InputAction.CallbackContext ctx)
{
var v = ctx.ReadValue<Vector2();
if (v.x 0 && currentLane < 2) currentLane++;
if (v.x < 0 && currentLane 0) currentLane;
}

void Jump()
{
if (!isGrounded isRolling) return;
isGrounded = false;
verticalVelocity = 2 * jumpHeight / jumpDuration;
DOVirtual.DelayedCall(jumpDuration, () = isGrounded = true);
}

void Roll()
{
if (!isGrounded isRolling) return;
isRolling = true;
transform.DOScaleY(0.5f, 0.1f);
DOVirtual.DelayedCall(rollDuration, () =
{
transform.DOScaleY(1, 0.1f);
isRolling = false;
});
}

void OnTriggerEnter(Collider other)
{
if (other.CompareTag(Obstacle))
GameManager.I.GameOver();
else if (other.CompareTag(Coin))
{
CoinManager.I.AddCoin();
other.gameObject.SetActive(false);
}
}
}

3、WorldGenerator.cs(无限跑道)
csharp
public class WorldGenerator : MonoBehaviour
{
[Header(Prefabs)]
public GameObject[] groundPrefabs;
public GameObject[] obstaclePrefabs;
public GameObject coinPrefab;

[Header(Spawn)]
public int initSegments = 10;
public float segmentLength = 10;
public int coinsPerSegment = 5;

Queue<GameObject activeSegments = new();
float nextSpawnZ;

void Start()
{
for (int i = 0; i < initSegments; i++)
SpawnSegment(i * segmentLength);
}

void Update()
{
if (PlayerController.I.transform.position.z + 50 nextSpawnZ)
SpawnSegment(nextSpawnZ);
if (activeSegments.Count 0 &&
activeSegments.Peek().transform.position.z + 50 < PlayerController.I.transform.position.z)
{
var seg = activeSegments.Dequeue();
Addressables.ReleaseInstance(seg); // 热更资源
}
}

void SpawnSegment(float z)
{
var ground = Addressables.InstantiateAsync(
groundPrefabs[Random.Range(0, groundPrefabs.Length)],
new Vector3(0, 0, z), Quaternion.identity).WaitForCompletion();
activeSegments.Enqueue(ground);

// 障碍
int obstacleLane = Random.Range(0, 3);
var obstacle = Addressables.InstantiateAsync(
obstaclePrefabs[Random.Range(0, obstaclePrefabs.Length)],
new Vector3((obstacleLane 1) * 3, 0, z + segmentLength * 0.5f),
Quaternion.identity).WaitForCompletion();
activeSegments.Enqueue(obstacle);

// 金币
for (int i = 0; i < coinsPerSegment; i++)
{
int coinLane = Random.Range(0, 3);
var coin = Addressables.InstantiateAsync(coinPrefab,
new Vector3((coinLane 1) * 3, 1, z + Random.Range(0, segmentLength)),
Quaternion.identity).WaitForCompletion();
activeSegments.Enqueue(coin);
}

nextSpawnZ += segmentLength;
}
}

4、CoinManager.cs(简单数据持久化)
csharp
public class CoinManager : MonoBehaviour
{
public static CoinManager I { get; private set; }
public int Coins { get; private set; }

void Awake()
{
I = this;
Coins = PlayerPrefs.GetInt(Coins, 0);
}

public void AddCoin()
{
Coins++;
PlayerPrefs.SetInt(Coins, Coins);
UIManager.I.UpdateCoinText(Coins);
}
}

5、UIManager.cs(Canvas 管理)
csharp
public class UIManager : MonoBehaviour
{
public static UIManager I { get; private set; }

[Header(Panels)]
public GameObject menuPanel;
public GameObject gameOverPanel;
public TextMeshProUGUI coinText;

void Awake() = I = this;

public void ShowGameOver()
{
gameOverPanel.SetActive(true);
}

public void UpdateCoinText(int coins)
{
coinText.text = coins.ToString();
}
}

四、美术与动画
1、角色:
• Kenney「Toon Characters 1」免费包,导入后选 Runner 角色。
• 用 Unity 的 2D Animation 绑定骨骼,做 Idle、Run、Jump、Roll 四段 AnimationClip。
2、场景:
• Kenney「Prototype Textures」做 3 条跑道贴图。
• 障碍用简单 Cube + 红色材质。
• 金币用 Kenney「Coin」Sprite。

五、输入系统
Edit → Project Settings → Player → Active Input Handling 选「Input System Package (New)」。
创建 PlayerInputActions.inputactions 文件,绑定:
• Move:左右箭头 / A D / 滑动屏幕
• Jump:空格 / 上箭头 / 向上滑
• Roll:左 Ctrl / 下滑

六、资源热更(Addressables)
1、菜单 Window → Asset Management → Addressables → Groups。
2、把 Prefabs 文件夹拖到 Addressable 窗口,勾选「Build Remote Catalog」。
3、在 CI 中执行:
`AddressableAssetSettings.BuildPlayerContent()`
把生成的 `ServerData` 目录上传到 CDN。

七、自动打包(GitHub Actions)
`.github/workflows/build.yml`
yaml
name: Build

on:
push:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest
steps:
uses: actions/checkout@v3
uses: game-ci/unity-builder@v2
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
targetPlatform: Android
uses: actions/upload-artifact@v3
with:
name: Android-APK
path: build/Android

把 Unity 许可证文件(alf)内容贴到 GitHub Secret 即可。

八、可热更配置表
使用 ScriptableObject + Addressables:
csharp
[CreateAssetMenu(menuName=Game/LevelConfig)]
public class LevelConfig : ScriptableObject
{
public float baseSpeed = 5;
public AnimationCurve speedCurve;
public int coinValue = 1;
}

策划修改后,重新 Build Addressables,玩家下次启动自动拉取。

九、7 天开发计划
Day1 环境 & 目录
Day2 角色移动 & 输入
Day3 无限跑道 & 障碍
Day4 金币 & UI
Day5 美术 & 动画
Day6 Addressables + 热更配置
Day7 CI/CD + 商店图标、截图

十、常见问题
1、安卓黑屏:Player Settings → Other Settings → Color Space 改为 Gamma。
2、帧率不稳:关闭 VSync,Application.targetFrameRate = 60。
3、碰撞失效:Player 加 Rigidbody 并勾选 IsKinematic,障碍加 Collider 勾选 IsTrigger。

十一、完整源码仓库
GitHub:https://github.com/yourname/EndlessRunner
分支说明:
• main:完整 Demo
• day1~day7:每日提交记录,方便回溯学习

十二、进阶扩展(课后作业)
1、道具系统:磁铁、2x 金币、护盾。
2、商店:用金币解锁角色皮肤。
3、广告:Unity Ads Rewarded 视频复活。
4、数据埋点:GameAnalytics SDK 统计关卡留存。

祝你 7 天后拥有自己的第一款可上线作品!

Ai作答

📣 商家广告


广告招商

月饼

日付VPS

贵阳用友软件

广告招商


0

IP地址: 63.128.201.112

搜索次数: 76

提问时间: 2025-11-07 03:17:24

🛒 域名购买
728.net.cn
gwgh.cn
cisou.com.cn
n-f.cn
46.hk
s.tw.cn
723.net.cn
xc6.net
wy.gs
pf.gs

❓️ 热门提问
vps吧
de域名
itx服务器
按需收费云主机
vps线路管理
网店怎么开的呀
linux系统搭建ftp服务器
站群系统建设服务公司教程
nginx文件服务器
域名自动抢注软件
豌豆Ai站群搜索引擎系统

🌐 域名评估
trump.yn.cn
zw.gs
ii.mo.cn
gz.gs
haocl.com
oxvc.cn
yqpot.cn
drone.sc.cn
tesla.ah.cn
ssr.gs

⛏ 最新挖掘
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜

🖌 热门作画

🤝 关于我们:
豌豆Ai 域名 建站 站群 留痕 推广 评估 源码
开发Ai 工具 日记 价格 加盟 广告 流量 留言 联系

🗨 加入群聊
群

🔗 友情链接
霸屏神器  検索エンジンのソースコード  ai提问

🧰 站长工具
Ai工具  whois查询  搜索

📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。

👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。

上一篇 56614 56615 56616 下一篇