• Unity3d 5 官方教程:UI

    2017-03-29 23:30:12
    本篇是对UnityUI系统主要特性的介绍。 相关教程:用户界面CanvasCanvas是所有UI元素应当存放于内的区域。Canvas是一个有Canvas组件的游戏对象,并且所有UI对象必须是这样一个Canvas对象的子对象。

    UI


    UI系统允许用户迅速且直观地创建用户界面。本篇是对Unity的UI系统主要特性的介绍。
    相关教程:用户界面

    Canvas

    Canvas是所有UI元素应当存放于内的区域。Canvas是一个有Canvas组件的游戏对象,并且所有UI对象必须是这样一个Canvas对象的子对象。
    创建一个新的UI元素,例如使用 GameObjct>UI>Image,创建一个Image对象,会自动地创建一个Canvas,如果场景里没有已存在的Canvas。UI元素将作为这个Canvas的子对象创建。
    Canvas区域会在场景视图中显示为一个矩形。这使得它容易放置UI元素而不需要一直保持在游戏视图。
    Canvas使用EventSystem(事件系统)对象来帮助Messaging System(消息系统)、

    元素的绘制顺序

    在Canvas中的UI元素,以它们出现在层次中的顺序被绘制。第一个子对象被先渲染,然后第二个,以此类推。如果两个UI元素重叠,后一个将出现在前一个上上面。
    要改变某个元素出现在另外元素的上面,只要通过拖拽它们改变在层次中的顺序几个。通过使用在Transform组件中的这些方法,也可以从脚本中控制顺序:SetAsFirstSibling, SetAsLastSibling, 以及SetSiblingIndex 。

    渲染模式

    Canvas有渲染模式设置,可以用来让Canvas在屏幕空间或世界空间中渲染。

    屏幕空间 - 覆盖

    这个渲染模式将渲染的UI元素放置在场景的最上面(最靠近镜头)。如果屏幕被重新调整大小或调整分辨率,Canvas将自动改变尺寸以适应。
    屏幕空间覆盖Canvas

    屏幕空间 - 摄像机

    这个模式类似于“屏幕空间 - 覆盖”,但在这个渲染模式下,Canvas被放置在指定摄像机的一个给定距离前。UI元素用这个摄像机渲染,意味着摄像机设置将印象到UI的表现。如果摄像机被设置为透视的,UI元素将会以透视渲染,并且透视变形可以被摄像机视野区所控制。如果屏幕被重设大小或改变分辨率,或者摄像机frustrum 改变,Canvas同样将自动改变设置以匹配。
    UI in screen space camera canvas

    世界空间

    在这个渲染模式下,Canvas将如场景中其它的对象那样。Canvas的尺寸可以用它的矩形transform进行手动设置,UI元素会在场景中其它对象的前面或后面渲染,基于三维空间中的位置关系。这在UI元素被定义为世界一部分时有用。这也被称为“剧情界面”(diagetic interface)。
    UI in world space canvas

    基本布局

    这一部分我们将看看,元素关联到Canvas及相互间,应如何放置。如果用户希望在阅读时自己测试,可以创建一个Image(GameObject ->UI -> Image)。

    矩形工具

    为了布局考虑,每个UI元素用一个矩形所表示。这个矩形可以在场景视图中用工具栏中的矩形工具处理。矩形工具可以被Uinity的2D特性和UI所使用,实际上也可以用于3D对象。
    这里写图片描述

    矩形工具可以用来移动,重设大小,旋转UI元素。一旦选择了一个UI元素,可以通过点击矩形内的任何位置并拖拽它来移动。用户可以通过点击边缘或角落并拖拽来调整大小。元素可以被旋转通过将指针悬停在角落附近,直到鼠标指针看起来像个旋转记号。然后可以点击并向任意方向旋转。
    就像其它工具,矩形工具使用当前的当前的枢轴模式和空间,在工具栏中设置。当对UI进行工作,通常将这些设置为PivotLocal
    这里写图片描述

    矩形变换

    矩形变换是一个新的变换组件;对所有UI元素,取代了标准的变换组件。
    这里写图片描述

    重设相对缩放

    当矩形工具被用于改变对象的大小时,通常对于二维系统和三维对象,它将改变对象的局部缩放。然而,当被用于一个有矩形变换的对象时,改变的是宽度和高度,保持局部缩放不变。这样的重设大小将不影响字体尺寸、镶边等。

    轴Pivot

    旋转,尺寸,缩放的调整是围绕着轴的;所以轴的位置影响着旋转、尺寸或缩放的效果。当工具栏上Pivot按钮被设置为Pivot模式,矩形变换的轴会被移入场景视图。

    这里写图片描述

    定位Anchors

    矩形变换包括称为“定位”的一个布局概念。定位以四个在场景视图中的小直角柄所表示,定位信息在检视器中显示。
    如果矩形变换的父对象同样是个矩形变换,那么子举行变换可以若干种途径被定位到父对象。例如,子对象可以定位到父对象的中心,或者一个角落。
    UI element anchored to the center of the parent. The element maintains a fixed offset to the center.

    UI element anchored to the lower right corner of the parent. The element maintains a fixed offset to the lower right corner.
    定位也允许子对象随着父对象宽度、高度一同伸缩。每个矩形的角落相对它对应的定位有固定的偏移,即矩形的左上角有对左上定位有固定的偏移,等等。这种方式下,矩形不同角落而可以被定位到父对象矩形的不同点。
    UI element with left corners anchored to lower left corner of the parent and right corners anchored to lower right. The corners of the element maintains fixed offsets to their respective anchors.
    定位的位置用父对象矩形宽度及高度的分数(或百分比)来定义。0.0(0%)对应于左边或底边,0.5(50%)为中间,1.0(100%)为右边或顶部。但定位不限制于边沿或中间;可以定位到父对象矩形的任何位置。
    UI element with left corners anchored to a point a certain percentage from the left side of the parent and right corners anchored to a point a certain percentage from the right side of the parent rectangle.

    用户可以分别拖拽每个定位,或如果它们是一起的,用户可以通过点击它们中间并拖拽,让它们一起移动。如果在拖拽一个定位时按下Shift键,矩形对应的角将随着定位一起移动。
    定位柄一个有用的特性是,它们自动对齐到兄弟对象矩形,来允许精确的定位。

    定位预设

    在检视器中,定位预设按钮可以矩形变换组件的在左上角找到。点击此按钮让定位预设下拉。从这里用户可以快速选择一些最常用的定位选项。可以定位UI元素到父对象的边沿或中间,或者随着父对象的尺寸一起伸缩。水平和垂直定位是独立的。
    这里写图片描述
    定位预设按钮显示了当前如果存在的预设项。如果水平或垂直轴的定位被设置到预设不同与预设的任何位置,则显示用户定义的选择。

    检视器你中的定位和位置区

    可以点击定位扩大箭头来显示定位数字区,如果它们尚未可见。最小定位对应于在场景视图中的左下定位柄,最大定位对应于右上的定位柄。
    矩形的位置区根据定位是同步(这导致固定的宽度和高度)还是分开(这让矩形随着父对象矩形一同伸缩),有不同的展示。
    这里写图片描述
    当所有定位柄被同步,显示的区域是位置X、位置Y、宽度和高度。位置X和位置Y的值指明轴相对定位的位置。
    当定位是分开的,区域可以改为部分或完全到左边、右边、上部及底部。这些区域定义了在矩形内用定位定义的衬垫(?)。如果定位水平方向上分开,左边和右边的区域被使用;如果垂直方向分开,顶部和底部区域被使用。
    注意到,改变定位或轴区域中的值,通常将调整位置值,为了让矩形停留在原位置。如果不希望这样的情形,可以使用在检视器中一个小按钮来启用Raw模式。这让定位和轴的值可以被改变,而不是任何其他值改变所导致的结果。这将让矩形被可看到地移动或重设大小,因为它的位置和尺寸依赖于定位和轴的值。

    视觉组件

    在UI系统的介绍中,会帮助你创建有特定功能的GUI的新组件已经添加。这一部分是关于可以被创建的新组件的基本知识。

    文本

    这里写图片描述
    Text(文本)组件,也被作为“标签”,其文本区来输入被显示的文字。可以设置字体、风格、字号以及是否具有富文本功能。
    文本的对齐方式有多种选项,控制文本比矩形的宽度或高度更长时会发生什么的水平和垂直溢出设置,并且最佳匹配选项使得文本会重设大小来适应可用的空间。

    图片

    这里写图片描述
    一张图片有一个矩形变换组件及一个图片组件。一个精灵可以被应用到在目标图片区下方的图片组件,并且颜色可以在颜色区中设置。材质也可以被应用到图片组件。图片类型区定义了应用到图片的精灵如何出现,这些选项时:

    • Simple - 等量地缩放整个精灵。
    • Sliced - 利用3x3精灵分割法,这样尺寸调整不会扭曲角落,并且只有角落部分被拉伸。
    • Tiled - 类似于Sliced,但瓦片式摆放(平铺)中间部分并且不拉伸。对于完全没有边缘的精灵,整个精灵被平铺。
    • Filled - 像Simple模式那样显示精灵,但除了从原点以预定的方向、方法和数量填充精灵。
      设置本地尺寸的选项,在Simple或者Filled被选择时出现,重置图片的尺寸到原始的精灵尺寸。
      图片可以通过在纹理类型设置中选择精灵(2D/UI),被作为UI精灵导入。对比老的GUI精灵,精灵有额外的导入选项,最大的不同是精灵编辑器的增加。精灵编辑器提供了9-slicing图片的选项,将图片划分为9个区域,这样如果精灵被调整,四角不会被拉伸或扭曲。
      这里写图片描述

    原始图片

    图片组件有精灵,但原始图片是纹理(没有边缘等)。原始图片仅在必要时可以被使用,否则图片组件在大部分情况下都是适合的。

    遮罩

    遮罩(Mask)并不是可见的UI控制,然而是调整一个控制子元素外观的一种方式。遮罩根据父元素的形状限制(即所谓的“遮罩”)子元素。这样,如果子元素比父元素更大,那么,子元素只有在父元素中的那部分会可见。

    效果

    视觉组件也可以有各种简单的效果,例如简单的阴影或者轮廓线。可以查看Effect引用页来获得更多信息。

    交互组件

    这部分关于在UI系统中掌控交互的组件,例如鼠标或者触摸事件,以及使用键盘或控制器的交互。
    交互组件自身不可见,并且为了正确地工作,它必须被一个或多个可见元素所包含。

    共有功能

    大部分交互组件有相同的部分。它们是可选择的,意味着它们已经共享了:在状态(普通,高亮,按下,不可用)之间可见的切换,以及使用键盘或控制器到其它可选项的导航,这些内建功能。这些共有的功能在可选页面中描述。

    按钮

    按钮有一个点击Unity事件来定义当被点击时会做什么。
    这里写图片描述
    按钮控制 对来自用户的点击的反应,并且被用来初始化或确认一个动作。常见的例子有在网页表单中的提交和退出按钮。
    这里写图片描述

    属性

    属性 功能
    Interactable 这个组件是否接受输入?参见 Interactable。
    Transition 决定控制对用户动作反应如何可见的属性。参见Transition选项。
    Navigation 决定控制序列的属性。参见Navigation选项。

    事件

    属性 功能
    On Click 当一个用户点击并释放一个按钮时,调用一个Unity事件。

    细节

    按钮被涉及用来初始化一个动作,当用户点击并释放它。如果在松开前鼠标从按钮上移开,则不会发生动作。
    按钮有一个名为 On Click的单独事件,响应用户的一次完整点击。典型的使用情形包括:

    • 确认一个决定(例如,启动游戏或保存游戏)
    • 移动到GUI中的子菜单
    • 退出进行中的动作(例如,下载一个新场景)

    开关

    一个开关是一个决定了某一开关当前是开启或关闭的选择项。当用户点击开关时,值被改变;并且一个对勾会由此打开或关闭。同样有定义一个当值改变时就触发的OnValueChanged的Unity事件。
    这里写图片描述
    这里写图片描述

    属性

    属性 功能
    Interactable 选项是否接受输入?具体见Interactable。
    Transition 决定控制如何以可见的方式对用户动作反应的属性。参见Transition选项
    Navigation 决定控制顺序的属性。参见Navigation选项。
    Is On 选项开始时出于打开状态吗?
    Toggle Transition 当值被改变时开关图像方面的反应。选项是None(即对勾只是简单地出现或消失)和Fade(即对勾淡入或淡出)。
    Graphic 用于对勾的图像。
    Group 选项所属的选项组。

    事件

    属性 功能
    On Value Changed 当开关被点击时,调用的Unity事件。事件可以将当前的状态作为一个Bool类型的动态参数进行发送。

    细节

    开关控制允许用户对选项的开关状态进行切换。当同一时间里一系列开关中仅有一个开关能够开启时,你也可以在一个开关组中包含若干个开关。
    当用户改变当前值时,开关有一个名为 On Value Changed 的单一事件,会进行反应。新的值会作为一个布尔型参数传递给事件函数。开关典型的使用场景包括:

    • 让一个选项开启或关闭(例如,在游戏中播放音乐)。
    • 让用户确认他们已经阅读了法律免责声明。
    • 在一系列选项中选择一个(例如,一个星期中的某一日)。

    注意,开关是提供了子元素可点击区域的父元素。如果开关没有子元素(或者它们不可用),开关是不能点击的。

    开关组

    开关组可以用来将一系列互斥使用的选项形成一组。属于同一组的开关被认为,在同一时间仅有其中一个能被选中——选中它们中的一个,自动弃选其它所有的。
    这里写图片描述
    查看Toggle Group页面来获得关于开关组组件的细节。

    滑块

    滑块有个用户可以在最小值和最大值之间拖拽的十进制数值。滑块可以是水平或者垂直的。它同样也有一个定义了当值改变时如何反应的OnValueChanged的Unity事件。
    这里写图片描述

    滚动条

    滚动条有个在0到1之间的小数。当用户拖拽滚动条时,值对应地改变。
    滚动条通常与一个滚动矩形及遮罩一起使用,来创建一个滚动视图。滚动条有个在0到1之间的Size值,决定了当前部分与完整滚动条长度的比例有多大。这通常被另一个组件所控制,来指明在一个滚动视图中多少比例的内容可见。滚动矩形组件可以自动地做到这一点。
    滚动条可以是水平或者垂直的。它也有一个值被改变时定义如何执行的OnValueChanged的Unity事件。
    这里写图片描述

    下拉框

    下拉框有可以从中选择的选项列表。对于每个选项,可以指定一个文本串或一张图片来指代,并且可以在检视器里设置或者在代码中动态设置。它有一个在值被改变时,定义如何执行的OnValueChanged的Unity事件。
    这里写图片描述

    输入框

    输入框用于创建可被用户所编辑的文本元素的文本。它也有一个文本内容被改变时定义如何执行的OnValueChanged的Unity事件,以及另一个用来定义用户结束输入时如何执行的事件。
    这里写图片描述
    查看 Input Field 页面来获得关于使用输入框元素的细节。

    滚动框(滚动视图)

    一个滚动狂可在占用了大量空间的内容需要在一个小区域中显示的情况下被使用。滚动狂提供了滚动显示内容的功能。
    通常滚动框包含遮罩,以创建一个滚动视图,只有在滚动框中滚动区域的内容可见。它也可以额外地包含一个或两个滚动条,可以水平或垂直地滚动。
    这里写图片描述
    查看 Scroll Rect 页面获得更多关于滚动框组件的细节。

    展开全文
  • Unity UI显示3D模型

    2018-07-20 23:24:30
    3.在UI Root 下新建一块画布,并设置Render Mode属性为"Screen Space - Camera " 4.在画布下新建一个相机,"Clear Flags"设置为"Depth only",Projection 设置为"Orthographic&...

    1.新建一个场景

    2.新建一个空物体,作为UI的根节点

    3.在UI Root 下新建一块画布,并设置Render Mode属性为"Screen Space - Camera "

    4.在画布下新建一个相机,"Clear Flags"设置为"Depth only",Projection 设置为"Orthographic",Clipping Planes下的"Far"缩短距离为"5"

    5.设置画布的"Render Camera" 为刚创建的相机"GUI Camera"

    6.在画布下新建一个"Image",并将Pox Z 设置为"20",此时已经显示正常的UI

    7.在画布下新建一个UI组建,去掉多余部分,只留"Rect Transform",并将Pox Z 设置为"20"

    8.在新建的UI组建下新建一个3D模型,调整Scale为"100,100,100",Position设置为50

    9.已经可以显示3D模型了,Scenc下,运行时,把GUICamera放到Canvas最下面

    10,该文章参考"Unity Store"的"UltimateSurvival"的UI布局,

    展开全文
  • Unity 3D物体到UI

    2018-01-29 18:06:51
    using UnityEngine; using System.Collections; //Dotween 官方去下载 using DG.Tweening; public class UIHeart : MonoBehaviour { public Camera _uiCamera; public Transform _target;... public GameObject
    using UnityEngine;
    using System.Collections;
    //Dotween 官方去下载
    using DG.Tweening;
    public class UIHeart : MonoBehaviour {
        public Camera _uiCamera;
        public Transform _target;
        public GameObject _uiPrefab;
        // Use this for initialization
        void Start () {
            AddHeartToUI(_target.gameObject);
    
        }
    
        // Update is called once per frame
        void Update () {
    
        }
    
        void AddHeartToUI(GameObject heart)
        {
            Vector3 _pos = Camera.main.WorldToScreenPoint(heart.transform.position);
            _pos = _uiCamera.ScreenToWorldPoint(_pos);
            //这个你自己写一个
            var obj = Utility.InstantiateGO(_uiPrefab,transform.parent);
            obj.transform.position = _pos;
            obj.transform.DOMove(transform.position, 0.5f).SetDelay(2);
        }
    }
    

    总结 : 物体在3D的场景,换成屏幕坐标系,然后再换成和UI同一个坐标系,就可以在拉成的_uiPrefab 下面夹带的特效一起运动到改被添加脚本的Ui物体上

    展开全文
  • 在查找如何ui显示3d模型发现Camera的TargetTexture挺简便的,可惜一直没找导如何去渲染多个3D模型,用多个camera去做效果不是理想,于是自己写了个,但是有上限限制。对于还不会使用camera去实现的可以用以下链接...


    在查找如何ui显示3d模型发现Camera的TargetTexture挺简便的,可惜一直没找导如何去渲染多个3D模型,用多个camera去做效果不是理想,于是自己写了个,但是有上限限制,还有更好的方法请大家指正
    对于还不会使用camera去实现的可以用以下链接

    设计思路:将所有模型放在固定位置上用一个Camera,记录下一个key,TargetTexture 导在一张Texture上,通过key值去裁切RawImage 的UVRect,得到相应的图


    CameraManger 处理模型添加,及位置摆放
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    /// <summary>
    /// 3d模型展示添加管理
    /// </summary>
    public class CameraManger : MonoBehaviour
    {
        [Tooltip("横向模型显示数量")]
        public int numberWidth = 5;
        [Tooltip("纵向模型显示数量")]
        public int numberHeight = 5;
    
        static GameObject gameRuning = null;
        public static CameraManger Instance
        {
            get
            {
                if (gameRuning == null)
                {
                    return null;
                }
                return gameRuning.GetComponent<CameraManger>();
            }
        }
    
        private void Awake()
        {
            gameRuning = gameObject;
            GameObject obj = GameObject.Instantiate(Resources.Load("Model3d/Cat_Warrior") as GameObject);
            m_Object = obj;
            m_Object.SetActive(false);
    
        }
    
        GameObject m_Object;
    
        //位置坐标
        Dictionary<int, Vector3> m_Vector3List = new Dictionary<int, Vector3>();
        //位置是否被使用
        Dictionary<int, bool> m_Pos = new Dictionary<int, bool>();
        //位置对应的3d模型
        Dictionary<int, Transform> m_Trans = new Dictionary<int, Transform>();
    
        private void Start()
        {
            //初始化位置信息(模型以底部中心原点)
    
            //你设置的Camera size大小
            float _size = 6f;
    
            //模型对应镜头位置存储下来
            for (int i = 0; i < numberHeight; i++)
            {
                for (int j = 0; j < numberWidth; j++)
                {
                    float _x = -_size+(_size*2/(numberWidth))*(j+0.5f);
                    float _y = -_size + (_size * 2 / (numberHeight)) * (i);
                    Vector3 _ve3 = new Vector3(_x, _y, 12f);
                    m_Vector3List.Add((i* numberWidth + j + 1), _ve3);
                    m_Pos.Add((i * numberWidth + j + 1), true);
                }
            }
    
            GameObject obj = GameObject.Instantiate(Resources.Load("Model3d/UI") as GameObject);
    
        }
    
        /// <summary>
        /// 添加3d模型展示
        /// </summary>
        public int Add3DModel()
        {
            foreach (var var in m_Pos)
            {
                if (var.Value)
                {
                    Vector3 vector3 = m_Vector3List[var.Key];
                    m_Pos[var.Key] = false;
                    GameObject gameyouz = GameObject.Instantiate(m_Object);
                    gameyouz.SetActive(true);
                    gameyouz.transform.SetParent(transform);
                    gameyouz.transform.localPosition = vector3;
                    gameyouz.transform.rotation = Quaternion.Euler(0f, 180f, 0f);
                    m_Trans.Add(var.Key, gameyouz.transform);
                    gameyouz.name = var.Key.ToString();
    
                    return var.Key;
                }
            }
            return 0;
        }
    
        /// <summary>
        /// 获取模型
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public Transform Get3DModel(int key)
        {
            return m_Trans[key];
        }
    
        /// <summary>
        /// 删除模型展示
        /// </summary>
        /// <param name="key">模型key</param>
        public void Remove3DModel(int key)
        {
            Transform game = m_Trans[key];
            m_Trans.Remove(key);
            m_Pos[key] = true;
            GameObject.Destroy(game.gameObject);
        }
    }
    
    TextureRotate 生成Texture进行裁切
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    /// <summary>
    /// 模型ui显示
    /// </summary>
    public class TextureRotate : MonoBehaviour {
        Transform m_Horse;
        RawImage m_rawImage;
        public int m_key=-1;        //模型代表key
        private void Start()
        {
            Init();
        }
        private void Init()
        {
            EventTriggerListener.Get(transform).onDown += (go) =>
            {
                m_xz = true;
                m_FrontPoint = Input.mousePosition;
                m_NewPoint = Input.mousePosition;
            };
            EventTriggerListener.Get(transform).onUp += (go) =>
            {
                m_xz = false;
            };
    
        }
    
        /// <summary>
        /// 显示3d模型
        /// </summary>
        public void Show3DModel()
        {
            m_key = CameraManger.Instance.Add3DModel();
            m_Horse = CameraManger.Instance.Get3DModel(m_key);
            m_rawImage = transform.GetComponent<RawImage>();
    
            //图片截取
            float _w = CameraManger.Instance.numberWidth;
            float _h = CameraManger.Instance.numberHeight;
            float y = (int)((m_key - 1) / _w) / _h;
            float x = (m_key - 1) % _w / _w;
            Rect r = new Rect(x, y, 1f / _w, 1f / _h);
            m_rawImage.uvRect = r;
            m_rawImage.SetNativeSize();
        }
    
        private void OnEnable()
        {
            if (m_key == -1)
            {
                m_xz = false;
                m_key = CameraManger.Instance.Add3DModel();
                m_Horse = CameraManger.Instance.Get3DModel(m_key);
                m_rawImage = transform.GetComponent<RawImage>();
                //图片截取
                float _w = CameraManger.Instance.numberWidth;
                float _h = CameraManger.Instance.numberHeight;
                float y = (int)((m_key - 1) / _w)  / _h;
                float x = (m_key - 1) % _w / _w;
                Rect r = new Rect(x, y, 1f / _w, 1f / _h);
                m_rawImage.uvRect = r;
                m_rawImage.SetNativeSize();
            }
        }
    
        private void OnDisable()
        {
            if (CameraManger.Instance!=null&& m_key!=-1)
            {
                CameraManger.Instance.Remove3DModel(m_key);
                m_key = -1;
                //m_horseData = null;
            }
        }
    
        public RaycastHit hit;
        //Vector3 m_StartPoint = new Vector3();   //上一帧位置
        Vector3 m_FrontPoint = new Vector3();   //上一帧位置
        Vector3 m_NewPoint = new Vector3();   //当前帧位置
        bool m_xz = false;                      //是否进入旋转
        float _chazhi = 0f;
        void Update()
        {
            if (m_xz && Input.GetMouseButton(0))
            {
                m_FrontPoint = m_NewPoint;
                m_NewPoint = Input.mousePosition;
                float dt = m_NewPoint.x - m_FrontPoint.x;
                _chazhi += Mathf.Abs(dt);
                m_Horse.Rotate(0, -dt, 0);
            }
        }
    }
    
    UI监听检测
    using UnityEngine;
    using System.Collections;
    using UnityEngine.EventSystems;
    /*
     * 自定义按钮回掉事件 例如        EventTriggerListener.Get(gameobject).onUp += (go) =>{ };
     */
    public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger
    {
        public delegate void VoidDelegate(GameObject go);
        public delegate void BoolDelegate(GameObject go, bool state);
        public delegate void FloatDelegate(GameObject go, float delta);
        public delegate void IntDelegate(GameObject go, int delta);
        public delegate void VectorDelegate(GameObject go, Vector2 delta);
        public delegate void ObjectDelegate(GameObject go, GameObject obj);
        public delegate void KeyCodeDelegate(GameObject go, KeyCode key);
        public delegate void ParamsDelegate(GameObject go, params object[] os);
        public VoidDelegate onClick;
        public VoidDelegate onDown;
        public VoidDelegate onEnter;
        public VoidDelegate onExit;
        public VoidDelegate onUp;
        public VoidDelegate onSelect;
        public VoidDelegate onUpdateSelect;
        public VoidDelegate onDrag;
        public IntDelegate onClickInt;
        public IntDelegate onDownInt;
        public ParamsDelegate onClickParams;
        public ParamsDelegate onDownParams;
        static public EventTriggerListener Get(GameObject go)
        {
            EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
            if (listener == null) listener = go.AddComponent<EventTriggerListener>();
            return listener;
        }
    
        static public EventTriggerListener Get(Transform transform)
        {
            EventTriggerListener listener = transform.GetComponent<EventTriggerListener>();
            if (listener == null) listener = transform.gameObject.AddComponent<EventTriggerListener>();
            return listener;
        }
    
    
        int m_data;
        static public EventTriggerListener Get(GameObject go,int delta)
        {
            EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
            if (listener == null) listener = go.AddComponent<EventTriggerListener>();
            listener.m_data = delta;
            return listener;
        }
    
        object[] m_paramsObj;
        static public  EventTriggerListener Getobject(GameObject go, params object[] os)
        {
            EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
            if (listener == null) listener = go.AddComponent<EventTriggerListener>();
            listener.m_paramsObj = os;
            return listener;
        }
    
        public override void OnPointerClick(PointerEventData eventData)
        {
            if (onClick != null) onClick(gameObject);
            if (onClickInt != null) onClickInt(gameObject, m_data);
            if (onClickParams != null) onClickParams(gameObject, m_paramsObj);
        }
        public override void OnPointerDown(PointerEventData eventData)
        {
            if (onDown != null) onDown(gameObject);
            if (onDownInt != null) onDownInt(gameObject, m_data);
            if (onDownParams != null) onDownParams(gameObject, m_paramsObj);
        }
        public override void OnPointerEnter(PointerEventData eventData)
        {
            if (onEnter != null) onEnter(gameObject);
        }
        public override void OnPointerExit(PointerEventData eventData)
        {
            if (onExit != null) onExit(gameObject);
        }
        public override void OnPointerUp(PointerEventData eventData)
        {
            if (onUp != null) onUp(gameObject);
        }
        public override void OnSelect(BaseEventData eventData)
        {
            if (onSelect != null) onSelect(gameObject);
        }
        public override void OnUpdateSelected(BaseEventData eventData)
        {
            if (onUpdateSelect != null) onUpdateSelect(gameObject);
        }
        public override void OnDrag(PointerEventData eventData)
        {
            if (onDrag != null) onDrag(gameObject);
        }
    }
    
    

    展开全文
  • 3D物体与UI交叉显示

    2018-05-14 14:59:39
    两个层次的UIUI和UIFront,两个层次的3D物体,3D3DFront,显示顺序分别是:UI3D,UIFront,3DFront,场景当中一共需要四个相机,分别渲染不同的物体,所有相机的ClearFlage都设置为Depth Only,Culling Mask都...
    两个层次的UIUIUIFront,两个层次的3D物体,3D3DFront,显示顺序分别是:

    UI3DUIFront3DFront,场景当中一共需要四个相机,分别渲染不同的物体,所有相机的ClearFlage都设置为Depth OnlyCulling Mask都设置为自己要显示的Layer,下面说一下具体设置。

     

     

    1AllObjParent, UIs, 3Ds均为空物体,坐标为(000),Layer也都是Default

    2,先说UI部分,UIUIFront都是Canvas并绑定了相关组件,Layer分别是UIUIFrontCanvasRender Mode属性设置为Screen Space-Camera,并给Render Camera绑定相应的相机,Canvas Scaler组件的UIScaleMode属性设置为Scale With Screen Size,并设置相应的分辨率,UI的属性设置如下图:

     

     

    3,说一下UI下面Camera的设置,UICameraUIFrontCamera都是相机,并绑定Camera组件,设置CleraFlageDepth onlyProjection设置为OrthographicLayer分别设置为UIUIFrontUICameraDepth设置为0Culling Mask设置为UI(只渲染LayerUI的物体),UIFrontCameraDepth设置为2Culling Mask设置为UIFront(只渲染LayerUIFront的物体),UICamera的属性设置如下图:

     

    4,UICamera下添加一个空物体,起名为UIPar,是所有LayerUI的物体的父级,坐标为(00100),因为UI是显示在最后面的,所以Z轴坐标值最大,UIFrontCamera下添加一个空物体起名为UIFrontPar,是所有LayerUIFront的物体的父级,坐标为(0090),因为UIFront显示在UI上面,所以Z轴坐标比UIPar的更小,更靠前。

     

    5,说完UI,再来说一下3D部分,3D3DFront都是空物体,坐标都是(000),Layer分别设置为3D3DFront,在两者下面各自添加一个相机Camera,起名为3DCamera3DFrontCamera,两个相机的CleraFlags属性均为Depth onlyCulling Mask分别为3D3DFrontDepth分别为13,因为3DFront物体是要显示在最前面的,所以3DFrontCameraDepth值最大,3DFront Camera的属性设置如下图:

     

    6,3D3DFront下分别再建一个空物体,命名为3DObjs3DFrontObjs,用来做所有3D物体和3DFront物体的父级,最后的效果图如下:

     

    灰色背景和红色字体显示在最后面,LayerUI,蓝色球体次之,Layer3D,绿色背景和黑色字体在蓝球之上,LayerUIFront,绿色圆柱体显示在最前方,Layer3DFront

    展开全文
  • Input.mousePosition就是鼠标所在的位置的坐标函数Camera.main.ScreenToWorldPoint就是屏幕坐标转化三空间的函数Camera.main.ScreenToWorldPoint把...这个时候只要z轴+10就是屏幕映射到三世界的正确坐标了Vector3
  • unity 3d ui渲染层次

    2018-07-05 11:41:36
    使用world spcace canvas,直接将下边image的材质替换成一个overlay的材质并不能够覆盖在所有物体之上 还需要修改canvas本身的SortingLayer 另外如果透明材质 虽然有transparent的设置 但是没有设置blend的方式的化 ...
  • 助力快速利用 UGUI 完成 3D 物体在 UI 界面的显示,UnityUi显示3D物体/模型,控制物体旋转,转动全教程-超简单,游戏开发过程中,我们时长会需要把 3D 游戏对象/模型显示在 UI 界面上 例如王者荣耀上的人物选择,可以...
  • Unity3D教程:制作简单小汽车游戏 OnGUI的视觉化编辑 unity3d角色血条 Unity3D格斗游戏运动特效 MenuItem自定义菜单项 Unity3D脚本:导弹追踪代码 Unity3D教程:UI自动适合屏幕分辨率 中慢动作与加速动作的实现 ...
  • UnityUi显示3D物体/模型,控制物体旋转,转动全教程-超简单 3D物体在UI界面的显示 Chinar 本文提供全流程,中文翻译,助力快速利用 UGUI 完成 3D 物体在 UI 界面的显示 游戏开发过程中,我们时长会需要把 3D 游戏...
  • 项目中我们会遇到类似这种需求,弹出一个小UI界面,我们可以在UI界面上看到我们的三模型。对于广大Unity开发者都知道,unity引擎默认UI渲染在最上层。所以,想要实现这个功能需要我们自己去处理下。 我这里提供了...
  • 我们都知道unity自带转换坐标的方法 Camera.main.WorldToScreenPoint(); 只要场景里带有一个camera并且给他附上MainCamera 的tag,就可以使用,参数是你要转换的原始坐标。 但是他转出来的坐标系是下图这样的...
  • 在之前的一篇博文中描述了Unity3D应用嵌入WPF应用的具体实现方式,但仅仅是解决了最基本的技术问题,想要将其具体的应用到项目中还需要具体的细化。...Unity3D是近些年比较流行的游戏引擎之一,在三
  • Unity3D_2D游戏实例从零讲起(3)——基本菜单UI的实现   游戏除了基本的画面渲染,操作对象等等,还需要各种UI菜单来辅助玩家,或是引导,或是做游戏设置。比如,登录菜单,图片的显示,人物血条等等。  游戏...
  • UI --> Image 新建一个图片 作为背景图片 2.给Image 指定背景图片 3.在Canvas 下新建一个 Raw Image 4.再 新建一个摄像机 5.再新建一个 游戏物体 Cube 6.在 Project 新建一个 Render Texture ...
  • 其实除去布置UI,在Unity3D中绘制一个2D平面图形是很蛋疼的一件事情。不然的话,也不会有大量的平面图形绘制插件出现。如果不用插件的话,需要利用的GL去绘制平面图形,而在屏幕中动态放置文本则需要用的GUI。 GL是...
  • 解决同时响应UI3D物体事件 传统使用OnMouseDown回调会同时响应UI3D物体事件,可使3D物体继承IPointerClickHandler实现OnPointerClick方法避免穿透(使用此方法需要在摄像机上挂Physics Raycaster脚本) public ...
  • Unity3D点击UI图片生成模型预设物 目录 1、博客介绍 2、内容 (1)演示 (2)生成 (3)生成物体移动 3、推送 4、结语 1、博客介绍 翻出来了之前一个两年前Demo,顺手传上来了,通过点击按钮或者其他UI...
  • 有时候在 游戏中,我们会需要在UI上面显示3d模型(例如角色选择、装备选择、装备预览等等),这时候我们就要用到RenderTexture和UI里面的RawImage。具体做法就是新建一个RenderTexture资源,将它命名为texture_1好了...
  • 1、创建一个3D摄像机,渲染3D模型。(我为了方便就把模型放到了Camera的下面,你可以不这样) 2、在2D里面指定一个TopLeft和BottomRight,用来表示模型渲染到UI上面的区域。 3、在之前的3D摄像机...
1 2 3 4 5 ... 20
收藏数 1,628
精华内容 651
热门标签
关键字:

3维ui unity3d