一、 介绍
主角左右移动,往下跳,可以获得道具、获得分数
出界后游戏结束
二、 知识点
1.纹理图片不间断播放
bg.material.SetTextureOffset("_MainTex", new Vector2(0, Time.time / 5));
2.给组件添加脚本的另一种方式
gameobject.AddComponent<>();
3.animator控制器的操作
4.取消动画连播的两种:1写脚本停止 2取消loop
5.结束游戏 UnityEditor.EditorApplication.isPlaying = false;
三、 游戏控制器
设置图片不断向下运动的效果
生成不同形状的云彩
生成实云彩、虚云彩(不可踏)
生成2种奖励:金币、生命值
记录分数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManage : MonoBehaviour {
// 定义私有变量
private Image bg; // 背景图像
private GameObject[] clouds; // 云的预制体数组
private GameObject[] awards; // 奖励物品的预制体数组
private Transform gameCanvas; // 游戏画布的 Transform 组件
private int count; // 层数计数器
public Text Count; // 显示层数的文本组件
void Start () {
// 初始化变量
bg = GameObject.Find("BG").GetComponent<Image>();
clouds = Resources.LoadAll<GameObject>("Clouds");
awards = Resources.LoadAll<GameObject>("Awards");
gameCanvas = GameObject.Find("GameCanvas").transform;
InvokeRepeating("CreateAll", 0, 1); // 重复调用 CreateAll 函数
count = 0;
}
void Update () {
// 更新背景图像的偏移量和层数文本的显示内容
bg.material.SetTextureOffset("_MainTex", new Vector2(0, Time.time / 5));
Count.text = "层数:" + count.ToString();
}
// 生成云和奖励物品的函数
private void CreateAll()
{
// 随机生成 0 到 4 的整数
int rangeNum = Random.Range(0, 5);
GameObject tempObject = null;
if (0 == rangeNum) // 如果随机数为 0,则生成乌云
{
tempObject = clouds[3];
}
else // 否则随机生成一种云的预制体
{
tempObject = clouds[Random.Range(0, clouds.Length - 1)];
}
// 在随机位置生成云对象
GameObject clude = Instantiate(tempObject, new Vector3(Random.Range(-340, 341), -800, 0), Quaternion.identity);
clude.transform.SetParent(gameCanvas, false); // 设置云对象的父对象为游戏画布
GameObject award = CreateAward(); // 生成奖励物品
if (award != null) // 如果生成了奖励物品,则将其设置为云对象的子对象
{
Instantiate(award, new Vector3(0, 40, 0), Quaternion.identity).transform.SetParent(clude.transform, false);
}
clude.AddComponent<CloudsMove>(); // 在云对象上添加 CloudsMove 组件
count++; // 层数计数器加一
}
// 生成奖励物品的函数
private GameObject CreateAward()
{
// 随机生成 0 到 8 的整数
int num = Random.Range(0, 9);
GameObject temp = null;
if (0 == num) // 如果随机数为 0,则生成金币
{
temp = awards[1];
}
else if (0 < num && num < 4) // 如果随机数为 1、2、3,则生成钻石
{
temp = awards[0];
}
else // 否则不生成奖励物品
{
temp = null;
}
return temp; // 返回生成的奖励物品
}
}
四、 玩家移动
制作行走动画
添加分数
添加生命值
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerControl : MonoBehaviour {
// 定义私有变量
private Animator ani; // 动画控制器
private int life; // 生命值
private int grade; // 分数
public Text Life; // 显示生命值的文本组件
public Text Grade; // 显示分数的文本组件
void Start() {
// 初始化变量
ani = GetComponent<Animator>();
life = 1;
grade = 0;
}
void Update() {
// 判断是否超出屏幕范围,如果是则减少一点生命值,并将玩家移回屏幕中央
if (Mathf.Abs(transform.localPosition.y) >= 800) {
life--;
transform.localPosition = new Vector3(0, 600, 0);
}
// 如果生命值小于等于 0,则停止游戏
if (life <= 0)
UnityEditor.EditorApplication.isPlaying = false;
Move(); // 玩家移动
// 更新生命值和分数的显示内容
Life.text = "生命:" + life.ToString();
Grade.text = "分数:" + grade.ToString();
}
// 玩家移动的方法
private void Move() {
float h = Input.GetAxis("Horizontal"); // 获取玩家在水平方向上的输入
if (Mathf.Abs(h) > 0.1f) { // 如果输入的值大于 0.1,则表示需要移动
if (h > 0)
transform.localRotation = Quaternion.Euler(0, 0, 0); // 如果输入值大于 0,则让玩家面向右侧
else
transform.localRotation = Quaternion.Euler(0, 180, 0); // 如果输入值小于 0,则让玩家面向左侧
// 根据输入的值和时间差,计算玩家应该移动的距离,并让玩家移动
transform.Translate(h * transform.right * 5 * Time.deltaTime);
ani.SetBool("Run", true); // 设置动画状态为跑步
}
else {
ani.SetBool("Run", false); // 如果没有移动,则设置动画状态为停止
}
}
// 当玩家与其他物体发生碰撞时,会调用这个方法
public void OnTriggerEnter2D(Collider2D other) {
if (other.tag == "Gold") { // 如果碰到的物体是金币,则增加分数
grade += 10;
}
else if (other.tag == "Life") { // 如果碰到的物体是生命值,则增加生命值
life++;
}
Destroy(other.gameObject); // 销毁碰到的物体
}
}
五、 云彩移动
云彩不断向上运动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CloudsMove : MonoBehaviour {
void Start () {
}
void Update () {
transform.Translate(Vector3.up * Time.deltaTime * 3);
}
}
六、 下载工程文件
https://wwez.lanzoul.com/iWorG0tgsala