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 函数 ...
随机推荐
- dedecms利用addfields body在首页调用文章内容
开源程序比较好的一点是可以进行二次开发,比如ytkah想要开发一个专家出诊表的功能模块,如下图所示,每天的专家都不一样,可以用到内容模型,但是相对比较复杂:我们可以把每天的坐诊情况写成一篇文章再通过调 ...
- PHP移动互联网开发笔记(6)——MySQL数据库基础回想
近期看了一些架构方面的资料.可是发现基础知识都不怎么坚固,接下来的一段时间.我会定期总结基础知识. 一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 很小的整 ...
- beginAppearanceTransition
- (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated __OSX_AVAILABLE_STARTING ...
- ffmpeg综合应用示例(三)——安卓手机摄像头编码
本文的示例将实现:读取安卓手机摄像头数据并使用H.264编码格式实时编码保存为flv文件.示例包含了 1.编译适用于安卓平台的ffmpeg库 2.在java中通过JNI使用ffmpeg 3.读取安卓摄 ...
- myeclipse连接并运行sql文件
1:在工程目录上右键>new >SQL File ,写入sql 2:在sql文件上面右键>execute sql files 3:选择数据库类型,并点击create创建一个连接: ...
- spring boot上传 下载图片。
https://blog.csdn.net/a625013/article/details/52414470 build.gradle buildscript { repositories { mav ...
- makefile 中wildcard
在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTER ...
- Python中的类属性、实例属性与类方法、静态方法
1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...
- Andrew Ng-ML-第十章-应用机器学习的建议
1.如何改进性能不好的学习算法 图1.运用到测试集上效果不佳 当进行一个正则化线性回归时,最小化了代价函数得到参数,但是运用到新的测试集上,发现效果不好,那么如何改进? 1).增加训练集.但是实际上花 ...
- 提示'HTTP消息不可读'
1.提示下面的错误信息 2.修改后的代码,费用接口 import unittest import requests import json import HTMLTestRunner ur1 = 'h ...