2017-08-02 23:21:22 BIGMAD 阅读数 3575
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4715 人正在学习 去看看 张刚

#####前排提示,此方法已失效######

今日在捣鼓如何获取网络时间,四处寻找方法

但是都不知道什么鬼,要么就很麻烦,各种字符串操作等等。。。

直到我发现了这个地址

http://cgi.im.qq.com/cgi-bin/cgi_svrtime

是腾讯的官方给的时间,很简洁

不好意思,代码简单粗暴,告辞。

	public int year, mouth, day, hour, min, sec;
	
	public string timeURL = "http://cgi.im.qq.com/cgi-bin/cgi_svrtime";
	
    void Start () 
    {
        StartCoroutine(GetTime());
	}

    IEnumerator GetTime()
    {
        WWW www = new WWW(timeURL);
        while (!www.isDone)
        {
            yield return www;
        }
        SplitTime(www.text);
    }

    void SplitTime(string dateTime)
    {
        dateTime = dateTime.Replace("-", "|");
        dateTime = dateTime.Replace(" ", "|");
        dateTime = dateTime.Replace(":", "|");
        string[] Times = dateTime.Split('|');
        year = int.Parse(Times[0]);
        mouth = int.Parse(Times[1]);
        day = int.Parse(Times[2]);
        hour = int.Parse(Times[3]);
        min = int.Parse(Times[4]);
        sec = int.Parse(Times[5]);
    }
2013-03-15 16:26:58 asd237241291 阅读数 19120
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4715 人正在学习 去看看 张刚

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:【119706192本文链接地址: Unity3D 网络通信_HTTP协议:获取网络图片内容

自己写的测试demo,一个功能一个功能测试着做的,没有什么结构,凑合看吧。

http协议,在手机平台,URL必须必带http://头。

此脚本主要实现了 

  • 分别用pose和get方式获取天气预报信息(XML格式)。
  • 解析XML
  • 获取网络图片
  • 获取网络图片(base64格式)
  • base64与byte[]互转
  • byte[]与Texture2D(图片)互转

更多常用WEBService:http://www.webxml.com.cn/zh_cn/web_services.aspx

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.IO;

public class HTTPDemo : MonoBehaviour
{
    public string HostName = "http://www.webxml.com.cn";
    //城市天气预报服务 
    public string URLPath = "/WebServices/WeatherWebService.asmx/getWeatherbyCityName";
    //获得验证码服务(直接获得图片)
    private string PictureName = "/WebServices/ValidateCodeWebService.asmx/cnValidateImage?byString='Picture'";
    //获得验证码服务(获得图片字节流)
    private string PictureByteName = "/WebServices/ValidateCodeWebService.asmx/cnValidateByte?byString='picByte'";
        
    private Texture2D mPicture;
    private Texture2D mPictureByte;
    private Texture2D mConvertPNG;

    public string[] Parameters = new string[] { "theCityName" };

    private string XMLContent = "null";

    public string testC = "null";

    void OnGUI()
    {
        //显示测试信息 
        GUI.Label(new Rect(100, 10, 1000, 38), testC);


        //表单传值
        if (GUI.Button(new Rect(10, 50, 100, 60), "post"))
        {
            postWeatherbyCityName("北京");
        }
        GUI.Button(new Rect(120, 80, 100 + getJindu() * 100, 20), (getJindu() * 100) + "%");


        //get传值(android平台不支持中文参数)
        if (GUI.Button(new Rect(10, 130, 100, 60), "get"))
        {
            getWeatherbyCityName("58367");//上海
        }
        GUI.Button(new Rect(120, 150, 100 + getJindu() * 100, 20), (getJindu() * 100) + "%");


 
        //显示读取到的天气预报原始信息(xml格式)
        GUI.Label(new Rect(10, 220, 380, 500), mContent);



        //解析xml 
        if (GUI.Button(new Rect(500, 200, 120, 60), "AnalysisXML"))
        {
            XMLContent = AnalysisXML();
        }
        GUI.Label(new Rect(410, 220, 380, 500), XMLContent);



        //下载网络图片 
        if (GUI.Button(new Rect(10, 750, 80, 60), "downPic"))
        {
            downloadPicture(PictureName);
        }
        GUI.Label(new Rect(100, 760, 200, 200), mPicture);


        //下载网络图片 (base64格式)
        if (GUI.Button(new Rect(350, 750, 80, 60), "downPicByte"))
        {
            downloadPictureByte(PictureByteName);
        }
        GUI.Label(new Rect(450, 760, 200, 200), mPictureByte);
    }

    public void postWeatherbyCityName(string str)
    {
        //将参数集合封装到Dictionary集合方便传值
        Dictionary<string, string> dic = new Dictionary<string, string>();

        //参数
        dic.Add(Parameters[0], str);

        StartCoroutine(POST(HostName + URLPath , dic));
    }

    public void getWeatherbyCityName(string str)
    {
        //将参数集合封装到Dictionary集合方便传值
        Dictionary<string, string> dic = new Dictionary<string, string>();

        //参数
        dic.Add(Parameters[0], str);

        StartCoroutine(GET(HostName + URLPath , dic));
    }

    //下载图片 
    public void downloadPicture(string picName)
    {
        testC ="picurl = " + picName;

        StartCoroutine(GETTexture(HostName + picName));
    }

    //下载图片(字节流)
    public void downloadPictureByte(string picName)
    {
        StartCoroutine(GETTextureByte(HostName + picName));
    }

    /*----------------------------------------------------Helper----------------------------------------------------------------------------*/

    private float mJindu = 0;
    private string mContent;

    public float getJindu()
    {
        return mJindu;
    }

    //POST请求(Form表单传值、效率低、安全 ,)
    IEnumerator POST(string url, Dictionary<string, string> post)
    {
        //表单 
        WWWForm form = new WWWForm();
        //从集合中取出所有参数,设置表单参数(AddField()).
        foreach (KeyValuePair<string, string> post_arg in post)
        {
            form.AddField(post_arg.Key, post_arg.Value);
        }
        //表单传值,就是post 
        WWW www = new WWW(url, form);

        yield return www;
        mJindu = www.progress;

        if (www.error != null)
        {
            //POST请求失败
            mContent =  "error :" + www.error;
        }
        else
        {
            //POST请求成功
            mContent = www.text;
        }
    }

    //GET请求(url?传值、效率高、不安全 )
    IEnumerator GET(string url, Dictionary<string, string> get)
    {
        string Parameters;
        bool first;
        if (get.Count > 0)
        {
            first = true;
            Parameters = "?";
            //从集合中取出所有参数,设置表单参数(AddField()).
            foreach (KeyValuePair<string, string> post_arg in get)
            {
                if (first)
                    first = false;
                else
                    Parameters += "&";

                Parameters += post_arg.Key + "=" + post_arg.Value;
            }
        }
        else
        {
            Parameters = "";
        }

        testC ="getURL :" + Parameters;

        //直接URL传值就是get
        WWW www = new WWW(url + Parameters);
        yield return www;
        mJindu = www.progress;

        if (www.error != null)
        {
            //GET请求失败
            mContent = "error :" + www.error;
        }
        else
        {
            //GET请求成功
            mContent = www.text;
        }
    }

    IEnumerator GETTexture(string picURL)
    {
        WWW wwwTexture = new WWW(picURL);

        yield return wwwTexture;

        if (wwwTexture.error != null)
        {
            //GET请求失败
            Debug.Log("error :" + wwwTexture.error);
        }
        else
        {
            //GET请求成功
            mPicture = wwwTexture.texture;
        }
    }

    string PicByte;
    IEnumerator GETTextureByte(string picURL)
    {
        WWW www = new WWW(picURL);

        yield return www;

        if (www.error != null)
        {
            //GET请求失败
            Debug.Log("error :" + www.error);
        }
        else
        {
            //GET请求成功
            Debug.Log("PicBytes text = " + www.text);

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(new StringReader(www.text));

            //通过索引查找子节点 
            PicByte = xmlDoc.GetElementsByTagName("base64Binary").Item(0).InnerText;
            testC = PicByte;

            mPictureByte = BttetoPic(PicByte);
        }
    }

    //解析XML 
    string AnalysisXML()
    {
        string str = "";

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(new StringReader(mContent));

        //得到文档根节点的所有子节点集合 
        //XmlNodeList nodes = xmlDoc.DocumentElement.ChildNodes;
        //通过节点名得到节点集合
        XmlNodeList nodes = xmlDoc.GetElementsByTagName("string");

        //通过索引查找子节点 
        str += "item[1] = " + xmlDoc.GetElementsByTagName("string").Item(1).InnerText + "\n\n";

        //遍历所有子节点
        foreach (XmlElement element in nodes)
        {
            if (element.Name == "string")
            {
                str += element.InnerText + "\n";
            }
        }
        
        return str;
    }

    //图片与byte[]互转
    public void convertPNG(Texture2D pic)
    {
        byte[] data = pic.EncodeToPNG();
        Debug.Log("data = " + data.Length + "|" + data[0]);
        mConvertPNG = new Texture2D(200, 200);
        mConvertPNG.LoadImage(data);
    }

    //byte[]与base64互转 
    Texture2D BttetoPic(string base64)
    { 
        Texture2D pic = new Texture2D(200,200);
        //将base64转码为byte[] 
        byte[] data = System.Convert.FromBase64String(base64);
        //加载byte[]图片
        pic.LoadImage(data);

        string base64str = System.Convert.ToBase64String(data);
        Debug.Log("base64str = " + base64str);

        return pic;
    }
}
2018-08-06 18:05:23 abc1090275833 阅读数 874
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4715 人正在学习 去看看 张刚

       最近项目需要定位,所以开始来研究Unity的定位,本来想用原生的sdk,但是谷歌被墙了那就没有办法了,接第三方的sdk又太麻烦,百度了一下正好可以通过百度地图API来获取当前IP的地址,不仅是百度地图,同时高德地图,腾讯地图等等也都有类似的API,此次我选择了百度地图,于是在查询了百度地图的相关接口后研究出功能,自学记录一下

       代码如下:

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Net.NetworkInformation;


public class BaiduTest : MonoBehaviour {


    public Text province;
    public Text city;

    string url = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
    string text;

    void Start()
    {
        StartCoroutine(Request());
    }

    // Update is called once per frame
    void Update()
    {

    }
    IEnumerator Request()
    {
        WWW www = new WWW(url);
        yield return www;

        if (string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.text);
            ResponseBody req = JsonConvert.DeserializeObject<ResponseBody>(www.text);
            Debug.Log("夭寿啦,调到地址啦!!!!!!");
            Debug.Log(req.content.address_detail.city);
            province.text = req.content.address_detail.province;
            city.text = req.content.address_detail.city;
        }
    }

}

public class ResponseBody
{

    public string address;
    public Content content;
    public int status;

}

public class Content
{
    public string address;
    public Address_Detail address_detail;
    public Point point;
}
public class Address_Detail
{
    public string city;
    public int city_code;
    public string district;
    public string province;
    public string street;
    public string street_number;
    public Address_Detail(string city, int city_code, string district, string province, string street, string street_number)
    {
        this.city = city;
        this.city_code = city_code;
        this.district = district;
        this.province = province;
        this.street = street;
        this.street_number = street_number;
    }
}
public class Point
{
    public string x;
    public string y;
    public Point(string x, string y)
    {
        this.x = x;
        this.y = y;
    }
}

 

       需要注意的是,需要引入Json解析,刚好有现成的插件,导入进去运行成功,不过稍有遗憾的是,我只定位到了省份和城市,不知道是不是IP的问题,通过此API调用IP地址的话精度不是太高,如果需要精度很高的定位的话,建议还是安装第三方SDK,调用的网址是"http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";  需要替换自己的AK的话将其中的bretF4dm6W5gqjQAXuvP0NXW6FeesRXb替换成自己的就可以了,具体调用百度地图API有详细解释,在这里就不多做介绍了,下面是我的工程文件,unity版本为5.3.6,在Editor和Android环境下都可以正常运行调用,里面还有些获取IP和调用安卓的代码,在此就不做介绍了。

 

       最后放一下工程文件的链接:  https://download.csdn.net/download/abc1090275833/10586792

2019-05-05 19:28:34 SnoopyNa2Co3 阅读数 866
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4715 人正在学习 去看看 张刚

不说这么多,先上图,最后有工程下载地址

上图可以看出来城市和对应的天气,没错我是在东莞工作的程序员

1.地方我们可以用百度地图根据ip来获取

http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll

地方获取比较简单,直接用www可以直接获取

    void Start()
    {
        //获取位置
        StartCoroutine(RequestPos());       
    }


    IEnumerator RequestPos()
    {
        WWW www = new WWW(Posurl);
        yield return www;

        if (string.IsNullOrEmpty(www.error))
        {
            positionTool.ResponseBody t = LitJson.JsonMapper.ToObject<positionTool.ResponseBody>(www.text);
            Debug.LogError(t.content.address_detail.city);
        }
    }

json对应的解析类

public class positionTool
{
    #region ip对应城市
    public class ResponseBody
    {

        public string address;
        public Content content;
        public int status;

    }

    public class Content
    {
        public string address;
        public Address_Detail address_detail;
        public Point point;
    }
    public class Address_Detail
    {
        public string city;
        public int city_code;
        public string district;
        public string province;
        public string street;
        public string street_number;

        public Address_Detail()
        {

        }

        public Address_Detail(string city, int city_code, string district, string province, string street, string street_number)
        {
            this.city = city;
            this.city_code = city_code;
            this.district = district;
            this.province = province;
            this.street = street;
            this.street_number = street_number;
        }
    }

    public class Point
    {
        public string x;
        public string y;

        public Point()
        {

        }

        public Point(string x, string y)
        {
            this.x = x;
            this.y = y;
        }
    }
    #endregion

}

 

2.天气我们可以用免费的接口来获取

http://t.weather.sojson.com/api/weather/city/ + 城市ID
例如东莞ID为101281601
http://t.weather.sojson.com/api/weather/city/101281601

Api地址https://www.sojson.com/blog/305.html

其他接口介绍https://www.jianshu.com/p/e3e04cf3fc0f

    IEnumerator RequestWeather(int id)
    {
        WWW www = new WWW(Weatherurl + id.ToString());
        yield return www;

        if (string.IsNullOrEmpty(www.error))
        {
            weatherTool.WeathBody t = LitJson.JsonMapper.ToObject<weatherTool.WeathBody>(www.text);
            Debug.LogError(t.data.forecast[0].type);

        }
    }

天气工具类,我这边把2000多个城市和对应的id保存json文件,根据地方名来获取对应的城市ID

获取出来的字符串解析json数据

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class weatherTool
{
    public static Dictionary<string, int> PosToId = new Dictionary<string, int>();

    public static bool initDic = false;

    public static int GetWeatherId(string name)
    {
        int id = 0;
        if(!initDic)
        {
            initDic = true;
            TextAsset ta = Resources.Load<TextAsset>("WeatherId");
            List<Pos2Id> temp = LitJson.JsonMapper.ToObject<List<Pos2Id>>(ta.text);
            foreach(Pos2Id t in temp)
            {
                PosToId[t.placeName] = t.id;
            }
        }
        for(int i=1;i<name.Length;i++)
        {
            string tn = name.Substring(0, i);
            if(PosToId.ContainsKey(tn))
            {
                id = PosToId[tn];
            }
        }
        return id;
    }

    public class Pos2Id
    {
        public string placeName;
        public int id;

        public Pos2Id()
        {

        }
        public Pos2Id(string name,int id)
        {
            placeName = name;
            this.id = id;
        }
    }

    public class WeathBody
    {
        public string time;
        public CityInfo cityInfo;
        public string date;
        public string message;
        public int status;
        public WeathData data;
    }

    public class CityInfo
    {
        public string city;
        public string cityId;
        public string parent;
        public string updateTime;
    }

    public class WeathData
    {
        public string shidu;
        public double pm25;
        public double pm10;
        public string quality;
        public string wendu;
        public string ganmao;
        public WeathDetailData yesterday;
        public WeathDetailData[] forecast;
    }

    public class WeathDetailData
    {
        public string date;
        public string sunrise;
        public string high;
        public string low;
        public string sunset;
        public double aqi;
        public string ymd;
        public string week;
        public string fx;
        public string fl;
        public string type;
        public string notice;
    }

}

这个局限性在中国范围内

工程下载地址

链接:https://pan.baidu.com/s/1sTQfJ5x_6gMl8H2ifCGWfQ 
提取码:5ani 

 

 

2015-06-12 08:54:23 leoleocs 阅读数 4075
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4715 人正在学习 去看看 张刚

我们知道,Unity3d会将Assets folder下的图片进行编译预处理,在程序打包完成后,我们是无法动态的修改图片内容,所以,如果能动态的从非Assets 目录下加载图片就是一个非常好的方法。

我们可以使用Unity3d WWW类提供的方法来完成这个工作,WWW类经常是用来下载网络服务器上的资源,其实它也可以加载本地的资源。 参考http://docs.unity3d.com/ScriptReference/WWW.html

那具体如何实现呢, 大体分成下面几步:

  • 创建WWW类,主要参数,www = new WWW(“file://” + path)) ,其中path为图片路径的存放位置。
  • 调用WWW类的方法完成加载。参考下面的示例代码:
 // PNG file, 注意图片的大小一定要是2的n次幂,尽量往大的用。
 texture = new Texture2D(1024, 512, TextureFormat.ARGB32, true, true) 
    {
         //下面是图片的一些具体参数
        filterMode = FilterMode.Trilinear,
         wrapMode = TextureWrapMode.Clamp,
         anisoLevel = 1
     };

     www.LoadImageIntoTexture(texture);

现在Unity3d动态加载只支持PNG或是JPG格式,具体参考文档http://docs.unity3d.com/ScriptReference/WWW.LoadImageIntoTexture.html

Unity3D 网络通信_HTTP

阅读数 1343

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