2014-10-01 16:21:48 u014749760 阅读数 1431
  • Unity3D棋盘游戏实战入门——2D智力拼图

    本课程使用Unity3d开发软件和C#编程语言,从零开始逐步完成一个2D拼图游戏项目。在本课程中,你可以了解并学习到游戏工程的创建和文件结构的维护、Unity3D的射线检测机制、插值插件Itween的使用、游戏数据的离线保存,并初步了解Unity3D的粒子系统和动画系统。

    802 人正在学习 去看看 伍晓波

Unity 3D 文件导入出错

安装unity 时我选择了free版的,打开已有项目时出现如下错误提示



解决办法:

先把要导入的文件先拷贝到unity3d安装目录下对应的文件夹内,之后再返回unity3d软件,右键选择“导入”。


2017-11-26 19:20:07 ax1274669874 阅读数 1168
  • Unity3D棋盘游戏实战入门——2D智力拼图

    本课程使用Unity3d开发软件和C#编程语言,从零开始逐步完成一个2D拼图游戏项目。在本课程中,你可以了解并学习到游戏工程的创建和文件结构的维护、Unity3D的射线检测机制、插值插件Itween的使用、游戏数据的离线保存,并初步了解Unity3D的粒子系统和动画系统。

    802 人正在学习 去看看 伍晓波

Unity3D游戏本地存储


Unity3D游戏本地存储玩家积分。Unity提供了一个类似配置文件的类,可以非常好的实现信息数据的存储,那就是PlayerPrefs。它可以存储:int、float和string类型。

// 存进去

PlayerPrefs.SetInt("key1", 10);

PlayerPrefs.SetString("key2", aaaaaa);

PlayerPrefs.SetFloat("key3", 10.009);

// 取出来

int i = PlayerPrefs.GetInt("key1");


unity3d保存文件到本地and加载本地文件
001.using UnityEngine;
002.using System.Collections;
003.using System.IO;
004.using System.Collections.Generic;
005.using System;
006.  
007.public class Text : MonoBehaviour {
008.    //文本中每行的内容
009.    ArrayList infoall;
010.    //皮肤资源,这里用于显示中文
011.    public GUISkin skin;
012.    void Start ()
013.    {
014.        print("当前文件路径:"+Application.persistentDataPath);
015.        //删除文件
016.        DeleteFile(Application.persistentDataPath,"FileName.txt");
017.  
018.        //创建文件,共写入3次数据
019.        CreateFile(Application.persistentDataPath,"FileName.txt","dingxiaowei");
020.        CreateFile(Application.persistentDataPath,"FileName.txt","丁小未");
021.        //CreateFile(Application.persistentDataPath ,"Filename.assetbundle","丁小未");
022.        //下载模型
023.        StartCoroutine(loadasset("http://192.168.1.180/3DShowResource/Products/AssetBundles/HX_DY02.assetbundle"));
024.        //得到文本中每一行的内容
025.        infoall = LoadFile(Application.persistentDataPath,"FileName.txt");
026. 
027.         
028.    }
029.    //写入模型到本地
030.    IEnumerator loadasset(string url)
031.    {
032.        WWW w = new WWW(url);
033.        yield return w;
034.        if (w.isDone)
035.        {
036.            byte[] model = w.bytes;
037.            int length = model.Length;
038.            //写入模型到本地
039.            CreateModelFile(Application.persistentDataPath, "Model.assetbundle", model,length);
040.        }
041.    }
042. 
043.    void CreateModelFile(string path, string name, byte[] info, int length)
044.    {
045.        //文件流信息
046.        //StreamWriter sw;
047.        Stream sw;
048.        FileInfo t = new FileInfo(path + "//" + name);
049.        if (!t.Exists)
050.        {
051.            //如果此文件不存在则创建
052.            sw = t.Create();
053.        }
054.        else
055.        {
056.            //如果此文件存在则打开
057.            //sw = t.Append();
058.            return;
059.        }
060.        //以行的形式写入信息
061.        //sw.WriteLine(info);
062.        sw.Write(info, 0, length);
063.        //关闭流
064.        sw.Close();
065.        //销毁流
066.        sw.Dispose();
067.    }
068.  
069.   /**
070.   * path:文件创建目录
071.   * name:文件的名称
072.   *  info:写入的内容
073.   */
074.   void CreateFile(string path,string name,string info)
075.   {
076.      //文件流信息
077.      StreamWriter sw;
078.      FileInfo t = new FileInfo(path+"//"+ name);
079.      if(!t.Exists)
080.      {
081.        //如果此文件不存在则创建
082.        sw = t.CreateText();
083.      }
084.      else
085.      {
086.        //如果此文件存在则打开
087.        sw = t.AppendText();
088.      }
089.      //以行的形式写入信息
090.      sw.WriteLine(info);
091.      //关闭流
092.      sw.Close();
093.      //销毁流
094.      sw.Dispose();
095.   }
096. 
097.    
098.  
099.  /**
100.   * 读取文本文件
101.   * path:读取文件的路径
102.   * name:读取文件的名称
103.   */
104.   ArrayList LoadFile(string path,string name)
105.   {
106.        //使用流的形式读取
107.        StreamReader sr =null;
108.        try{
109.            sr = File.OpenText(path+"//"+ name);
110.        }catch(Exception e)
111.        {
112.            //路径与名称未找到文件则直接返回空
113.            return null;
114.        }
115.        string line;
116.        ArrayList arrlist = new ArrayList();
117.        while ((line = sr.ReadLine()) != null)
118.        {
119.            //一行一行的读取
120.            //将每一行的内容存入数组链表容器中
121.            arrlist.Add(line);
122.        }
123.        //关闭流
124.        sr.Close();
125.        //销毁流
126.        sr.Dispose();
127.        //将数组链表容器返回
128.        return arrlist;
129.   } 
130. 
131.    //读取模型文件
132.   IEnumerator LoadModelFromLocal(string path, string name)
133.   {
134.       print("file:///" + path + "/" + name);
135.       WWW w = new WWW("file:///"+path + "/" + name);
136.       yield return w;
137.       if (w.isDone)
138.       {
139.           Instantiate(w.assetBundle.mainAsset);
140.       }
141.   }
142. 
143.  
144.  /**
145.   * path:删除文件的路径
146.   * name:删除文件的名称
147.   */
148.  
149.   void DeleteFile(string path,string name)
150.   {
151.        File.Delete(path+"//"+ name);
152.   }
153.  
154.   void OnGUI()
155.   {
156.        //用新的皮肤资源,显示中文
157.        GUI.skin = skin;
158.        //读取文件中的所有内容
159.        foreach(string str in infoall)
160.        {
161.            //绘制在屏幕当中
162.            GUILayout.Label(str);
163.        }
164.        if (GUILayout.Button("加载模型"))
165.        {
166.            StartCoroutine(LoadModelFromLocal(Application.persistentDataPath, "Model.assetbundle"));
167.        }
168.   }
169.  
170.}


2017-09-23 17:37:24 qq_36203347 阅读数 344
  • Unity3D棋盘游戏实战入门——2D智力拼图

    本课程使用Unity3d开发软件和C#编程语言,从零开始逐步完成一个2D拼图游戏项目。在本课程中,你可以了解并学习到游戏工程的创建和文件结构的维护、Unity3D的射线检测机制、插值插件Itween的使用、游戏数据的离线保存,并初步了解Unity3D的粒子系统和动画系统。

    802 人正在学习 去看看 伍晓波

Unity3d 中使用Json读取文件
需要导入 LitJson.dll的动态链接库,然后再代码里使用命名空间
调用

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

public class PlayerInfo
{
    public PlayerInfo()
    {
        name="default";
        level=0;
    }
    string name;
    int level;
}

public classPlayerCtrl:MonoBehaviour
{
    string path=Application.dataPath+"/playerInfo.json";
    void Start()
    {
        Save(path);
        Load(path);
    }

    //根据路径读取数据并且用Json解析
    void Load(string path)
    {
        string[] strs=File.ReadAllLines(path);
        List<PlayerInfo> allInfo=new List<PlayerInfo>();

        foreash(string str in strs)
        {
            PlayerInfo info=JsonMapper.ToObject<PlayerInfo>(str);
            allInfo.Add(info);
        }   
    }

    void Save(string path)
    {
        List<string> pInfos;
        //存储操作,先判断路径下面是否有文件
        //——如果有,就在文件内的数据追加数据
        //——如果没有,就在路径下创建出一个想要的文件,并进行存储
        if(File.Exists(path))
        {
            string[] allInfo=File.ReadAllLines(path);
            pInfos=new List<string>(allInfo);
        }
        else
        {
            allInfo=new List<string>();
        }

        PlayerInfo info=new PlayerInfo();//初始化玩家信息
        //此处可以进行一些玩家数据处理的操作

        string nowInfo=JsonMapper.ToJson(info);
        allInfo.Add(nowInfo);
        File.WriteAllLines(path,allInfo.ToArray());//将数据存储到路径下
    }
}

以上为今天掌握内容

2017-05-05 12:51:26 u010838555 阅读数 4831
  • Unity3D棋盘游戏实战入门——2D智力拼图

    本课程使用Unity3d开发软件和C#编程语言,从零开始逐步完成一个2D拼图游戏项目。在本课程中,你可以了解并学习到游戏工程的创建和文件结构的维护、Unity3D的射线检测机制、插值插件Itween的使用、游戏数据的离线保存,并初步了解Unity3D的粒子系统和动画系统。

    802 人正在学习 去看看 伍晓波

此篇博文解决的问题是:

     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项目。


2019-04-12 10:19:10 luoyikun 阅读数 216
  • Unity3D棋盘游戏实战入门——2D智力拼图

    本课程使用Unity3d开发软件和C#编程语言,从零开始逐步完成一个2D拼图游戏项目。在本课程中,你可以了解并学习到游戏工程的创建和文件结构的维护、Unity3D的射线检测机制、插值插件Itween的使用、游戏数据的离线保存,并初步了解Unity3D的粒子系统和动画系统。

    802 人正在学习 去看看 伍晓波
using System.IO;
using UnityEngine;

public class MyLogCallback : MonoBehaviour {

    FileInfo fileInfo;

    StreamWriter m_writer;
    System.Text.UTF8Encoding encoding;
    // Use this for initialization
    void Start()
    {
        string path;
#if UNITY_EDITOR
        path = Application.streamingAssetsPath;
#else
        path = Application.persistentDataPath;
#endif
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        path += "/log.txt";
        if (File.Exists(path) == true)
        {
            File.Delete(path);
        }

        FileInfo file = new FileInfo(path);
        m_writer = file.CreateText();

        Application.logMessageReceived += LogCallback;

        DontDestroyOnLoad(gameObject);
    }

    void LogCallback(string condition, string stackTrace, LogType type)
    {
        string content = "";
        content += System.DateTime.Now + ":" + type.ToString() + ": " + "\r\n" +
         "condition" + ": " + condition + "\r\n" +
         "stackTrace" + ": " + stackTrace + "\r\n" +
         "--------------------------------------" + "\r\n";

     
        m_writer.Write(content);
    }

    void Stop()
    {
#if UNITY_EDITOR
        if (UnityEditor.EditorApplication.isPlaying == false)
        {
            if (m_writer != null)
            {
                m_writer.Close();
                m_writer.Dispose();
            }
            Application.logMessageReceived -= LogCallback;
        }
#endif
    }
    void OnDestroy()
    {
        if (m_writer != null)
        {
            m_writer.Close();
            m_writer.Dispose();
        }
        Application.logMessageReceived -= LogCallback;
    }
}



unity3D加密

阅读数 677

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