要是那几个状态栏不能拖动的话岂不是显得太呆板了,于是我又参考Unity官方视频教程学习了如何实现拖动状态栏的功能,还挺简单的。

  比如说要拖动这个PanelStatus面板,我只让使用者通过拖动其Text组件来实现拖动整个面板移动的效果。



  只要为其Text绑定一个DragPanel.cs脚本,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class DragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler
{
private Vector2 pointerOffset;
private RectTransform rectTransformCanvas;
private RectTransform rectTransformPanel;
void Awake()
{
rectTransformCanvas = GetComponentInParent<Canvas>().transform as RectTransform;
rectTransformPanel = transform.parent as RectTransform;
}
public void OnPointerDown(PointerEventData data)
{
rectTransformPanel.SetAsLastSibling();//把该组件放到UI最前面
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransformPanel,data.position,data.pressEventCamera,out pointerOffset);
} public void OnDrag(PointerEventData data)
{
Vector2 localPointerPosition;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
rectTransformCanvas,data.position,data.pressEventCamera,out localPointerPosition))
{
rectTransformPanel.localPosition = localPointerPosition - pointerOffset;
}
} }

  大概意思就是在OnPointerDown里获取按下鼠标时鼠标指针相对于panel的位置pointerOffset,在OnDrag中获取鼠标指针相对于canvas的位置localPointerPosition,然后localPointerPosition - pointerOffset就是panel的位置了。

  固定位置的组件可以被拖动了,效果如下:



  有时候可能还想将这些面板给隐藏起来,于是又添加了三个按钮来控制这三个面板是否显示。直接调用控制对象的setActive即可,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; public class ButtonPanelControllerOnClick : MonoBehaviour {
public GameObject panel;//对应的面板
private bool active;//对应的面板是否被激活
private void Start()
{
active = true;
panel.SetActive(active);
GetComponent<Image>().color = Color.cyan;
}
public void OnClick()
{
active=!active;
if (active)
{
GetComponent<Image>().color = Color.cyan;
}
else {
GetComponent<Image>().color = Color.white;
}
panel.SetActive(active);
}
}

  效果如下,还挺好玩的:





  由于之前的代码里用到了FindWithTag函数,然而这个函数是找不到active为false的对象的。为了避免这种尴尬情况,我又创建了一个ObjManager对象来管理那些需要被查找的对象,将它们丢到ObjManager的脚本中存起来,以后谁要取就直接从这个脚本实例中拿就好了。

最新文章

  1. jQuery的几个应例题、JSON基础
  2. Linux 使用Crontab设置定时调用Shell文件
  3. Cocos2d-x 3.X 事件分发机制
  4. 基于Java Netty框架构建高性能的部标808协议的GPS服务器
  5. maven 常见错误解决方法
  6. Eclipse导入 appcompat,design兼容包
  7. 集群重启后启动ambari-server访问Web页面无法启动集群解决
  8. Java 编程要点之并发(Concurrency)详解
  9. [Whole Web, Nods.js, PM2] Passing environment variables to node.js using pm2
  10. -_-#【RequireJS】Define a Module
  11. 计数dp-hdu-4054-Number String
  12. 现代的新语言--Swift初探
  13. ImageMagick提取图像原始数据(ImageData/RawData)
  14. 升级旧Delphi应用转向支持手机的一个思路
  15. elasticsearch 中文分词、插件的安装和使用(一)
  16. 猴子 JDFZ模拟赛
  17. 删除Oracle用户及表空间
  18. Ubuntu中eclipse端口被占
  19. babel (二) update to v7
  20. Social Grouping for Multi-Target Tracking and Head Pose Estimation in Video(翻译)

热门文章

  1. Java8 Lambda表达式实战之方法引用(一)
  2. 使用java实现AES加密
  3. 一起来写段JS drag代码
  4. 实现动态的XML文件读写操作(依然带干货)
  5. Installing python-ldap in Ubuntu
  6. 北京Uber优步司机奖励政策(1月15日)
  7. 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM
  8. kalibr论文阅读笔记
  9. ORB-SLAM(十)LoopClosing Sim3求解
  10. Python之celery