Unity3D学习笔记(二十三):事件接口、虚拟摇杆、层级管理和背包系统
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class EventDrag : MonoBehaviour,
IDragHandler,
IDropHandler,
IBeginDragHandler,
IEndDragHandler,
IPointerEnterHandler,
IPointerUpHandler,
IPointerClickHandler
{
public void OnDrag(PointerEventData eventData)
{
Debug.Log("IDragHandler.OnDrag");
//Debug.Log("eventData.delta:" + eventData.delta);//上次执行与本次执行的鼠标偏移量
Debug.Log("eventData.scrollDelta:" + eventData.scrollDelta);//上次执行与本次执行的鼠标偏移量
}
public void OnDrop(PointerEventData eventData)
{
Debug.Log("IDropHandler.OnDrop");
}
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("IBeginDragHandler.OnBeginDrag");
}
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("IEndDragHandler.OnEndDrag");
}
public void OnPointerEnter(PointerEventData eventData)
{
//Debug.Log("eventData.delta.name" + eventData.pointerDrag.name);//报错:在鼠标进入的事件接口里,无法获得拖动的物体
}
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("当前的结果:" + eventData.pointerCurrentRaycast.gameObject.name);
Debug.Log("按下的结果:" + eventData.pointerPressRaycast.gameObject.name);
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("点击次数:" + eventData.clickCount);
}
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
} }
public void OnPointerEnter(PointerEventData eventData)
{
//Debug.Log("eventData.delta.name" + eventData.pointerDrag.name);//报错:在鼠标进入的事件接口里,无法获得拖动的物体
}
射线检测结果:按下结果和当前结果是有差别的
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("当前的结果:" + eventData.pointerCurrentRaycast.gameObject.name);
Debug.Log("按下的结果:" + eventData.pointerPressRaycast.gameObject.name);
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("点击次数:" + eventData.clickCount);
}
鼠标有球形滚轮,数值是二维的
虚拟摇杆案例
画布设置1280x720
轮盘功能
轮盘的代码逻辑
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
//1、鼠标在摇杆背景下按下的时候,需要把摇杆移动到鼠标按下的位置
//2、鼠标在拖动的时候,摇杆需要跟随鼠标移动
//3、鼠标松开的时候,摇杆回到中心位置
//4、摇杆的拖动范围是一个圆形区域
//1)、鼠标在圆形区域内,摇杆跟着鼠标移动
//2)、鼠标超出圆形区域,摇杆要在圆的边缘
//5、默认情况摇杆是隐藏的,当鼠标按下时显示,只有在屏幕左下方有效
//创建一张透明图片,在屏幕的左下方
//当在这个透明图片的区域内按下时,整个摇杆的轮盘到鼠标的位置,并且显示
//松开鼠标时,隐藏轮盘
public class Rocker : MonoBehaviour,
IDragHandler,
IPointerDownHandler,
IPointerUpHandler
{
private GameObject handler;//摇杆的句柄,也就是跟随鼠标移动的物体
private GameObject rocker;//摇杆的轮盘
private float r = 90f;//圆形区域的半径
private RectTransform handlerParent;//句柄的父物体的Rect Transform
private RectTransform rockerParent;//轮盘的父物体的Rect Transform
private Vector2 outPos;//转换之后的位置坐标
private void Awake()
{
handler = GameObject.Find("HandlerBig/HandlerSmall");
rocker = GameObject.Find("HandlerBig"); ;
//找到父物体的Rect Transform
handlerParent = handler.transform.parent as RectTransform;
rockerParent = handler.transform.parent as RectTransform;
}
public void OnDrag(PointerEventData eventData)
{
//拖动时,遥感句柄跟随鼠标移动
MoveHandler(eventData);
}
public void OnPointerDown(PointerEventData eventData)
{
PlayerMove.movespeed = 0.1f;
//按下时,轮盘显示,轮盘到鼠标的位置,同时轮盘在鼠标的位置
rocker.SetActive(true);
//转换轮盘的坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
rockerParent,
eventData.position,
eventData.pressEventCamera,
out outPos
))
{
rocker.transform.localPosition = outPos;
}
//按下时,遥感句柄移到鼠标位置
MoveHandler(eventData);
}
public void OnPointerUp(PointerEventData eventData)
{
//抬起时,轮盘隐藏
rocker.SetActive(false);
//抬起时,遥感句柄回到中心位置
rocker.transform.localPosition = Vector3.zero;
PlayerMove.movespeed = 0f;
}
/// <summary>
/// 封装好的移动句柄的方法
/// </summary>
/// <param name="eventData"></param>
void MoveHandler(PointerEventData eventData)
{
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
handlerParent,
eventData.position,
eventData.pressEventCamera,
out outPos
))
{
//判断鼠标在圆内还是圆外,通过圆的中心点指向鼠标点的向量的模长来判断
//1、计算圆心指向鼠标向量的模长
//Vector2 temp = outPos - Vector.zero;//outPos就是从圆心指向鼠标的向量
if (outPos.magnitude >= r)
{
//计算圆心指向鼠标的方向 outPos.normalized
//最终位置 - 原点位置 + 在圆心指向鼠标的方向上,移动半径个距离的向量
//Vector2 temp = outPos.normalized * r + Vector3.zero;
Vector2 temp = outPos.normalized * r;
handler.transform.localPosition = temp;
}
else
{
handler.transform.localPosition = outPos;
}
}
}
// Use this for initialization
void Start()
{
rocker.SetActive(false);//默认隐藏
}
// Update is called once per frame
void Update()
{
}
}
移动的代码逻辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour {
public static float movespeed = 0.1f;
public GameObject handler;//遥感句柄
private Vector3 moveDir;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
//计算圆心指向摇杆的向量
//Vector3 temp = handler.transform.localPosition - Vector3.zero;
//temp = handler.transform.localPosition
moveDir.x = handler.transform.localPosition.x;
moveDir.y = ;
moveDir.z = handler.transform.localPosition.y;
transform.Translate(moveDir * Time.deltaTime * movespeed);
}
}
层级管理
代码操作层级
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LayerManager : MonoBehaviour {
private GameObject red;
private GameObject yellow;
private GameObject blue;
// Use this for initialization
void Start () {
red = GameObject.Find("Red");
yellow = GameObject.Find("Yellow");
blue = GameObject.Find("Blue");
//red.transform.SetSiblingIndex(2);
int temp = red.transform.GetSiblingIndex();
red.transform.SetSiblingIndex(blue.transform.GetSiblingIndex());
blue.transform.SetSiblingIndex(temp);
} // Update is called once per frame
void Update () { }
}
背包拖动
拖动的代码逻辑
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
//1、控制物品的拖动
//2、显示物品
public class GridUI : MonoBehaviour,
IDragHandler,
IBeginDragHandler,
IEndDragHandler
{
public Transform tempParent;//临时的父节点
public string imageName;//物体图片的名字,如果名字不为“”时有物品,为“”时没有物品
private Image image;//显示物品的组件,拖动的也是他
private RectTransform imageParent;
private Vector2 outPos;
private Vector2 offSet;//鼠标开始拖动时,距离图片中心点的偏移量
private void Awake()
{
image = transform.Find("Image").GetComponent<Image>();
image.raycastTarget = false;//关闭image的射线检测,避免挡住Grid
imageParent = tempParent as RectTransform;
}
public void OnDrag(PointerEventData eventData)
{
if (imageName == "")
{
return;
}
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
imageParent,
eventData.position,
eventData.enterEventCamera,
out outPos
))
{
image.transform.localPosition = outPos - offSet;
}
}
public void OnBeginDrag(PointerEventData eventData)
{
if (imageName == "")
{
return;
}
//开始时,把图片放在临时的父节点上,保证拖动的图片永远显示在最前面
image.transform.parent = tempParent;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
imageParent,
eventData.position,
eventData.enterEventCamera,
out outPos
))
{
//计算鼠标距离图片中心点的偏移量
offSet = outPos - new Vector2(image.transform.localPosition.x, image.transform.localPosition.y);
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (imageName == "")
{
return;
}
//结束时,需要把图片的父节点还原,位置也需要归零
image.transform.parent = transform;
//image.transform.SetParent(transform);
image.transform.localPosition = Vector3.zero;
//拖动结束时,判断当前的鼠标位置是否在格子上
if (eventData.pointerCurrentRaycast.gameObject != null &&
eventData.pointerCurrentRaycast.gameObject.CompareTag("Grid"))
{
Debug.Log("格子:" + eventData.pointerCurrentRaycast.gameObject.name);
//把自己的图片给对方,把对方的拿过来
GridUI target = eventData.pointerCurrentRaycast.gameObject.GetComponent<GridUI>();
//把自己的图片名字设置给目标,temp就是对方的图片名字
string temp = target.SetSpriteName(this.imageName);
//然后把对方的图片名字设置给自己
this.SetSpriteName(temp);
}
else
{
Debug.Log("不是格子");
}
}
void UpdateItem()
{
if (imageName == "")
{
image.enabled = false;
}
else
{
image.enabled = true;
if (image.sprite.name != imageName)
{
Sprite sp = Resources.Load<Sprite>("Backpack/ICon/" + imageName);
image.sprite = sp;
}
}
}
//设置自己图片的名字,返回值是之前的名字
public string SetSpriteName(string str)
{
string before = imageName;
imageName = str;
UpdateItem();
return before;
}
// Use this for initialization
void Start()
{
UpdateItem();
}
// Update is called once per frame
void Update()
{
}
}
拖动的临时父节点,保证图片在最上方显示
添加Grid标签
给图片添加名字
Unity3D学习笔记(二十三):事件接口、虚拟摇杆、层级管理和背包系统的更多相关文章
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- 微信小程序学习笔记二 数据绑定 + 事件绑定
微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...
- Unity3D学习笔记(十三):委托、考试复习
委托:比较什么时候用委托好 下课案例:不用下课铃 1.ClassManager需要拿到所有教室的引用,课堂管理者应该只负责计时并告知每间教室 2.每间教室应该是由当班老师负责是否需要下课,而课堂管 ...
- (C/C++学习笔记) 二十三. 运行时类型识别
二十三. 运行时类型识别 ● 定义 运行时类型识别(Run-time Type Identification, RTTI) 通过RTTI, 程序能够使用基类的指针或引用来检查(check)这些指针或引 ...
- Java基础学习笔记二十三 Java核心语法之反射
类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...
- angular学习笔记(二十三)-$http(1)-api
之前说到的$http.get和$http.post,都是基于$http的快捷方式.下面来说说完整的$http: $http(config) $http接受一个json格式的参数config: conf ...
- PHP学习笔记二十三【This】
<?php Class Person { function test1() { $this->test2();//类里面的方法互相调用要加$this } protected functio ...
- Java学习笔记二十三:Java的继承初始化顺序
Java的继承初始化顺序 当使用继承这个特性时,程序是如何执行的: 继承的初始化顺序 1.初始化父类再初始子类 2.先执行初始化对象中属性,再执行构造方法中的初始化 当使用继承这个特性时,程序是如何执 ...
- 学习笔记二十三——字符函数库cctype【转】
本文转载自: 字符函数库cctype 在头文件cctype(ctype.h)中定义了一些函数原型,可以简化输入确定字符是否为大写字母.数字.标点符号等工作. 例如: 如果ch是一个字母,则isalph ...
- 学习笔记:CentOS7学习之二十三: 跳出循环-shift参数左移-函数的使用
目录 学习笔记:CentOS7学习之二十三: 跳出循环-shift参数左移-函数的使用 23.1 跳出循环 23.1.1 break和continue 23.2 Shift参数左移指令 23.3 函数 ...
随机推荐
- 读取Linux上图片
/** * 读取图片 * @param path * @param response * @throws Exception */ public static void showImg(String ...
- visual studio code 编辑器的配置及快捷键等, vscode, csc
visual studio code (vsc) 对开发node.js,javascript,python,html,golang等比较友好,同时支持git浏览及分屏对比,运行速度快,所以是值得一用的 ...
- windows使用方法
1:截图搜索英文单词:snipping tool 2: 修改语言,搜索language 3:关闭fn键,按键 fn+esc(fnlock). 就可以将fn关闭和开启.
- python对象反射和函数反射
python的对象反射功能,经常在编程时使用.相比较其它的编程语言使用非常方便.反射就是用字符串来操作对象或者类,模块中的成员. 一.对象的反射 反射功能的实现,由这4个内置函数来实现(hasattr ...
- Fuzzy and fun on Air Jordan 12 Doernbecher design
Carissa Navarro keeps it warm, fuzzy and fun on her 2017 Air Jordan 12 Doernbecher design. Nike's 20 ...
- 更高效的MergeSort--稍微优化
0. 简介 本文简要介绍一下比传统MergeSort更高效的算法,在原来的算法Merge基础上,少发生一半拷贝.欢迎探讨,感谢阅读. 原文链接如下:http://loverszhaokai.com/p ...
- 【安装vsftpd】安装vsftpd工具步骤
1 安装vsftpd组件 [root@bogon ~]# yum -y install vsftpd 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件. 2 添 ...
- 分布式一致性Hash
转载: https://blog.csdn.net/bntX2jSQfEHy7/article/details/79549368 为什么要有Hash一致性算法?就像以前介绍为什么要有Spring一样, ...
- Python: str.split()和re.split()的区别
str.split() 单一分隔符,使用str.split()即可 str.split不支持正则及多个切割符号,不感知空格的数量 re.split() 多个分隔符,复杂的分隔情况,使用re.split ...
- python在交互模式下直接输入对象后回车,调用的是对象的__repr__()方法,这个方法表示的是一个编码,用print+对象是调用对象的__str__方法
交互模式下调用对象的__repr__()方法,这个方法表示的是一个编码 >>> u"国庆节快乐"u'\u56fd\u5e86\u8282\u5feb\u4e50' ...