本次作业的任务是使用UI制作一个背包系统
首先要制作一个静态的场景
游戏对象如下
其中Bag是新建的空对象,在里面创建9个按钮,下面是Bag和其按钮的参数设置
Equipment为装备栏,在里面创建3个按钮,下面是装备栏和其按钮的参数设置
Random是一个按钮,用于重新生成装备栏中的装备
再加上人物预设(从Asset Store上下载),摄像机,粒子系统,背景图片
下面是UI Camera的参数设置
以及Hero Camera的参数设置,人物预设设置为HeroCamera的child
调整相应位置后可得到如下的场景
至此已经完成场景的基本布局
接下来的任务是用代码实现具体的UI行为
首先是TiltWindow.cs,挂载在对象Bag和Equipment上,用于实现画布随鼠标摆动
public class TiltWindow : MonoBehaviour
{
public Vector2 range = new Vector2(5f, 3f);
Transform mTrans;
Quaternion mStart;
Vector2 mRot = Vector2.zero;
void Start ()
{
mTrans = transform;
mStart = mTrans.localRotation;
}
void Update ()
{
Vector3 pos = Input.mousePosition;
float halfWidth = Screen.width * 0.5f;
float halfHeight = Screen.height * 0.5f;
float x = Mathf.Clamp((pos.x - halfWidth) / halfWidth, -1f, 1f);
float y = Mathf.Clamp((pos.y - halfHeight) / halfHeight, -1f, 1f);
mRot = Vector2.Lerp(mRot, new Vector2(x, y), Time.deltaTime * 5f);
mTrans.localRotation = mStart * Quaternion.Euler(-mRot.y * range.y, -mRot.x * range.x, 0f);
}
}
接下来是GameManager.cs,挂载在对象Canvas上,用于作为场景的控制管理器
其中三个int参数主要用于标志装备栏中的装备,通过将他们设置为1,具体在下面Equipment.cs中的Update函数通过检测这三个数的值重新生成新的装备
public class GameManager : MonoBehaviour {
private MouseImage mouse;
private int IsHat = 0;
private int IsHand = 0;
private int IsShoes = 0;
void Start() {
mouse = (MouseImage)FindObjectOfType (typeof(MouseImage));
}
public MouseImage getMouse() {
return mouse;
}
public void setMouse(MouseImage m) {
if (mouse == null) {
mouse = m;
}
}
public void RandomWear() {
IsHat = 1;
IsHand = 1;
IsShoes = 1;
}
public int getHat() { return IsHat; }
public int getHand() { return IsHand; }
public int getShoes() { return IsShoes; }
public void setHat(int h) { IsHat = h; }
public void setHand(int h) { IsHand = h; }
public void setShoes(int s) { IsShoes = s; }
}
接下来是Equipment.cs,挂载在每个equipment按钮上,用于完成装备栏中拾取和放置装备的行为
mouseType用于记录当前鼠标拾取的装备种类
OnEquipButton函数完成装备从装备栏到鼠标或者从鼠标到装备栏的移动
public class Equipment : MonoBehaviour {
private GameManager GM;
private Image equipImage;
public int mouseType;
public Sprite equip;
public Sprite UISprite;
void Start() {
GM = (GameManager)FindObjectOfType (typeof(GameManager));
equipImage = GetComponent ();
}
public void OnEquipButton() {
int _mouseType = GM.getMouse ().getMouseType ();
if (equipImage.sprite == equip && _mouseType == 0) {
equipImage.sprite = UISprite;
GM.getMouse ().setMouseType (mouseType);
}
else if (equipImage.sprite == UISprite && _mouseType == mouseType) {
equipImage.sprite = equip;
GM.getMouse ().setMouseType (0);
}
}
void Update() {
if (mouseType == 1 && GM.getHat () == 1) {
GM.setHat (0);
equipImage.sprite = equip;
}
else if (mouseType == 2 && GM.getHand() == 1)
{
GM.setHand (0);
equipImage.sprite = equip;
}
else if (mouseType == 3 && GM.getShoes() == 1)
{
GM.setShoes (0);
equipImage.sprite = equip;
}
}
}
由于装备栏中三个按钮规定的装备种类不同,因此在参数设置上也会有所不同,下面是用于放置Hat的按钮设置
接下来是Bag.cs,挂载在Bag中每个按钮上,用于完成背包栏中的拾取和放置装备的行为
第一个if中实现背包为空,鼠标不为空的情况的放置
下面三个if中实现背包不为空的情况的拾取放置,当鼠标和背包中都有装备时,点击将使两者的装备互换
public class Bag : MonoBehaviour {
private GameManager GM;
private Image bagImage;
private int mouseType = 0;
public Sprite UISprite;
public Sprite hat;
public Sprite hand;
public Sprite shoes;
void Start() {
GM = (GameManager)FindObjectOfType (typeof(GameManager));
bagImage = GetComponent ();
}
public void OnBagButton() {
int _mouseType = GM.getMouse ().getMouseType ();
Debug.Log (_mouseType);
if (bagImage.sprite == UISprite && _mouseType != 0) {
Debug.Log ("put in");
if (_mouseType == 1) {
bagImage.sprite = hat;
GM.getMouse ().setMouseType (0);
} else if (_mouseType == 2) {
bagImage.sprite = hand;
GM.getMouse ().setMouseType (0);
} else if (_mouseType == 3) {
bagImage.sprite = shoes;
GM.getMouse ().setMouseType (0);
}
}
else if (bagImage.sprite == hat)
{
if (_mouseType == 0) {
bagImage.sprite = UISprite;
}
else if (_mouseType == 1)
{
bagImage.sprite = hat;
}
else if (_mouseType == 2)
{
bagImage.sprite = hand;
}
else if (_mouseType == 3)
{
bagImage.sprite = shoes;
}
GM.getMouse ().setMouseType (1);
}
else if (bagImage.sprite == hand)
{
if (_mouseType == 0) {
bagImage.sprite = UISprite;
}
else if (_mouseType == 1)
{
bagImage.sprite = hat;
}
else if (_mouseType == 2)
{
bagImage.sprite = hand;
}
else if (_mouseType == 3)
{
bagImage.sprite = shoes;
}
GM.getMouse ().setMouseType (2);
}
else if (bagImage.sprite == shoes)
{
if (_mouseType == 0) {
bagImage.sprite = UISprite;
}
else if (_mouseType == 1)
{
bagImage.sprite = hat;
}
else if (_mouseType == 2)
{
bagImage.sprite = hand;
}
else if (_mouseType == 3)
{
bagImage.sprite = shoes;
}
GM.getMouse ().setMouseType (3);
}
}
}
由于背包中每个按钮并没有规定放置的装备种类,因此三种装备都可以放置
下面为Bag中按钮的参数设置
接下来是MouseImage.cs,用于实现鼠标的拾取和放置行为,挂载在空的Image对象UI Image上
public class MouseImage : MonoBehaviour {
private GameManager GM;
private Image mouseImage;
private int mouseType = 0;
private int zPosition;
public Sprite none;
public Sprite hat;
public Sprite hand;
public Sprite shoes;
public Camera cam;
void Start() {
GM = (GameManager)FindObjectOfType (typeof(GameManager));
GM.setMouse (this);
mouseImage = GetComponent ();
zPosition = -400;
}
public int getMouseType() { return mouseType; }
public void setMouseType(int m) { mouseType = m; }
void Update() {
Debug.Log (mouseType);
if (mouseType == 0) {
mouseImage.sprite = none;
}
else if (mouseType == 1) {
mouseImage.sprite = hat;
}
else if (mouseType == 2) {
mouseImage.sprite = hand;
}
else if (mouseType == 3) {
mouseImage.sprite = shoes;
}
transform.position = new Vector3 (Input.mousePosition.x - 450, Input.mousePosition.y - 300 , zPosition);
//Debug.Log (Input.mousePosition);
if (mouseType != 0) {
zPosition = 100;
} else {
zPosition = -400;
}
}
}
其中
transform.position = new Vector3 (Input.mousePosition.x - 450, Input.mousePosition.y - 300 , zPosition);
实现拾取的图片跟随鼠标移动
参数设置如下
最后是RandomWear.cs,实现在装备栏中重新生成新的装备(调用GameManager中的函数),挂载在RandomWear按钮上
public class RandomWear : MonoBehaviour {
private GameManager GM;
void Start() {
GM = (GameManager)FindObjectOfType (typeof(GameManager));
}
public void OnPress() {
GM.RandomWear ();
}
}
至此已基本完成,实现效果如下
这次还有一些没有实现,如每种装备有多个不同的对象,在人物身上装上相应的装备,只能等以后有时间再完善了= =