制作分数和生命的UI:
由于我们前面没有做类似的UI所以这里教大伙一下基本思路:
首先我们创建一个canvas用来创建两个Text用来显示分数和生命的UI
蓝色的是分数黄色的是生命
我们创建一个scoreplay的脚本挂载在text上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScoreDisplay : MonoBehaviour
{
Text scoreText;
GameSeesion gameSession;
private void Start()
{
scoreText = GetComponent();
gameSession = FindObjectOfType();
}
private void Update()
{
scoreText.text = gameSession.GetScore().ToString();
}
}
创建一个空对象gamesession还有一个同名脚本挂载在它上面:
接着我们改一下Player和Enemy的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
[Header("玩家移动")]
[SerializeField] float ySpeed = 10f;
[SerializeField] float xSpeed = 10f;
[SerializeField] float padding = 1f;
[Header("Play Health")]
[SerializeField] int health = 500;
[Header("ProjectTile")]
[SerializeField] GameObject laserPrefab;
[SerializeField] float projectTileSpeed = 10f;
[SerializeField] float projectTileFiringPeriod = 0.1f;
//战机在屏幕能移动的坐标
float xMin;
float xMax;
float yMin;
float yMax;
//协程的编程是指在不堵塞主线程的情况下执行某些特定的函数
Coroutine fireCoroutine;
[SerializeField] AudioClip deathSFX;
[SerializeField] [Range(0, 1)] float deathSoundVolume = 0.75f;
[SerializeField] AudioClip shootSFX;
[SerializeField] [Range(0, 1)] float shootSoundVolume = 0.55f;
void Start()
{
SetUpMoveBoundaries();
}
private void SetUpMoveBoundaries()
{
Camera gameCamera = Camera.main;
//之前的视频说过,Camera.main.ViewportToWorldPoint()是将摄像机视角的坐标转化为世界坐标然后padding是防止战机出屏幕边缘
xMin = gameCamera.ViewportToWorldPoint(new Vector3(0, 0, 0)).x + padding;
xMax = gameCamera.ViewportToWorldPoint(new Vector3(1, 0, 0)).x - padding;
yMin = gameCamera.ViewportToWorldPoint(new Vector3(0, 0, 0)).y + padding;
yMax = gameCamera.ViewportToWorldPoint(new Vector3(0, 1, 0)).y - padding;
}
void Update()
{
Move();
Fire();
}
private void Move()
{
//Input Manager上两个监控键盘上WSAD按键而生成-1到1值的
var deltaY = Input.GetAxis("Vertical") * Time.deltaTime * ySpeed;
var deltaX = Input.GetAxis("Horizontal") * Time.deltaTime * xSpeed;
// Debug.Log(deltaX);
//限制移动范围
var newXPos = Mathf.Clamp(transform.position.x + deltaX, xMin, xMax);
var newYPos = Mathf.Clamp(transform.position.y + deltaY, yMin, yMax);
transform.position = new Vector2(newXPos,newYPos);
}
private void Fire()
{
if (Input.GetButtonDown("Fire1"))
{
fireCoroutine = StartCoroutine(FireContinuously());
}
if (Input.GetButtonUp("Fire1"))//这个Fire1也是Input Manager上的
{
StopCoroutine(fireCoroutine); //暂停某个协程
// StopAllCoroutines();
}
}
//协程函数是用关键字迭代器IEnumerator而且一定要用yield关键词返回
IEnumerator FireContinuously()
{
while (true)
{
GameObject laser = Instantiate(laserPrefab, transform.position, Quaternion.identity) as GameObject; //生成子弹
laser.GetComponent().velocity = new Vector2(0, projectTileSpeed); //给子弹一个向上的力
AudioSource.PlayClipAtPoint(shootSFX, Camera.main.transform.position, shootSoundVolume);
yield return new WaitForSeconds(projectTileFiringPeriod); //下一颗子弹发生的间隔时间
}
}
private void OnTriggerEnter2D(Collider2D other)
{
DamageDealer damageDealer = other.gameObject.GetComponent();
if (!damageDealer) { return; }
ProcessHit(damageDealer);
}
private void ProcessHit(DamageDealer damageDealer)
{
health -= damageDealer.GetDamage(); //减去收到的伤害
damageDealer.Hit();
if (health
关注
打赏
热门博文
- 【Untiy2D独立/合作开发】特别篇:如何实现快速丢掉物品
- [Unity2D独立/合作开发]实现记录物品在不同场景的存在状态,附:场景的淡入淡出功能和预加载
- 【Unity好插件之PlayMaker系列一上半部分】如何只用一个插件和一个脚本完成制作一个简易的游戏
- [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法
- [Unity存档系统]简单介绍Unity常见存档系统之一PlayerPrefs以及使用方法
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏⑤制作得分系统以及能量的使用。
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏④制作敌人管理器以及播数显示和音效以及场景加载器
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏③制作血条和能量条UI以及生命值系统和能量值系统
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏②游戏画面后处理以及制作玩家子弹
- 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏①简单制作滚动卷轴以及玩家移动