Unity初级项目实战:官方宇宙飞机大战游戏(五)

五。设计计算分数和重新开始
1.首先,新建一个UGUI的Text,移到合适位置,设置锚点,固定在一个地方,然后在游戏管理器里面加上以下参数和方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class M_GameManager : MonoBehaviour {

    public Transform EnemySpawnPosition;//生成点的基础位置
    private float SpawnDurationTime = 2;//生成的间隔时间
    public GameObject Enemy01;//生成的敌人预制体

    public int Score;//得分
    public static M_GameManager _instance;//单例
    public Text ScoreText;//显示分数的文本组件
    private void Awake()
    {
        _instance = this;//获得单例
    }
    void Start () {

    }


    void Update () {
        CreatEnemy();
    }
    private void CreatEnemy()//生成的方法
    {
        SpawnDurationTime -= Time.deltaTime;
        if (SpawnDurationTime <= 0)
        {
            Instantiate(Enemy01, new Vector3(GetRandomPos(-4, 4), EnemySpawnPosition.position.y, EnemySpawnPosition.position.z), EnemySpawnPosition.rotation);
            SpawnDurationTime = 2.0f;
        }

    }
    private float  GetRandomPos(float Min,float Max)//生成随机数的方法
    {
        return Random.Range(Min, Max);
    }
    public void AddScore(int amount)//更新分数的方法
    {
        Score += amount;
        ScoreText.text = "得分:" + Score;
    }
}

进行赋值
这里写图片描述
然后打开Enemy脚本,加入一行代码
这里写图片描述
运行,射中陨石便可以看到积分更新。
2.重新开始的话,我的思路是重新加载这个场景,这也是比较简单的实现方式,在设置之前,先对场景的灯光信息进行保存,如下进行烘焙
在菜单栏的Window下,找到Lighting里面的Setting,打开如下
这里写图片描述
3.回到M_GameManager脚本里面,添加如下参数和方法,注意要添加Using UnityEngine.UI和Using UnityEngine.SceneManager两个命名空间,一个是ui的,一个是场景转换的
这里写图片描述
这里写图片描述
4.然后打开Player脚本,添加下面两行代码
这里写图片描述
5.回到Unity,在新建一个Text,添加如下文字
这里写图片描述
6.再把Text赋值给游戏管理器的值上
这里写图片描述
7.打开File-BuildSetting 把自己的MainScene场景拖进去,
然后运行,玩家销毁后,按R键重新开始
8.完整脚本
***************************M_GameManager*************

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class M_GameManager : MonoBehaviour {

    public Transform EnemySpawnPosition;//生成点的基础位置
    private float SpawnDurationTime = 2;//生成的间隔时间
    public GameObject Enemy01;//生成的敌人预制体

    public int Score;//得分
    public static M_GameManager _instance;//单例
    public Text ScoreText;//显示分数的文本组件
    public Text ReStartText;//重新开始的文本组件

    public bool CanRestart = false;//控制是否可以重新再开来的开关
    private void Awake()
    {
        _instance = this;//获得单例
    }
    void Start () {
        CanRestart = false;//初始化
        HideRestartText();//初始化
    }


    void Update () {
        CreatEnemy();
        if (CanRestart)
        {
            if (Input.GetKey(KeyCode.R))
            {
                RestartGame();
            }
        }
    }

    private void CreatEnemy()//生成的方法
    {
        SpawnDurationTime -= Time.deltaTime;
        if (SpawnDurationTime <= 0)
        {
            Instantiate(Enemy01, new Vector3(GetRandomPos(-4, 4), EnemySpawnPosition.position.y, EnemySpawnPosition.position.z), EnemySpawnPosition.rotation);
            SpawnDurationTime = 2.0f;
        }

    }
    private float  GetRandomPos(float Min,float Max)//生成随机数的方法
    {
        return Random.Range(Min, Max);
    }
    public void AddScore(int amount)//更新分数的方法
    {
        Score += amount;
        ScoreText.text = "得分:" + Score;
    }

    public void ShowRestartText()//显示重新再来的文本
    {
        ReStartText.gameObject.SetActive(true);
    }
    public void HideRestartText()//隐藏重新再来的文本
    {
        ReStartText.gameObject.SetActive(false);
    }
    public void RestartGame()//重新载入场景
    {
        SceneManager.LoadScene("MainScene");
    }
}

***********************************************Player******************************

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]//可显示
public class PlayerClampBounder//移动的X,Z最大范围或者最小范围类
{
    public float MaxX;
    public float MaxZ;
    public float MinX;
    public float MinZ;
}
public class Player : MonoBehaviour {

    public PlayerClampBounder Bounder;//边界范围
    public float MoveSpeed;//移动速度

    public float ShotDuratime = 0.3f;//发射的间隔时间
    public GameObject BulletPrefab;//子弹的预制体,在unity进行赋值
    private Transform BulletPoint;//子弹生成的位置

    public GameObject PlayerExplosion;//玩家爆炸


    private AudioSource PlayerAS;//玩家的声音组件
    public AudioClip PlayerExplosionClip;//玩家爆炸的音频
    public AudioClip PlayerShootClip;//玩家发射子弹的音频


    void Start () {

        BulletPoint = transform.Find("BulletPoint");//获取子物体BulletPoint
        PlayerAS = GetComponent<AudioSource>();//获取音频组件
    }

    // Update is called once per frame
    void Update () {
        MoveMent();
        ShotBullet();

    }

    public void MoveMent()//控制移动的方法
    {
        float Horizontal = Input.GetAxis("Horizontal");//获取水平输入轴
        float Vertical = Input.GetAxis("Vertical");//获取垂直输入轴
        if (transform.position.x >= Bounder.MaxX && Horizontal > 0)//如果当前x位置大于等于边界范围,且还在向这个方向运动,也就是说还按下了向右,就让水平输入值为0,也就不会再继续向右
        {
            Horizontal = 0;
        }
        else if (transform.position.x <= Bounder.MinX && Horizontal < 0)//同理
        {
            Horizontal = 0;
        }
        else if (transform.position.z >= Bounder.MaxZ && Vertical > 0)
        {
            Vertical = 0;
        }
        else if (transform.position.z <= Bounder.MinZ && Vertical < 0)
        {
            Vertical = 0;
        }
        transform.Translate(Horizontal*MoveSpeed*Time.deltaTime, 0, Vertical*Time.deltaTime*MoveSpeed);//移动
    }
    private void ShotBullet()
    {
        ShotDuratime -= Time.deltaTime;
        if (ShotDuratime <= 0&&Input.GetMouseButton(0))//当时间到了且按下了鼠标左键
        {
            if (!PlayerAS.isPlaying)
            {
                PlayerAS.clip = PlayerShootClip;
                PlayerAS.Play();
            }
            Instantiate(BulletPrefab, BulletPoint.position, Quaternion.identity);//生成子弹
            ShotDuratime = 0.3f;//重新设置间隔时间
        }

    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Enemy")//碰到敌人
        {
            if (!PlayerAS.isPlaying)
            {
                PlayerAS.clip = PlayerExplosionClip; ;
                PlayerAS.Play();
            }
            Destroy(other.gameObject);//销毁敌人
            GameObject obj = Instantiate(PlayerExplosion, transform.position, Quaternion.identity);//生成爆炸物
            Destroy(obj, 0.3f);//销毁爆炸物


            M_GameManager._instance.ShowRestartText();
            M_GameManager._instance.CanRestart = true;
            Destroy(gameObject,0.2f);//销毁自己
        }
    }
}
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToDoNothing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值