Unity3D学习笔记(8) UGUI实现背包Inventory
UGUIUnity 是一套跨平台的游戏引擎,可用于开发 Windows、MacOS、Linux 平台的单机游戏,或是 iOS、Android 移动设备的游戏。Unity 也可开发支持 WebGL 技术的网页游戏,或 PlayStation、XBox、Wii 主机上的游戏。Unity 支持 PhysX 物理引擎、粒子系统,并且提供网络多人连接的功能,无需学习复杂的编程语言,匹配游戏制作上的各...
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;
}
}
更多推荐
所有评论(0)