切水果

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)。

原文地址:https://www.cnblogs.com/MrZivChu/p/cutfriuts.html