目录
一、UI的制作
二、代码整理
接下来我将制作游戏最重要的部分——UI,这只是很初步的制作
首先UI不能因为我们镜头的移动而留在原地,所以有个最基础的东西就是画布,就是承载UI的一个平台,在层次窗口右键找到UI找到画布(Canvas)创建。它会自动添加EventSystem。
假设我们现在想要显示我们之前设计的收集品玩家当前收集的个数,我们点击Canvas右键在UI中找到Text新建。(现在的新版把它移到了旧版(Lggacy)这个选项下面)
【注意:我们这里需要新建两个Text一个需要修改一个不需要】
然后我们双击画布,找到我们加入的text可以对它进行一系列修改
然后我们来到游戏画面就看见它正常显示了
接下来我们就需要实现这个数字可以随着我们吃到收集品而变化,我们点击角色控制的代码
首先为了可以控制UI的元素,我们需要使用UI的命名空间
using UnityEngine.UI;
然后创建一个用于操控UI的对象
public Text Cherrynumber;
然后同理按照之前的想法把我们需要修改的text拖进来,然后在物品收集函数中加上这样一句代码即可实现功能,这里使用ToString函数把CherryCount的int类型转化为可以显示的string类型
Cherrynumber.text = CherryCount.ToString();
宝石的数目同样处理,但这时我在测试的时候发现了一个bug就是但我把游戏屏幕全屏时UI的位置会乱窜,经过查找资料修改UI此处的锁定位置,锁定在左上角
然后我尝试把文本形式的UI换成了图像然后分别插入了樱桃和钻石的图像最后的成果
经过这几天的努力,我们的游戏已经有了基本的框架,已经可以做出一个基本的2D平台游戏,现在把代码做一些整理
PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Rigidbody2D rb; //刚体
public Collider2D footColl; //脚部碰撞体
public Collider2D bodyColl; //身体碰撞体
public Animator anim; //动画控制器
public float speed = 10; //速度
public float jumpforce; //跳跃力
public LayerMask ground; //碰撞体过滤
public int CherryCount = 0; //收集品樱桃计数器
public int GemCount = 0; //收集品宝石计数器
public Text Cherrynumber; //控制樱桃数目显示的UI
public Text Gemnumber; //控制樱桃数目显示的UI
void Start()
{
}
void Update()
{
if (Input.GetButtonDown("Jump") && footColl.IsTouchingLayers(ground)) //实现角色跳跃
{
rb.velocity = new Vector2(rb.velocity.x, jumpforce);
anim.SetBool("jumping", true);
}
if (!Physics2D.OverlapCircle(rb.position, 0.1f, ground))
{
if (Input.GetButton("Crouch")) //实现角色下蹲
{
anim.SetBool("crouching", true);
bodyColl.enabled = false;
speed = 5;
}
else //恢复姿态
{
anim.SetBool("crouching", false);
bodyColl.enabled = true;
speed = 10;
}
}
}
private void FixedUpdate()
{
SwitchAnim();
Move();
}
void Move() //控制玩家移动函数
{
float Horizontaldirection = Input.GetAxisRaw("Horizontal"); //玩家移动方向
rb.velocity = new Vector2(Horizontaldirection * speed, rb.velocity.y);
anim.SetFloat("running", Mathf.Abs(rb.velocity.x));
if (Horizontaldirection != 0)
{
transform.localScale = new Vector3(Horizontaldirection, 1, 1); //控制角色翻转
}
}
void SwitchAnim() //玩家动画切换函数
{
anim.SetBool("idleing", false);
if (anim.GetBool("jumping"))
{
if(rb.velocity.y < 0)
{
anim.SetBool("jumping", false);
anim.SetBool("falling", true);
}
}
else if(footColl.IsTouchingLayers(ground))
{
anim.SetBool("falling", false);
anim.SetBool("idleing", true);
}
}
private void OnTriggerEnter2D(Collider2D collision) //物品收集函数
{
if(bodyColl.IsTouching(collision) && collision.tag == "cherry") //如果身体碰到了樱桃
{
Destroy(collision.gameObject); //销毁游戏体
CherryCount++; //收集品数量加一
Cherrynumber.text = CherryCount.ToString();
}
if (bodyColl.IsTouching(collision) && collision.tag == "gem") //如果身体碰到了宝石
{
Destroy(collision.gameObject); //销毁游戏体
GemCount++; //收集品数量加一
Gemnumber.text = GemCount.ToString();
}
}
}