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
}
}
连线关系如下:
运行游戏试一下吧。