2018-04-10 16:06:12 qq_33994566 阅读数 1414
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    做移动端UI自适应的适合我们经常要设置锚点。UI量很多的时候我们一点点设置很糟心。下面我们扩展了unity编译器的功能,可以一键设置锚点。效果如下:

    代码要放在Editor文件夹下才能被我们编译器运行。代码如下:

    //一键设置锚点
    [MenuItem("CONTEXT/RectTransform/SetAnchors")]
    public static void SetAnchors(MenuCommand mc)
    {
        RectTransform trans = mc.context as RectTransform;
        RectTransform parent = null;
        try
        {
            parent = trans.parent.GetComponent<RectTransform>();
        }
        catch (Exception ex)
        {
            Debug.Log("不能在Canvas上操作!");
            return;
        }
        float w = parent.rect.width;
        float h = parent.rect.height;
        float minX = trans.anchoredPosition.x - trans.rect.width / 2f;
        float minY = trans.anchoredPosition.y - trans.rect.height / 2f;
        float maxX = trans.anchoredPosition.x + trans.rect.width / 2f;
        float maxY = trans.anchoredPosition.y + trans.rect.height / 2f;
        minX /= w;
        minX += 0.5f;
        minY /= h;
        minY += 0.5f;
        maxX /= w;
        maxX += 0.5f;
        maxY /= h;
        maxY += 0.5f;

        trans.anchorMax = new Vector2(maxX, maxY);
        trans.anchorMin = new Vector2(minX, minY);
        trans.anchorMax = new Vector2(maxX, maxY);

        trans.offsetMin = Vector2.zero;
        trans.offsetMax = Vector2.zero;
    }
    public static Vector2 GetMainGameViewSize()
    {
        Type T = Type.GetType("UnityEditor.GameView,UnityEditor");
        MethodInfo GetSizeOfMainGameView = T.GetMethod("GetSizeOfMainGameView", BindingFlags.NonPublic | BindingFlags.Static);
        System.Object Res = GetSizeOfMainGameView.Invoke(null, null);
        return (Vector2)Res;
    }

    如果本博客对你有帮助,记得点关注哦!

2017-12-13 13:16:30 pz789as 阅读数 7853
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

unity自己出了UGUI之后,方便UI界面的编辑使用,再也不用其他插件了,最近看到了RectTransform的两个方法,使用起来还是蛮方便的,因为在做UI的list的时候,经常要做的是在代码里面生成列表的元素,所以就用到了我下面说的两个方法:

SetInsetAndSizeFromParentEdge
SetSizeWithCurrentAnchors

第一个是根据边来设置坐标,有四个值:Top、Bottom、Left、Right。

第二个是根据方向设置坐标,有两个值:Horizontal、Vertical。

先来说第一个函数,有三个参数:

第一个是一个Edge类型的值,需要指定以父对象的哪个边为基准(也就是上面四个值之中的一个);

第二个参数,是离指定边的距离;

第三个参数,是本身的宽度或者高度;

这样通过设置上下边和左右边来设置子物体的位置和宽高就可以了。


第二个函数,有两个参数:

第一个是Axis类型的值,需要指定一个方向,水平或者垂直;

第二个参数,是本身的宽高;

我这里写了几个静态函数,可以参考下用法:

/// <summary>
    /// 调整 RectTransform 组件中的 Left、Bottom 属性
    /// </summary>
    /// <param name="rt">引用目标 RectTransform 对象</param>
    /// <param name="left">Left值</param>
    /// <param name="bottom">Bottom值</param>
    public static void LeftBottom(RectTransform rt, float left, float bottom) {
        // float value1 = rt.offsetMax.x + left;
        // float value2 = rt.offsetMax.y + bottom;

        // rt.offsetMin = new Vector2(left, bottom);
        // rt.offsetMax = new Vector2(rt.offsetMax.x + value1, rt.offsetMax.y + value2);

		Vector2 size = rt.rect.size;
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, left, size.x);
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, bottom, size.y);
    }
    /// <summary>
    /// 调整 RectTransform 组件中的 Left、Top 属性
    /// </summary>
    /// <param name="rt"></param>
    /// <param name="left">Left值</param>
    /// <param name="top">Top值</param>
    public static void LeftTop(RectTransform rt, float left, float top) {
        // float value1 = rt.offsetMin.y - top;
        // float value2 = rt.offsetMax.x + left;
        // Debug.Log(value1);
        // Debug.Log(value2);

        // rt.offsetMin = new Vector2(left, rt.offsetMin.y + value1);
        // rt.offsetMax = new Vector2(rt.offsetMax.x + value2, -top);

		Vector2 size = rt.rect.size;
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, left, size.x);
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, top, size.y);
    }
    /// <summary>
    /// 调整 RectTransform 组件中的 Right、Bottom 属性
    /// </summary>
    /// <param name="rt"></param>
    /// <param name="right">Right值</param>
    /// <param name="bottom">Bottom值</param>
    public static void RightBottom(RectTransform rt, float right, float bottom) {
        // float value1 = rt.offsetMin.x - right;
        // float value2 = rt.offsetMax.y + bottom;

        // rt.offsetMin = new Vector2(rt.offsetMin.x + value1, bottom);
        // rt.offsetMax = new Vector2(-right, rt.offsetMax.y + value2);

		Vector2 size = rt.rect.size;
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, right, size.x);
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, bottom, size.y);
    }
    /// <summary>
    /// 调整 RectTransform 组件中的 Right、Top 属性
    /// </summary>
    /// <param name="rt"></param>
    /// <param name="right">Right值</param>
    /// <param name="top">Top值</param>
    public static void RightTop(RectTransform rt, float right, float top) {
        // float value1 = rt.offsetMin.x - right;
        // float value2 = rt.offsetMin.y - top;

        // rt.offsetMin = new Vector2(rt.offsetMin.x + value1, rt.offsetMin.y + value2);
        // rt.offsetMax = new Vector2(-right, -top);

		Vector2 size = rt.rect.size;
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, right, size.x);
		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, top, size.y);
    }
	public static void Center(RectTransform rt, float x, float y){
		Vector2 size = rt.rect.size;
		rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x);
		rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y);
		rt.localPosition = new Vector2(x, y);
	}


另外,有个朋友提出另一种方法,通过设置offsetMin和offsetMax来达到目的,这个比较复杂,他自己写了四个基本类型的(分别是距离四个边的位置),可以根据这个自己再进行拓展:

/// <summary>
    /// 调整 RectTransform 组件中的 Left 属性
    /// </summary>
    /// <param name="rt">引用目标 RectTransform 对象</param>
    /// <param name="left">Left值</param>
    public static void Left(RectTransform rt, float left) {
        if (left < rt.offsetMin.x) {
            float value = rt.offsetMin.x - left;
            
            rt.offsetMin = new Vector2(left, rt.offsetMin.y);
            rt.offsetMax = new Vector2(rt.offsetMax.x - value, rt.offsetMax.y);
        } else if (left > rt.offsetMin.x) {
            float value = left - rt.offsetMin.x;
            
            rt.offsetMin = new Vector2(left, rt.offsetMin.y);
            rt.offsetMax = new Vector2(rt.offsetMax.x + value, rt.offsetMax.y);
        }
    }

    /// <summary>
    /// 调整 RectTransform 组件中的 Right 属性
    /// </summary>
    /// <param name="rt">引用目标 RectTransform 对象</param>
    /// <param name="left">Right值</param>
    public static void Right(RectTransform rt, float right) {
        if (right < -rt.offsetMax.x) {
            float value = -rt.offsetMax.x - right;
            
            rt.offsetMin = new Vector2(rt.offsetMin.x + value, rt.offsetMin.y);
            rt.offsetMax = new Vector2(-right, rt.offsetMax.y);
        } else if (right > -rt.offsetMax.x) {
            float value = right + rt.offsetMax.x;

            rt.offsetMin = new Vector2(rt.offsetMin.x - value, rt.offsetMin.y);
            rt.offsetMax = new Vector2(-right, rt.offsetMax.y);
        }
    }

    /// <summary>
    /// 调整 RectTransform 组件中的 Top 属性
    /// </summary>
    /// <param name="rt">引用目标 RectTransform 对象</param>
    /// <param name="left">Top值</param>
    public static void Top(RectTransform rt, float top) {
        if (top < -rt.offsetMax.y) {
            float value = -rt.offsetMax.y - top;

            rt.offsetMin = new Vector2(rt.offsetMin.x, rt.offsetMin.y + value);
            rt.offsetMax = new Vector2(rt.offsetMax.x, -top);
        } else if (top > -rt.offsetMax.y) {
            float value = top + rt.offsetMax.y;

            rt.offsetMin = new Vector2(rt.offsetMin.x, rt.offsetMin.y - value);
            rt.offsetMax = new Vector2(rt.offsetMax.x, -top);
        }
    }

    /// <summary>
    /// 调整 RectTransform 组件中的 Bottom 属性
    /// </summary>
    /// <param name="rt">引用目标 RectTransform 对象</param>
    /// <param name="left">Bottom值</param>
    public static void Bottom(RectTransform rt, float bottom) {
        if (bottom < rt.offsetMin.y) {
            float value = rt.offsetMin.y - bottom;
            
            rt.offsetMin = new Vector2(rt.offsetMin.x, bottom);
            rt.offsetMax = new Vector2(rt.offsetMax.x, rt.offsetMax.y - value);
        } else if (bottom > rt.offsetMin.y) {
            float value = bottom - rt.offsetMin.y;

            rt.offsetMin = new Vector2(rt.offsetMin.x, bottom);
            rt.offsetMax = new Vector2(rt.offsetMax.x, rt.offsetMax.y + value);
        }
    }



2018-10-02 17:32:04 u012613276 阅读数 250
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

偶然发现unity3D一个不需要脚本2D UGUI自适应屏幕。(小哥是unity3D新入门菜鸟。。。)

在这里插入图片描述首先创建5个button

然后Main Camera和Canvas的设置
在这里插入图片描述

在这里插入图片描述

然后把5个button各自的锚点拖到各自的4个角上
在这里插入图片描述

这样在不同分辨率下button大小会自适应(真机上没试过。。。)

1280X720
在这里插入图片描述

1920X1080在这里插入图片描述

1024X768
在这里插入图片描述

BUTTON里的字体大小不变。。。可以用代码手动修改Text字体大小或者Text勾选Best Fit或者用文字图片代替?希望对大家有所帮助!

2019-06-04 11:10:59 songhuanfei2017 阅读数 309
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

简单的UI制作

其中的ImageBg的锚点

其中的ImagePoint的锚点

代码

using UnityEngine;
using UnityEngine.EventSystems;

public class JoystickUI : UIBase
{
    private RectTransform ImageBg;
    private RectTransform ImagePoint;
    private float radius = 100;
    private Vector2 imageBackPos;
    private void Awake()
    {
        InitUI();
    }
    public override void InitUI()
    {
        ImageBg = GetComp<RectTransform>("ImageBg");
        ImagePoint = GetComp<RectTransform>("ImagePoint");
        imageBackPos = ImageBg.anchoredPosition;
        UIEvent.Get(gameObject).OnPointerDownCallBack = OnJoystickDown;
        UIEvent.Get(gameObject).OnDragCallBack = OnJoystickDrag;
        UIEvent.Get(gameObject).OnPointerUpCallBack = OnJoystickUp;
    }
    public void SetRadius(float radius)
    {
        this.radius = radius;
    }
    private void OnJoystickDown(PointerEventData e)
    {
        ImageBg.anchoredPosition = e.position;
    }
    private void OnJoystickDrag(PointerEventData e)
    {
        Vector2 vector2 = e.position - ImageBg.anchoredPosition;
        ImagePoint.anchoredPosition = vector2;
        if (vector2.magnitude > radius)
        {
            ImagePoint.anchoredPosition = vector2.normalized * radius;
        }
        //Debug.Log(ImagePoint.anchoredPosition.normalized.ToString());
        //Debug.Log(ImagePoint.anchoredPosition.magnitude / radius);
        //--callback
    }
    private void OnJoystickUp(PointerEventData e)
    {
        ImageBg.anchoredPosition = imageBackPos;
        ImagePoint.anchoredPosition = Vector2.zero;
    }
}

加一个回调,让控制的物体移动起来。

UIBase,UIEvent等在我的其他文章里写的,可以看看。

这里有类似的,解决了一些问题。

2017-07-17 21:07:45 qq_34185630 阅读数 1149
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

今天看了下UGUI的教程,实在太棒了。不过学了个囫囵吞枣。事件处理源码啥的都没心思看下去。具体总结下今天学的:

1.锚点和中心点问题:简单点说就是,锚点四个花瓣在一个点时,中心点的坐标;不在一个点时,中心点和花瓣所组成边框的距离

2.点击事件处理,button可以在OnClick,添加方法。Image等组件可以在EventTrigger设置。也可通过编写类实现以下接口实现。

using UnityEngine.EventSystem

IPointEnterHandler,IPointExitHandler,IPointDownHandler,IPointUpHandler,IPointClickHandler,IDragHandler

IDropHandler,IScrollHandler,IUpdateSelectedHandler,ISelectHandler,IDeselectHandler,IMoveHandler

简单的写了一个鼠标拖动图片的小脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class drag:BeHaviour,IDragHandler,IDropHandler{
	private RectTransform rt;
 	public RectTransform canvas;
	Vector2 firstpos=new Vector2();
 	private bool isfirst=true;
 	void Start()
 	{
 		rt=transform as RectTransform;
 	}
 	public void OnDrag(PointsDates eventData)
	{
 		Vector2 mousepos = eventData.position;
  		Vector2 uguipos = new Vector2();
  		bool isrect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas,mousepos,eventData.enterEventCamera,out uguipos);
  		if(isfirst)
  		{
    			isfirst=false;
    			RectTransformUtility.ScreenPointToLocalPointRectangle(rt,mousepos,eventData.enterEventCamera,out firstpos);
  		}
		if (isrect)
        	{
           		 //rt.pivot = uguipos;
            		rt.anchoredPosition = uguipos-firstpos;
        	}
	}
	void Update () {
  
 	}
    	public void OnDrop(PointerEventData eventData)
   	{
        	isfirst = true; 
    	}
}

3.点击按钮显示背包等界面

public void onBtClick()
{
    RectTransform package = Instantiate(packageclone);//生成界面
    package.SetParent(this.transform.parent);//改变parent
    package.position = new Vector3(0, 0, 0);
    package.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
    package.localScale = new Vector3(1, 1, 1);
    package.anchoredPosition = new Vector2(0, 0);//初始化大小、位置、旋转、在画布的位置等。
}

4、最难的拖拽功能,看的迷迷糊糊的,没练习。

抓取物体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;   
public class dragItem : MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler {

    // Use this for initialization
    public dragPanelitem dragItempanel;
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
    public void OnDrag(PointerEventData eventData)
    {
        if (dragItempanel != null)
        {
            dragItempanel.move(eventData);//移动物体
        }
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        if (dragItempanel != null)
        {
            dragItempanel.hideItem();//将Image隐藏
        }
    }
    public void OnEndDrag(PointerEventData eventData)
    {
        if (dragItempanel != null)
        {
            dragItempanel.setDragItemID(1);//获取抓取的物体
        }
    }
}

单独定义一个panel,用于存储抓取的物体。并对其操作


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class dragPanelitem : MonoBehaviour {
    private int DragitemID = 0;     public Image dragimage; // Use this for initialization   void Start () {      }   // Update is called once per frame   void Update () {     }     public void move(PointerEventData eventData)     {         dragimage.rectTransform.position = eventData.position;//因为父容器铺满四周,且该image锚点在父容器中心点位置。可以不用转换坐标     }     public void setDragItemID(int itemID)     {         DragitemID = itemID;         dragimage.gameObject.SetActive(true);//获取抓取的物体实际上少了一步,给dragimage赋值的步骤     }     public void hideItem()     {         DragitemID = 0;         dragimage.gameObject.SetActive(false);     } }


好好学习,天天向上。有志同道合的朋友可以关注下。共同进步

Unity3D之虚拟摇杆

阅读数 423

没有更多推荐了,返回首页