• 切水果


    2/3D游戏:2D

    辅助插件:NGUI

    游戏制作难度系数:初级

    用到的其他工具:Trail Renderer(拖尾组件)

    1、NGUI使背景图片适应任何分辨率【Camera为正交模式】

        void Start()
        {
            UIRoot root = GameObject.FindObjectOfType<UIRoot>();
            if (root != null)
            {
                float s = (float)root.activeHeight / Screen.height;
                int height = Mathf.CeilToInt(Screen.height * s);
                int width = Mathf.CeilToInt(Screen.width * s);
                UISprite sprite = this.gameObject.GetComponent<UISprite>();//背景图片
                sprite.height = height;
                sprite.width = width;
            }
        }

    其他UI配合UIAnchor使用即可!

    2、NGUI批量处理按钮事件

        void Start()
        {
            UIButton[] buttons = this.gameObject.GetComponentsInChildren<UIButton>();//获取场景中所有按钮
            if (buttons != null && buttons.Length > 0)
            {
                foreach (var item in buttons)
                {
                    UIEventListener.Get(item.gameObject).onClick += ButtonClick;//为每个按钮赋予同一个点击事件
                }
            }
        }
        void ButtonClick(GameObject obj)
        {
            switch (obj.name)
            {
                case "play"://开始游戏
                    this.gameObject.SetActive(false);
                    GameObject panel = Resources.Load("mainpanel") as GameObject;//mainpanel游戏主界面已存储为一个预设
                    NGUITools.AddChild(Camera.main.gameObject, panel);//把此预设加载到maincamera下面
                    break;
                case "moregame"://更多游戏
                    Application.OpenURL("http://www.cnblogs.com/mrzivchu");
                    break;
                case "credits"://创建者信息
                    Application.OpenURL("http://www.cnblogs.com/mrzivchu");
                    break;
                default:
                    break;
            }
        }

    3、解决粒子特效被NGUI遮挡的问题

    修改Camera下的Culling Mask为Everything(默认为Unnamed 8)(这个必须要设置成这样)

    修改NGUI中的UIPanel脚本中的默认的RenderQueue是3000, 调整到3000以下,这样就不会遮挡粒子特效了,一般例子效果的RenderQueue也是3000,可以从下面的步骤看出粒子效果的RenderQueue值(渲染队列):,fire1是粒子特效,依次点击fire1下面的outercore,innercore,smoke,在后缀为Render的组件里,点击edit…,

    就可以看出RenderQueue的值了!当有的UIPanel需要显示在特效上面时,在Hirerarchy面板中把该UIPanel的Renderer Q选项调整为Start At,值为3000以上,就可以解决!

    修改粒子特效的Shader中的RendererQueue值的通用代码:

        public UIPanel panel;
        public enum rendertype
        {
            front,
            back
        }
        public rendertype type = rendertype.front;
        void Start()
        {
            int num = panel.startingRenderQueue;
            num += (type == rendertype.front) ? 1 : -1;
            Renderer[] sys = GetComponentsInChildren<Renderer>();//如果自己也有Render也会算在内
            foreach (Renderer item in sys)
            {
                item.material.renderQueue = num;
            }
        }

    另外:

    上面解决的是NGUI关于粒子遮挡的问题,如果是使用Unity自身的Particle System粒子系统,,那么解决例子系统的办法是:对粒子系统进行 如下操作:

       void Start()
        {
            particleSystem.renderer.sortingLayerName = "Default";
            particleSystem.renderer.sortingOrder = 2;
        }

    为粒子系统指定好一个层,并指定粒子系统在此层的前后排序位置,sortingOrder越大,那么在Default层中排的位置越靠前

    4、计算刀光角度

    假如红线是我们在屏幕上用鼠标画的一个线,也就是我们希望刀光的长度和角度是这样的,那我们就必须算出A的角度,

    由MSDN(http://msdn.microsoft.com/zh-tw/library/aa560104.aspx)知道,反正切函数输入的参数是反正切值,返回的数值是以弧度为单位的数值(弧度的单位缩写是rad),也就是说反正切函数得到的是弧度,由于角度的计算公式为:角度=弧度 / pi * 180,所以要求角度的话,只要知道弧度即可,而弧度的值就是反正切函数的返回值,那么我们就可以用Mathf.Atan来计算弧度了,反正切值为三角形的 y / x,代码如下:

                    if (Input.GetMouseButtonDown(0))
                    {
                        start = Input.mousePosition;
                    }
                    if (Input.GetMouseButtonUp(0))
                    {
                        end = Input.mousePosition;
                    }
                    float jiaodu = 90f;
                    if (start.x != end.x)
                    {
                        float zhengqiebi = (end.y - start.y) / ((end.x - start.x)); //正切比
                        float zhnegqie = Mathf.Atan(zhengqiebi); //反正切值
                        jiaodu = zhnegqie * 180 / Mathf.PI;  //角度
    //jiaodu = zhnegqie * Mathf.
    Rad2Deg
    }

    1弧度大概是57.29578 度(°)

    其他注意点

    (1)必须先把对象加到父节点中去,之后才能设置大小和位置,不然位置和大小容易出错

    (2)FoceMode(力模式):Force:添加一个可持续力到刚体,使用它的质量。

                                          Acceleration:添加一个可持续加速度到刚体,忽略它的质量。

                                          Impulse:添加一个瞬间冲击力到刚体,使用它的质量。

                                          VelocityChange:添加一个瞬间速度变化给刚体,忽略它的质量。

    (3)设置 / 获取对象的旋转或者位置,都必须使用世界坐标,而不能使用屏幕坐标(Input.mousePosition 获取的是屏幕坐标),必须把屏幕坐标转换成世界坐标

           而对象的缩放,用的是本地缩放,transform只有localScale此属性,而位置和旋转分别有position、localPosition和rotation、 transform.localRotation

           如果对象没有父节点的话,那么他的本地坐标和世界坐标应该是一致的!

           在Inspector面板中显示的是对象相对于父节点的本地坐标,而不是世界坐标

     (4)屏幕坐标:以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。鼠标位置坐标属于屏幕坐标

          ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。

          绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

  • 相关阅读:
    pyinstaller 打包后无法运行
    Android Uiautomator2 gradlew 坑
    JNDI 在 J2EE 中的角色
    23种设计模式
    Struts2工作原理
    SpringMVC工作原理
    堆内存设置
    安装和使用 memcached
    SQL面试题及答案
    30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
  • 原文地址:https://www.cnblogs.com/MrZivChu/p/cutfriuts.html
Copyright © 2020-2023  润新知