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;
    }
}

猜你喜欢

转载自blog.csdn.net/z_j_q_/article/details/80575605