2017-05-05 12:51:26 u010838555 阅读数 4787
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

此篇博文解决的问题是:

     1、unity3d如何访问android SD卡的文件

     2、如果把android端代码以jar包形式由unity3d调用

闲话不多说,现在咱们进入正题。

一、unity3d如何访问android SD卡的文件

        实现效果是unity3d调用android相册或相机,选择一张图片剪裁后,将图片肯绘制到unity3d中。

        解决这个问题,首先需要明白的是unity3d的资源存放目录,因为unity3d支持跨平台特性,所以资源文件的存放必然遵循一定的规则,否则很可能在不同的平台上编译会出现问题。

Unity3D中的资源路径

Application.dataPath 此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。
Application.streamingAssetsPath 此属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。
Application.persistentDataPath 此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。
Application.temporaryCachePath 此属性用于返回一个临时数据的缓存目录。












android平台对应的资源路径

Application.dataPath /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath /data/data/xxx.xxx.xxx/cache






具体的Unity3d的资源及目录说明可参考:http://www.tuicool.com/articles/qMNnmm6 ,此处不再缀述。

因此如果我们想要访问andorid SD卡上的文件,必须使用持久化数据存储目录 Application.persistentDataPath,它在android上对应的目录为Android/data/xxx.xx.xx/files/ 文件夹。也就是说,unity3d读取android SD中的文件目录是固定的,这是一个私有目录。下面我们来实现这一功能。效果是,从相册中选择一张照片,剪裁后,讲照片保存到android app安装目录下的files文件夹中,然后由unity3d读取此图片,绘制到屏幕上。

1、我们创建一个Android工程,取名为UnitySDK,此工程的目的是把我们的android端代码打包成一个jar包,放入Unity3d中使用,这里使用的是Eclipse,记住包名需跟unity3D android配置里的包名保持一致。


2、把我们的项目设置为一个Library

   

3、从unity的安装目录中找出classes.jar包,不同电脑文件存放位置可能不同,Windows平台如果使用mono方式的话,此文件在\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes 中。将jar包引用到我们的项目中。

4、将MainActivity继承自UnityPlayerActivity 并移除setContentView()方法,这是因为UnityPlayerActivity 继承自Activity,它里面已经设置了unityPlayer作为界面渲染,如果不移除setContentView()方法,则会造成复写,看不到unity3d的界面。MainActivity里的代码如下:

public class MainActivity extends UnityPlayerActivity {
	Context mContext = null;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mContext = this;
	}
	// Unity中会调用这个方法,用于区分打开摄像机 开始本地相册
	public void TakePhoto(String str) {
		Intent intent = new Intent(mContext, WebViewActivity.class);
		intent.putExtra("type", str);
		this.startActivity(intent);
	}
}

   在此我们定义了一个TakePhoto方法,,同时将处理结果交给WebViewActivity处理。WebViewActivity的代码如下,它的作用是用于打开相册/相机,选择照片后,进行剪裁,最后将剪裁结果保存到Android/data/com.demo.unity/files/ 目录下供unity3d调用。

public class WebViewActivity extends Activity {

	ImageView imageView = null;

	public static final int NONE = 0;
	public static final int PHOTOHRAPH = 1;// 拍照
	public static final int PHOTOZOOM = 2; // 缩放
	public static final int PHOTORESOULT = 3;// 结果

	public static final String IMAGE_UNSPECIFIED = "image/*";

	public final static String FILE_NAME = "image.png";
	public final static String DATA_URL = "/data/data/";

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_webview);

		imageView = (ImageView) this.findViewById(R.id.imageID);

		String type = this.getIntent().getStringExtra("type");

		// 在这里判断是打开本地相册还是直接照相
		if (type.equals("takePhoto")) {
			Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")));
			startActivityForResult(intent, PHOTOHRAPH);
		} else {
			Intent intent = new Intent(Intent.ACTION_PICK, null);
			intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
			startActivityForResult(intent, PHOTOZOOM);
		}

	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == NONE)
			return;
		// 拍照
		if (requestCode == PHOTOHRAPH) {
			// 设置文件保存路径这里放在跟目录下
			File picture = new File(Environment.getExternalStorageDirectory() + "/temp.jpg");
			startPhotoZoom(Uri.fromFile(picture));
		}

		if (data == null)
			return;

		// 读取相册缩放图片
		if (requestCode == PHOTOZOOM) {
			startPhotoZoom(data.getData());
		}
		// 处理结果
		if (requestCode == PHOTORESOULT) {
			Bundle extras = data.getExtras();
			if (extras != null) {

				Bitmap photo = extras.getParcelable("data");
				imageView.setImageBitmap(photo);

				try {
					SaveBitmap(photo);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}

		super.onActivityResult(requestCode, resultCode, data);
	}

	public void startPhotoZoom(Uri uri) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
		intent.putExtra("crop", "true");
		// aspectX aspectY 是宽高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪图片宽高
		intent.putExtra("outputX", 300);
		intent.putExtra("outputY", 300);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, PHOTORESOULT);
	}

	public void SaveBitmap(Bitmap bitmap) throws IOException {

		FileOutputStream fOut = null;
		// 注解1
//		String path = "/mnt/sdcard/Android/data/com.xys/files";
		String path = "/storage/emulated/0/Android/data/com.demo.unity/files";
		try {
			// 查看这个路径是否存在,
			// 如果并没有这个路径,
			// 创建这个路径
			File destDir = new File(path);
			if (!destDir.exists()) {
				destDir.mkdirs();
			}

			fOut = new FileOutputStream(path + "/" + FILE_NAME);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		// 将Bitmap对象写入本地路径中,Unity在去相同的路径来读取这个文件
		bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
		try {
			fOut.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			fOut.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
              // 通知Unity开始在"/mnt/sdcard/Android/data/com.xys/files";路径中读取图片资源,并且现在在Unity中
	   	UnityPlayer.UnitySendMessage("Main Camera", "message", FILE_NAME);
		finish();
}}


注意 com.demo.unity是我项目的包名,实际使用过程中请注意替换。

WebViewActivity布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:layout_gravity="center"
        android:id="@+id/imageID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


Manifest中代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.demo.unity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />
    <!-- 连接互联网的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name="com.demo.unity.MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.demo.unity.TestActivity0"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
        </activity>
        <activity
            android:name="com.demo.unity.WebViewActivity"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
        </activity>
    </application>
</manifest>


      注意: 把android:theme换成android自带的主题


5、至此,android端代码基本编写完成,clean一下项目,在bin目录下找到 对应jar包,此jar包即为unity3d需要用到的jar包。

6、创建unity项目,并在Assets目录下依次创建 Plugins 和Android文件夹,将android 资源文件放到res目录下,Eclipse里的jar包,放到bin目录下,Manifest文件,放到 Android文件夹下:

      注意:values中的style文件、dimen文件不要复制过去



7、编写Main Camera 的 C#文件,MainControl,代码如下:

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

public class MainControl : MonoBehaviour {
	public GUISkin skin;
	Texture texture;
	string path="";
	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
		//当用户按下手机的返回键或home键退出游戏
		if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) )
		{
			Application.Quit();
		}
	}
	void OnGUI()
	{
		GUILayout.Button (path, GUILayout.Height (100));

		GUI.skin = skin;
		if(GUILayout.Button("打开手机相册",GUILayout.Height(100)))
		{
			//调用我们制作的Android插件打开手机相册
			AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
			jo.Call("TakePhoto","takeSave");

		}
		if(GUILayout.Button("打开手机摄像机",GUILayout.Height(100)))
		{
			//调用我们制作的Android插件打开手机摄像机
			AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
			jo.Call("TakePhoto","takePhoto");

		}
			

		if(texture != null)
		{
			//注意! 我们在这里绘制Texture对象,该对象是通过
			//我们制作的Android插件得到的,当这个对象不等于空的时候
			//直接绘制。
			GUI.DrawTexture(new Rect(300,300,600,600),texture);
		}
			

	}
	void message(string str){
		StartCoroutine(LoadTexture(str));
	}
	IEnumerator LoadTexture(string name)
	{
		//注解1
		 path  =  "file://" + Application.persistentDataPath +"/" + name;

		WWW www = new WWW(path);
		while (!www.isDone)
		{

		}
		yield return www;
		//为贴图赋值
		texture = www.texture;
	}
}


最后来张效果图~:




     源码地址:https://pan.baidu.com/s/1bo7ezDl    其中,UnityDemo为unity创建的项目,UnitySDK为android项目。


2015-09-25 09:58:00 allen332211 阅读数 42
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

string path = Application.dataPath + "/Resources/**";
DirectoryInfo theFolder = new DirectoryInfo(path);
FileInfo[] fileInfo = theFolder.GetFiles("*.png", SearchOption.TopDirectoryOnly);
foreach (FileInfo f in fileInfo)
{
  string str = f.Name;
}

转载于:https://www.cnblogs.com/laugher/p/4837308.html

2015-03-01 15:42:53 book_longssl 阅读数 1674
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

    



  介绍
  JSON是一个简单的,但功能强大的序列化数据格式。它定义了简单的类型,如布尔,数(int和float)和字符串,和几个数据结构:list和dictionnary。可以在http://JSON.org了解关于JSON的更多信息。
  litjson是用C #编写的,它的目的是要小,快速,易用。它使用了Mono框架。
  安装LitJSON
  将LitJSON编译好的dll文件通过Import New Asset的方式导入到项目中,再使用Using LitJSON即可使用JSONMapper类中的简便方法。dll的下载地址在这里.
  将JSON转化为Object并可逆向转化
  为了在.Net程序中使用JSON格式的数据。一个自然的方法是使用JSON文本生成一个特定的类的一个新实例;为了匹配类的格式,一般存储的JSON字符串是一个字典。
  另一方面,为了将对象序列化为JSON字符串,一个简单的导出操作,听起来是个好主意。
  为了这个目的,LitJSON包引入了JsonMapper类,它提供了两个用于做到 JSON转化为object 和 object转化为JSON 的主要方法。这两个方法是jsonmapper.toobject和jsonmapper.tojson。
  将object转化为字符串之后,我们就可以将这个字符串很方便地在文件中读取和写入了。
  一个简单的JsonMapper的例子
  在下面的例子中,ToObject方法有一个泛型参数,来指定返回的某种特定的数据类型:即JsonMapper.ToObjectT。
  
using LitJson;
  using System;
  public class Person
  {
  // C# 3.0 auto-implemented properties
  public string   Name     { get; set; }
  public int      Age      { get; set; }
  public DateTime Birthday { get; set; }
  }
  public class JsonSample
  {
  public static void Main()
  {
  PersonToJson();
  JsonToPerson();
  }
  public static void PersonToJson()
  {
  Person bill = new Person();
  bill.Name = "William Shakespeare";
  bill.Age  = 51;
  bill.Birthday = new DateTime(1564, 4, 26);
  string json_bill = JsonMapper.ToJson(bill);
  Console.WriteLine(json_bill);
  }
  public static void JsonToPerson()
  {
  string json = @"
  {
  ""Name""     : ""Thomas More"",
  ""Age""      : 57,
  ""Birthday"" : ""02/07/1478 00:00:00""
  }";
  Person thomas = JsonMapper.ToObjectPerson(json);
  Console.WriteLine("Thomas' age: {0}", thomas.Age);
  }
  }


  上文的输出:
  {"Name":"William Shakespeare","Age":51,"Birthday":"04/26/1564 00:00:00"}
  Thomas' age: 57
  使用非泛型的JsonMapper.ToObject
  当不存在特定的JSON数据类时,它将返回一个JSONData实例。JSONData是一种通用型可以保存任何数据类型支持JSON,包括list和dictionary。
  声明:此篇文档时来自于【狗刨学习网】社区-unity极致学院,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。
using LitJson;
  using System;
  public class JsonSample
  {
  public static void Main()
  {
  string json = @"
  {
  ""album"" : {
  ""name""   : ""The Dark Side of the Moon"",
  ""artist"" : ""Pink Floyd"",
  ""year""   : 1973,
  ""tracks"" : [
  ""Speak To Me"",
  ""Breathe"",
  ""On The Run""
  ]
  }
  }
  ";
  LoadAlbumData(json);
  }
  public static void LoadAlbumData(string json_text)
  {
  Console.WriteLine("Reading data from the following JSON string: {0}",
  json_text);
  JsonData data = JsonMapper.ToObject(json_text);
  // Dictionaries are accessed like a hash-table
  Console.WriteLine("Album's name: {0}", data["album"]["name"]);
  // Scalar elements stored in a JsonData instance can be cast to
  // their natural types
  string artist = (string) data["album"]["artist"];
  int    year   = (int) data["album"]["year"];
  Console.WriteLine("Recorded by {0} in {1}", artist, year);
  // Arrays are accessed like regular lists as well
  Console.WriteLine("First track: {0}", data["album"]["tracks"][0]);
  }
  }
  上面例子的输出:
  Reading data from the following JSON string:
  {
  "album" : {
  "name"   : "The Dark Side of the Moon",
  "artist" : "Pink Floyd",
  "year"   : 1973,
  "tracks" : [
  "Speak To Me",
  "Breathe",
  "On The Run"
  ]
  }
  }
  Album's name: The Dark Side of the Moon
  Recorded by Pink Floyd in 1973
  First track: Speak To Me
  Reader和Writer
  一些人喜欢使用stream的方式处理JSON数据,对于他们, 我们提供的接口是jsonreader和jsonwriter。
  JSONMapper实际上是建立在以上两个类的基础上的,所以你可以把这两个类当成是litJSON的底层接口。
  使用JsonReader
  using LitJson;
  using System;
  public class DataReader
  {
  public static void Main()
  {
  string sample = @"{
  ""name""  : ""Bill"",
  ""age""   : 32,
  ""awake"" : true,
  ""n""     : 1994.0226,
  ""note""  : [ ""life"", ""is"", ""but"", ""a"", ""dream"" ]
  }";
  PrintJson(sample);
  }
  public static void PrintJson(string json)
  {
  JsonReader reader = new JsonReader(json);
  Console.WriteLine ("{0,14} {1,10} {2,16}", "Token", "Value", "Type");
  Console.WriteLine (new String ('-', 42));
  // The Read() method returns false when there's nothing else to read
  while (reader.Read()) {
  string type = reader.Value != null ?
  reader.Value.GetType().ToString() : "";
  Console.WriteLine("{0,14} {1,10} {2,16}",
  reader.Token, reader.Value, type);
  }
  }
  }


  输出如下:
  
Token      Value             Type
  ------------------------------------------
  ObjectStart                           
  PropertyName       name    System.String
  String       Bill    System.String
  PropertyName        age    System.String
  Int         32     System.Int32
  PropertyName      awake    System.String
  Boolean       True   System.Boolean
  PropertyName          n    System.String
  Double  1994.0226    System.Double
  PropertyName       note    System.String
  ArrayStart                           
  String       life    System.String
  String         is    System.String
  String        but    System.String
  String          a    System.String
  String      dream    System.String
  ArrayEnd                           
  ObjectEnd





2013-10-23 17:02:21 lzhq1982 阅读数 11997
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

http://blog.csdn.net/lzhq1982/article/details/12968309


在mac os下写过手游程序的应该都清楚csv文件,它类似于excel表格文件,但csv文件里的数据是以逗号分隔的。unity3d并未提供直接读取csv文件的方法,那怎么办呢,没关系,很简单,下面看我是怎么做到的。先声明,我的操作系统是mac os。


1、创建csv文件

既然做实验嘛,没有资源怎么行,自己徒手写个csv文件吧,打开Numbers工具,新建一个表格文件,我的文件编辑截图如下:


创建完成后,导出成csv格式,我这里文件名为test.csv;


2、改成txt格式

既然unity3d不认识csv,那么我们人工处理一下,很简单,像上一篇文章一样,简单粗暴的把csv的扩展名改成txt吧,谁让unity3d比较亲txt呢,更改后是test.txt,打开后是这个样子的:


3、读取txt文件

上代码:

private string [][]Array;
void Start ()
{
	//读取csv二进制文件
	TextAsset binAsset = Resources.Load ("test", typeof(TextAsset)) as TextAsset;		
		
	//读取每一行的内容
	string [] lineArray = binAsset.text.Split ("\r"[0]);
 		
 	//创建二维数组
	Array = new string [lineArray.Length][];
		
	//把csv中的数据储存在二位数组中
	for(int i =0;i < lineArray.Length; i++)
	{
 		Array[i] = lineArray[i].Split (',');
	}
}
先读取test文件,这里要注意,你要把test文件放到Asset的Resources目录下,没有这个目录就自己创建一个。因为每一行结尾都会有个“\r”,所以用这个可以分隔出每行数据,然后我们创建一个二维数组Array,行数用上一句求出的行数据,列数待定。因为每一行的数据都是用“,”分隔符分开的,所以我们用逗号分隔出每列数据,再以行为单位保存在Array中。现在你打印Array.Length应该是5,表示行数,Array[0].Length应该是3,表示列数。


4、以行列数读取数据

string GetDataByRowAndCol(int nRow, int nCol)
{
	if (Array.Length <= 0 || nRow >= Array.Length)
		return "";
	if (nCol >= Array[0].Length)
		return "";
		
	return Array[nRow][nCol];
}
这个代码很简单,前面都是行列越界判断,没啥好说的,这时打印GetDataByRowAndCol(1,2)应该是“这是苹果”。

5、以Id和名称读取数据

这应该是项目最常用到的,以行列的名称定位数据。

string GetDataByIdAndName(int nId, string strName)
{
	if (Array.Length <= 0)
		return "";
		
	int nRow = Array.Length;
	int nCol = Array[0].Length;		
	for (int i = 1; i < nRow; ++i) {
		string strId = string.Format("\n{0}", nId);
		if (Array[i][0] == strId) {
			for (int j = 0; j < nCol; ++j) {
				if (Array[0][j] == strName) {
					return Array[i][j];
				}
			}
		}
	}
		
	return "";
}
上面代码也很简单,先循环行数据,判断ID是否相同,找到ID后再循环列数据,看名称是否相同,然后返回行列对应的数据。这里有一点值得注意,就是判断Id的时候,id前面会有个“\n”,这是换行标识符,你可以用Debug的方式看一下Array,除了第一行,每一行的Id都会有个“\n”的前缀,所以必须这么判断。这时打印GetDataByIdAndName(4,"name")应该是“梨”。

就这些,有问题欢迎提问,哈哈。


2019-05-23 14:29:14 weixin_42224118 阅读数 230
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

在Unity3D中读取外部文本文件的方法有很多,这里记录一种读取XML文件的方法。
仅限PC端
首先是XML文件,命名为:xmlData.xml

<item>
       <data1>
         <id>1</id>
         <name>china</name>
         <year>2019</year>
         <sex>男</sex>
       </data1>
       <data2>
         <id>2</id>
         <name>usa</name>
         <year>2017</year>
         <sex>女</sex>
       </data2>
</item>

下面是代码部分:
引用命名空间:

using System.Xml;
using System.IO;
using UnityEngine.UI;

在UI文本中显示读取的数据,创建Text文本显示:

 public Text text1;
 public Text text2;
 public Text text3;
 public Text text4;

读取路径:
这里读取的是存放在StreamingAssets文件中的xml文件。

string filePath = Application.streamingAssetsPath + "/xmlData.xml";

后续代码:

 //检查文件是否存在,并进行实例化
if (File.Exists(filePath))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filePath);
            XmlNodeList node = xmlDoc.SelectSingleNode("item").ChildNodes;
              //遍历节点
              foreach (XmlElement x1 in node)
            {         
                if (x1.Name == "data1")
                {
                    foreach (XmlElement data1 in x1.ChildNodes)
                    {
                    Debug.LogFormat("Name:{0},InnerText:{1} \n", data1.Name, data1.InnerText);     
                     //以名称进行判断
                     switch (data1.Name)
                     {
                            case "id":
                                text1.text = data1.InnerText;
                                break;
                            case "name":
                                text2.text = data1.InnerText;
                                break;
                            case "year":
                                text3.text = data1.InnerText;
                                break;
                            case "sex":
                                text4.text = data1.InnerText;
                                break;
                        }
                     }
                  }
               } 
            } 

测试:
在这里插入图片描述

在这里插入图片描述
打包后,将StreamingAssets中的xmlData.xml文件进行修改,把2016改为2019,效果如下:

1
成功。

Unity3D读取文件

阅读数 830

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