2012-11-29 13:02:59 xggllc 阅读数 4380
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

工作学习需要,要一个单选按钮,在Unity3D的API上 查到了“GUILayout.Toggle”为开关按钮,复选按钮:

   Toggle (position : Rect, value : bool, text: String) 返回一个bool值;

第一个参数是坐标,第二个参数 按钮的开或关(bool值),第三个参数 按钮显示的字符串;(PS:还有其它几个参数,有图片,纹理,样式.....请参考Unity文档);

       直接画两个Toggle到UI上,是两个都可以选中的,所以说是复选按钮嘛,如果想用单选,就加一些代码:

CS代码如下:

bool Automatic = false;
bool UserOperate = false;
void OnGUI()
        {
               if(GUILayout.Toggle(Automatic, "Automatic"))
                       UserOperate= false;
               else
                       UserOperate= true;
               if(GUILayout.Toggle(UserOperate, "UserOperate"))
                       Automatic= false;
               else
                       Automatic= true;
}

这样就实现了,单选的功能,如果要多加按钮,适当的添加几行代码即可........

各位大神,小弟目前只想到这个办法,如果有更好的方法,还请留言指导一下,谢谢~ 可怜

破破

2012年11月29日 12:56:56

2014-12-10 19:03:38 suntaojiaxin 阅读数 815
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

请先看文章最后三句,再来从头开始看

首先来谈一下问题引发:

问题产生环境  这是做一棋牌游戏发现的问题  我们在上面覆盖了两层  如图所示  我们将显示纸牌的这个设置为按钮  但是我们会发现:运行时候你鼠标在图片上晃一下,他就会恢复成默认的那张牌


现在你看到这个是正常的 但是 这个button现在有一个问题 就是如果你先前设置了纸牌 列入poker_10_3的话,
运行时候你鼠标晃一下,他就会恢复成默认的那张牌,这是很让人无语的  虽然可以用另外的方法弄一个组件 但是我觉得太麻烦 
 于是 我开始试错,用错误的方法来实现正确的功能

在3的后面还有一层  buttonbgimage5 这个是放背景的地方 起到的作用是点击纸牌的时候才会显示这张背景图
下面我们按照常规的来做 然后就会发现最开是描述的问题
现在最神奇的时候来了  你只要将buttonbgimage5拖进tweentarget  就能解决问题了 其他的只要按照正常的做就行
但是 
我觉得最重要的是这俩东西所用的不是一个图集 
 反正我的是不同的图集 相同图集的我就不知道怎么搞了

本文题外话: 
我是编程小菜鸟。
 友联:QQ1126291194 
2015-05-31 14:17:41 ivebeenready 阅读数 2239
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

网上有两个常用的方法,我先用了第一种。

第一种方法:

需要注意三点,首先导入system.window.Forms.dll库,导进去后一定记得要修改playersetting下的optimization->API compatibility level为.NET 2.0,至于为什么改成这样,可以参考unity3d 的解释:http://game.ceeger.com/Manual/MobileDotnet.html。

还要注意一点:加载的本地图片地址一定不能带有中文路径

另外,www新建的时候要加上“file://” + url;

WWW www = new WWW("file://" + url);  //注意要加上"file://"

只需要一个脚本,其中代码如下:

using UnityEngine;
using System.Collections;
using System.Windows.Forms;
using System.IO;
public class UploadImg: MonoBehaviour {
	public Texture2D img = null;  
	void OnGUI()  
	{  
		if (GUI.Button(new Rect(0, 0, 100, 20), "选择文件"))  
		{  
			
			OpenFileDialog od = new OpenFileDialog();  
			od.Title = "请选择头像图片";  
			od.Multiselect = false;  
			od.Filter = "图片文件(*.jpg,*.png,*.bmp)|*.jpg;*.png;*.bmp";  
			if (od.ShowDialog() == DialogResult.OK)  
			{  
				Debug.Log(od.FileName);
				StartCoroutine(GetTexture(od.FileName));  

			}  
		}  
		if (img != null)  
		{  
			GUI.DrawTexture(new Rect(0, 20, img.width/2, img.height/2), img);  
		}  
	}  
	
	IEnumerator GetTexture(string url)  
	{  
		WWW www = new WWW("file://" + url);  //注意要加上"file://"
		yield return www;  
		if (www.isDone)  
		{  
			img = www.texture;      
		}  
	}  
}


效果是这样的,但是感觉和win7风格差的太远



第二种方法看起来要炫多了:

需要两个脚本。

OpenFileName.cs如下:

using UnityEngine;  
using System.Collections;  
using System;  
using System.Runtime.InteropServices;  

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]  

public class OpenFileName  
{  
	public int structSize = 0;  
	public IntPtr dlgOwner = IntPtr.Zero;  
	public IntPtr instance = IntPtr.Zero;  
	public String filter = null;  
	public String customFilter = null;  
	public int maxCustFilter = 0;  
	public int filterIndex = 0;  
	public String file = null;  
	public int maxFile = 0;  
	public String fileTitle = null;  
	public int maxFileTitle = 0;  
	public String initialDir = null;  
	public String title = null;  
	public int flags = 0;  
	public short fileOffset = 0;  
	public short fileExtension = 0;  
	public String defExt = null;  
	public IntPtr custData = IntPtr.Zero;  
	public IntPtr hook = IntPtr.Zero;  
	public String templateName = null;  
	public IntPtr reservedPtr = IntPtr.Zero;  
	public int reservedInt = 0;  
	public int flagsEx = 0;  
}  

public class WindowDll  
{  
	[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]  
	public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);  
	public static bool GetOpenFileName1([In, Out] OpenFileName ofn)  
	{  
		return GetOpenFileName(ofn);  
	}  
}  

UploadImage.cs如下:

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class Upload : MonoBehaviour {
	public Texture2D img = null;
	private bool click = false;
	void OpenDialog()
	{
		click = true;
	}
	void EnterImage()
	{
		OpenFileName ofn = new OpenFileName();
		ofn.structSize = Marshal.SizeOf(ofn);  
		
		ofn.filter = "All Files\0*.*\0\0";  
		
		ofn.file = new string(new char[256]);  
		
		ofn.maxFile = ofn.file.Length;  
		
		ofn.fileTitle = new string(new char[64]);  
		
		ofn.maxFileTitle = ofn.fileTitle.Length;  
		
		ofn.initialDir = UnityEngine.Application.dataPath;//默认路径  
		
		ofn.title = "Open Project";  
		
		ofn.defExt = "JPG";//显示文件的类型  
		//注意 一下项目不一定要全选 但是0x00000008项不要缺少  
		ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR  

		if(WindowDll.GetOpenFileName(ofn))
		{
			StartCoroutine(GetTexture(ofn.file));
		}

	}

	IEnumerator GetTexture(string url)
	{
		WWW wwwTexture = new WWW ("file://" + url);
		yield return wwwTexture;
		if(wwwTexture.isDone)
			img = wwwTexture.texture;
	}

	void OnGUI()
	{
		if(click)
		{
			EnterImage();
			click = false;
		}
		if (img != null)
			GUI.DrawTexture (new Rect(Screen.width/2 - img.width/2,Screen.height/2 - img.height,img.width,img.height),img);
	}
	
}


2019-04-09 14:51:11 wk201403010114 阅读数 120
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

最近在项目中用到了翻页,因为数据特别多。自己尝试写了一个,希望能够对大家有所帮助,里边都有注释,如果有不对的地方,可以私信我,我来改正。

实现的效果和下边的图片差不多

1、总页数小于等于7的时候就行全部显示

2、当页码大于7的时候,前边的5个数字直接显示,省略号,然后是总页数,左右翻页的按钮也会显示出来

点击省略号可以加5页

3、当页码足够多的时候,点击进行翻页时会显示成这个样子

在下方的输入框中输入自己想要看的数据的页码,点击跳转,可以直接跳转到这个界面。

====================Prefect====================

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 进行翻页
/// </summary>
public class Test : MonoBehaviour
{
    public Text[] SevenText;//七个页码
    public Button[] SevenBtn;//七个按钮
    public Button LeftBtn;//左侧的按钮
    public Button RightBtn;//右侧的按钮
    public int CurrentAllPage;//一共有多少页
    public InputField InputNumber;//输入的页码(要跳转的页码)
    public InputField AllPageNumber;//总页码(用于测试)
    public void Btn_Jump()
    {
        if (string.IsNullOrEmpty(InputNumber.text))
        {
            Debug.Log("输入框的内容为空");
            return;
        }
        if (CurrentAllPage >= (int.Parse)(InputNumber.text) && (int.Parse)(InputNumber.text) >= 1)
            AskPage = (int.Parse)(InputNumber.text);
        else
        {
            Debug.Log("当前最大的页码为" + CurrentAllPage);
            return;
        }

        RefreshAgain();
        InputNumber.text = "";
    }
    // Use this for initialization
    void Start()
    {
        CurrentAllPage = 11;
        AskPage = 1;
        RefreshAgain();
    }

    public void Btn_RefreshTest()
    {
        if (string.IsNullOrEmpty(AllPageNumber.text) || (int.Parse)(AllPageNumber.text) <= 0)
        {
            Debug.Log("输入的页码不对");
            return;
        }
        else
        {
            CurrentAllPage = (int.Parse)(AllPageNumber.text);
            Debug.Log("当前的总页数为" + CurrentAllPage);
        }
        AskPage = 1;
        RefreshAgain();
    }
    public void Refresh()
    {
        if (CurrentAllPage <= 7)
        {
            LeftBtn.gameObject.SetActive(false);
            RightBtn.gameObject.SetActive(false);
            for (int i = 0; i < SevenBtn.Length; i++)
            {
                if (i < CurrentAllPage)
                {
                    SevenBtn[i].gameObject.SetActive(true);
                    SevenText[i].text = (i + 1).ToString();
                }
                else
                    SevenBtn[i].gameObject.SetActive(false);
            }
        }
        else
        {
            LeftBtn.gameObject.SetActive(true);
            RightBtn.gameObject.SetActive(true);
            for (int i = 0; i < SevenBtn.Length; i++)
            {
                SevenBtn[i].gameObject.SetActive(true);
                SevenText[i].text = (i + 1).ToString();
                if (i == 5)
                {
                    SevenText[i].text = "...";
                }
                else if (i == 6)
                {
                    SevenText[i].text = CurrentAllPage.ToString();
                }
            }
        }
    }


    /// <summary>
    /// 当前请求的是第几页的内容
    /// </summary>
    int AskPage = -1;
    /// <summary>
    /// 上一次是点击的第几页
    /// </summary>
    int LastPage = -1;
    /// <summary>
    /// 上一次点击的是第几个按钮
    /// </summary>
    int LastIndex = -1;
    /// <summary>
    /// 点击的第几个按钮
    /// </summary>
    /// <param name="index"></param>
    public void Btn_ClickBtn(int index)
    {

        switch (index)
        {
            case 0:
                Debug.Log("点击第1个按钮");
                AskPage = (int.Parse)(SevenText[index].text);
                Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");
               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
            case 1:
                Debug.Log("点击第2个按钮");
                string number1 = SevenText[index].text;
                if (number1 != "...")
                {
                    Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");
                    AskPage = (int.Parse)(SevenText[index].text);
                }
                else if (index > LastIndex && LastPage + 5 < CurrentAllPage)
                {
                    AskPage = LastPage + 5;
                    Debug.Log("当前请求的是第" + LastPage + 5 + "页的内容");
                }
                else if (index < LastIndex && LastPage - 5 >= 1)
                {
                    AskPage = LastPage - 5;
                    Debug.Log("当前请求的是第" + (LastPage - 5) + "页的内容");
                }
               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
            case 2:
                Debug.Log("点击第3个按钮");
                AskPage = (int.Parse)(SevenText[index].text);
                Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");

               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
            case 3:
                Debug.Log("点击第4个按钮");
                AskPage = (int.Parse)(SevenText[index].text);
                Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");

               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
            case 4:
                Debug.Log("点击第5个按钮");
                AskPage = (int.Parse)(SevenText[index].text);
                Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");

               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
            case 5:
                Debug.Log("点击第6个按钮");
                string number = SevenText[index].text;
                if (number != "...")
                {
                    Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");
                    AskPage = (int.Parse)(SevenText[index].text);
                }
                else if (index > LastIndex && LastPage + 5 <= CurrentAllPage)
                {
                    AskPage = LastPage + 5;
                    Debug.Log("当前请求的是第" + AskPage + "页的内容");
                }
                else if (index < LastIndex && LastPage - 5 >= 1)
                {
                    AskPage = LastPage - 5;
                    Debug.Log("当前请求的是第" + AskPage + "页的内容");
                }
               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
            case 6:
                Debug.Log("点击第7个按钮");
                AskPage = (int.Parse)(SevenText[index].text);
                Debug.Log("当前请求的是第" + SevenText[index].text + "页的内容");
               // LastPage = AskPage;
                LastIndex = index;
                RefreshAgain();
                break;
        }
    }


    public void RefreshAgain()
    {
        LastPage = AskPage;
        //可以单独写个函数,把要请求的当前页传过去,向服务器请求当前页的消息
        Debug.Log("目前请求的是第" + AskPage + "页的内容");
        if (CurrentAllPage <= 7)
        {
            Debug.Log("刷新1");
            LeftBtn.gameObject.SetActive(false);
            RightBtn.gameObject.SetActive(false);
            for (int i = 0; i < SevenBtn.Length; i++)
            {
                if (i < CurrentAllPage)
                {
                    SevenBtn[i].gameObject.SetActive(true);
                    SevenText[i].text = (i + 1).ToString();

                }
                else
                    SevenBtn[i].gameObject.SetActive(false);

                if (SevenText[i].text == AskPage.ToString())
                {
                    SevenBtn[i].GetComponent<Image>().color = Color.red;
                    LastIndex = i;
                }
                else
                    SevenBtn[i].GetComponent<Image>().color = Color.white;
            }
        }
        else
        {
            LeftBtn.gameObject.SetActive(true);
            RightBtn.gameObject.SetActive(true);
            if (AskPage <= 5)
            {
                Debug.Log("刷新2");

                SevenText[0].text = 1.ToString();
                SevenText[1].text = 2.ToString();
                SevenText[2].text = 3.ToString();
                SevenText[3].text = 4.ToString();
                SevenText[4].text = 5.ToString();
                SevenText[5].text = "...";
                SevenText[6].text = CurrentAllPage.ToString();
            }
            else if (AskPage >= CurrentAllPage - 4)
            {
                Debug.Log("刷新3");

                SevenText[0].text = 1.ToString();
                SevenText[1].text = "...";
                SevenText[2].text = (CurrentAllPage - 4).ToString();
                SevenText[3].text = (CurrentAllPage - 3).ToString();
                SevenText[4].text = (CurrentAllPage - 2).ToString();
                SevenText[5].text = (CurrentAllPage - 1).ToString();
                SevenText[6].text = CurrentAllPage.ToString();
            }
            else
            {
                Debug.Log("刷新4");
                SevenText[0].text = 1.ToString();
                SevenText[1].text = "...";
                SevenText[2].text = AskPage.ToString();
                SevenText[3].text = (AskPage + 1).ToString();
                SevenText[4].text = (AskPage + 2).ToString();
                SevenText[5].text = "...";
                SevenText[6].text = CurrentAllPage.ToString();
            }
            for (int i = 0; i < SevenBtn.Length; i++)
            {
                SevenBtn[i].gameObject.SetActive(true);
                if (SevenText[i].text == AskPage.ToString())
                {
                    SevenBtn[i].GetComponent<Image>().color = Color.red;
                    LastIndex = i;
                }
                else
                    SevenBtn[i].GetComponent<Image>().color = Color.white;
            }
        }
    }

    public void Btn_Left()
    {
        if (AskPage == 1)
        {
            Debug.Log("当前是首页");
            return;
        }
        AskPage--;
        LastPage = AskPage;
        LastIndex--;
        RefreshAgain();
    }
    public void Btn_Right()
    {
        if (AskPage == CurrentAllPage)
        {
            Debug.Log("当前是最后一页");
            return;
        }
        AskPage++;
        LastPage = AskPage;
        LastIndex--;
        RefreshAgain();
    }
}
项目

其它的也就没有什么特殊的了,就是那7个按钮的设置位置,注意一下就好了

网盘

https://pan.baidu.com/s/1enisUdG0UnkJlHAtFJYovA

密码

sno6

2015-08-14 10:23:25 u010024824 阅读数 3087
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

Null Reference Exception : Object reference not set to an instance of an object.

异常:空引用,对象的引用未设置到对象的实例。

出现该异常的位置:

可能是在调用组件时该组件还未实例化或未存储地址指针,需要查看是否将组件位置拽入代码公布的字段;还有注意Unity3D的生命周期,调整代码的执行顺序。




(若有错误和不足之处,还望指正,谢谢!)

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