双人游戏补充

UI

获胜

得分

胜负

胜负面板显示

玩家移动控制

UI面板逻辑统筹

此篇基于双人游戏上与双人游戏下篇基础更改而来,阅读过程中有疑问请查阅上述两篇文章
双人游戏上
双人游戏下
文内主要进行以下补充:
1.游戏结束时如何停止玩家移动与射击
2.游戏结束时如何判断获胜
3.如何退出游戏
适合不懂UI的小白,纯步骤性阅读

UI

讲解捎带理论性知识,尽量贴合步骤
最终制作好的UI效果图如下:
界面布局图

获胜

获胜面板在于WinPanel的制作,步骤如下:
1.在层级面板右键找到UI->面板(Panel),点击,将新建的面板更名为WinPanel
在这里插入图片描述
2.缩放WinPanel大小以便适应新建的子对象
选中Win Panel,按下T键,鼠标移动至WinPanel四角的某蓝色小球上(建议是右下角的),按住鼠标左键,此时蓝色小球颜色开始变化,同时按住Shift+Ctrl,移动鼠标就可以对WinPanel进行等比例放缩,具体大小可自行设计
在这里插入图片描述
3.新建子对象
右键WinPanel,为其创建子对象,分别是UI->文本(Text),UI->按钮(Button),UI->按钮(Button),分别为他们更名为wanjiaText,重来按钮,退出按钮,点选任一子对象,按下W键,调整子对象的位置,可按照上图进行位置调整
4.按钮文字更正
在层级面板选择重来按钮前面的小三角,展开重来按钮,点击里面的Text,来到检查器面板,将重来一次输入在文本框内,退出游戏同理。
在这里插入图片描述

得分

在层级面板右键Canvas,创建一个UI->文本(Text),更名为玩家1得分,选中玩家1得分,按下Ctrl+D复制一份调整位置并更名为玩家2得分
在这里插入图片描述

胜负

胜负面板显示

1.胜负的判断应该是由玩家1的得分和玩家2的得分来判断的,判断的时机可以是得分道具全吃完了,也可以是道具全部吃完,本篇采用道具全部吃完,故而胜负面板的显示放置在了DaoJu脚本内,DaoJu脚本更改如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DaoJu : MonoBehaviour
{
    public GameObject daoju1;
    public GameObject daoju2;

    public int daoju1ShuLiang;
    public int daoju2ShuLiang;

    public GameObject winPanel;

    void Start()
    {
        winPanel.SetActive(false);

        for (int i=0;i<daoju1ShuLiang;i++)
        {
            GameObject obj = Instantiate(daoju1, new Vector3(Random.Range(-8, 8), 0, Random.Range(-9, 9)), Quaternion.identity);
            obj.transform.SetParent(transform);
        }
        for (int i = 0; i < daoju2ShuLiang; i++)
        {
            GameObject obj = Instantiate(daoju2, new Vector3(Random.Range(-8, 8), 0, Random.Range(-9, 9)), Quaternion.identity);
            obj.transform.SetParent(transform);
        }
    }
    void Update()
    {
        if (transform.childCount == 0)
        {
            winPanel.SetActive(true);
        }
    }
}

连线关系如下:
在这里插入图片描述

玩家移动控制

通过上述脚本可以控制当道具完全吃完的时候出现面板,但不能解决玩家仍旧可以发射和移动的问题,故而需要在WanJiaA与WanJiaB脚本内添加限定条件,增加bool值判定
WanJiaA脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WanJiaA : MonoBehaviour
{
    public float speed = 1;
    public GameObject zidan;
    public Transform fashedian;

    public int fen = 0;

    public bool isMove;
    public bool isFire;

    void Start()
    {
        isMove = true;
        isFire = true;
    }
    void Update()
    {
        //易犯错点:W为大写,所有26字母键全为大写
        //通过Scene面板发现玩家1前坐标轴线颜色为蓝色(Z),右坐标轴线颜色为红(X)
        if(isMove)
        {
            if (Input.GetKey(KeyCode.W))
            {
                transform.position += Vector3.forward * Time.deltaTime * speed;
            }
            if (Input.GetKey(KeyCode.S))
            {
                transform.position += Vector3.back * Time.deltaTime * speed;
            }
            if (Input.GetKey(KeyCode.A))
            {
                transform.position += Vector3.left * Time.deltaTime * speed;
            }
            if (Input.GetKey(KeyCode.D))
            {
                transform.position += Vector3.right * Time.deltaTime * speed;
            }
        }
        if(isFire)
        {
            //0代表鼠标左键,1代表鼠标右键,2代表鼠标中键
            if (Input.GetMouseButtonDown(0))
            {
                //生成子弹并为子弹设置父亲,父亲位置为fashedian
                Instantiate(zidan, fashedian);
            }
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if(other.tag=="fen")
        {
            fen++;//得分+1
            Destroy(other.gameObject);//让道具消失
        }
        if(other.tag=="su")
        {
            speed += 0.5f;
            Destroy(other.gameObject);
        }
    }
}

WanJiaB脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WanJiaB : MonoBehaviour
{
    public float speed = 1;
    public GameObject zidan;
    public Transform fashedian;

    public int fen = 0;
    public bool isMove;
    public bool isFire;

    void Start()
    {
        isMove = true;
        isFire = true;
    }
    void Update()
    {
        //易犯错点:W为大写,所有26字母键全为大写
        //通过Scene面板发现玩家1前坐标轴线颜色为蓝色(Z),右坐标轴线颜色为红(X)
        //上光标键UpArrow,下光标键DownArrow,左光标键LeftArrow,右光标键RightArrow
        if(isMove)
        {
            if (Input.GetKey(KeyCode.UpArrow))
            {
                transform.position += Vector3.forward * Time.deltaTime * speed;
            }
            if (Input.GetKey(KeyCode.DownArrow))
            {
                transform.position += Vector3.back * Time.deltaTime * speed;
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.position += Vector3.left * Time.deltaTime * speed;
            }
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.position += Vector3.right * Time.deltaTime * speed;
            }
        }
        if(isFire)
        {
            //0代表鼠标左键,1代表鼠标右键,2代表鼠标中键
            if (Input.GetMouseButtonDown(1))
            {
                //生成子弹并为子弹设置父亲,父亲位置为fashedian
                Instantiate(zidan, fashedian);
            }
        }
    }
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "fen")
        {
            fen++;//得分+1
            Destroy(other.gameObject);//让道具消失
        }
        if (other.tag == "su")
        {
            speed += 0.5f;
            Destroy(other.gameObject);
        }
    }
}

UI面板逻辑统筹

此时可以通过bool值控制玩家的移动,但并未使用,最终的逻辑会回到WinPanel面板,故而为WinPanel添加脚本为Win Panel,脚本内容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class WinPanel : MonoBehaviour
{
    //要获取WanJiaA与WanJiaB的得分,先要获取他们挂载的脚本
    public WanJiaA wanjiaA;
    public WanJiaB wanjiaB;

    //显示谁获胜
    public Text wanjaiText;
    public Button againBtn;
    public Button exitBtn;

    //显示得分
    public Text wanjiaAScore;
    public Text wanjiaBScore;
    //通过道具收纳来确定道具还剩下多少
    public Transform daojuTrans;
    void Start()
    {
        againBtn.onClick.AddListener(ResetGame);
        exitBtn.onClick.AddListener(ExitGame);
    }

    void Update()
    {
        wanjiaAScore.text = "玩家1得分:" + wanjiaA.fen;
        wanjiaBScore.text = "玩家2得分:" + wanjiaB.fen;
        //一旦道具收纳没有子对象则说明没有道具,让玩家停止移动与射击
        if (daojuTrans.childCount == 0)
        {
            wanjiaB.isFire = false;
            wanjiaB.isMove = false;
            wanjiaA.isMove = false;
            wanjiaA.isFire = false;
            //判断谁的得分高
            if (wanjiaA.fen > wanjiaB.fen)
            {
                wanjaiText.text = "恭喜玩家1获胜";
            }
            else
            {
                wanjaiText.text = "恭喜玩家2获胜";
            }
        }
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            ExitGame();
        }
    }
    //重新开始
    void ResetGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
    //退出游戏
    void ExitGame()
    {
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#else
            Application.Quit();
#endif
    }
}

连线关系如下:
在这里插入图片描述
运行游戏试一下吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值