Unity3D学习笔记(8) UGUI实现背包Inventory
UGUI
Unity 是一套跨平台的游戏引擎,可用于开发 Windows、MacOS、Linux 平台的单机游戏,或是 iOS、Android 移动设备的游戏。Unity 也可开发支持 WebGL 技术的网页游戏,或 PlayStation、XBox、Wii 主机上的游戏。
Unity 支持 PhysX 物理引擎、粒子系统,并且提供网络多人连接的功能,无需学习复杂的编程语言,匹配游戏制作上的各项需求。Unity 的推出降低游戏开发的门槛,即使是个人或小型团队制作游戏也不再是梦想。对于游戏公司而言,选择使用 Unity 引擎也可以缩短游戏的开发时间。
Unity 类似于Director,Blender,Virtools或Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows和Mac OS X下,可发布游戏至Windows、Wii、OSX或iOS平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac widgets所支持。
Unity3D是一个用于创建诸如三维电子游戏、建筑可视化、实时三维动画等类型互动内容的综合型创作工具。
设计
首先切换到2D模式,然后新建Canvas对象background作为背景,为了加上背景图,新建一个Image组件。UGUI用到的图片是Sprite类型的,导入图片后要改成Sprite类型。
再加上两个Image对象left、right作为背包背景,标签设置为bag。
为了便于布局,加上Grid Layout Group组件。在其下新建一些Image对象cell作为放置物品的格子,标签设置为cell。
对于cell对象,加上Grid Layout Group组件限制物品的位置和大小。
在其下新建Image对象作为物品。
为物品添加代码
为了使物品可以点击拖动放下,需要实现EventSystems的IDragHandler,IPointerDownHandler,IPointerUpHandler
这三个接口对应的方法。
void OnDrag (PointerEventData eventData);
void OnPointerDown (PointerEventData eventData);
void OnPointerDown (PointerEventData eventData);
先实现拖动和点击缩小。
public void OnDrag(PointerEventData eventData) {
transform.position = Input.mousePosition;
}
public void OnPointerDown(PointerEventData eventData) {
transform.localScale = new Vector3 (0.8f, 0.8f, 0.8f);
}
public void OnPointerUp(PointerEventData eventData) {
transform.localScale = new Vector3 (1f, 1f, 1f);
}
为了使鼠标松开时判断所处位置,通过射线获得下一层该位置的对象,因为射线被物品本身挡到,先要设置自身 Canvas Groupd 的 Blocks Raycasts 为false,让 event trigger 忽略自身,才可以让 event trigger 检测到它下面一层的对象。
为了使拖动时使物品一直处于顶层不被其他对象挡到,需要在拖动时将物品的父对象设为最上级的background。
最终代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class item : MonoBehaviour,IDragHandler,IPointerDownHandler,IPointerUpHandler {
public GameObject background;
public GameObject cell;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void OnDrag(PointerEventData eventData) {
transform.position = Input.mousePosition;
transform.SetParent (background.transform);
}
public void OnPointerDown(PointerEventData eventData) {
transform.localScale = new Vector3 (0.8f, 0.8f, 0.8f);
transform.GetComponent<CanvasGroup> ().blocksRaycasts = false;
}
public void OnPointerUp(PointerEventData eventData) {
transform.localScale = new Vector3 (1f, 1f, 1f);
GameObject p = eventData.pointerCurrentRaycast.gameObject;
if (p.tag == "cell")
transform.SetParent (p.transform);
else if (p.tag == "item") {
transform.SetParent (p.transform.parent.transform);
p.transform.SetParent (cell.transform);
p.GetComponent<item> ().cell = p.transform.parent.gameObject;
}
else
transform.parent = cell.transform;
cell = transform.parent.gameObject;
transform.GetComponent<CanvasGroup> ().blocksRaycasts = true;
}
}
上一篇: HashMap实现原理解读