2018-03-27 09:22:38 qq874455953 阅读数 4707

利用Unity3D制作简易2D计算器

标签(空格分隔): uiniy3D


1. 操作流程

在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D)
在这里插入图片描述
在Assets框右键新建C#脚本
![此处输入图片的描述][2]

在新建的C#脚本中写入下列代码

代码下载地址

https://download.csdn.net/download/qq874455953/10310274

https://github.com/wangjiwu/simple-2D-cacluator

把脚本拖入到Main Camera中

![此处输入图片的描述][4]
运行查看结果
在这里插入图片描述

附一个用Unity3D实现井字棋的博客
Unity IMGUI 的小游戏(井字棋)制作以及怎么发布为安卓apk并且发给女孩子手机上成功运行的教程 - 3D游戏编程学习日志

2018-08-22 20:05:24 qq_36684665 阅读数 1036

一、开局先上个小键盘效果图(UI为NGUI所制作,这里不再赘述)

二、代码部分(代码可扩展部分非常强)

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

public class SmallKeyboard : MonoBehaviour
{
    public enum KeyboardType
    {
        Number = 0,
        Character = 1,
        EnterKey = 2,
        BackSpace = 3
    }
    [Serializable]
    public class CUIKeyInfo
    {
        public GameObject KeyObj;
        public KeyboardType KeyType;
        public string SValue;
    }

    //输入的值
    public string strInput = "";
    public List<CUIKeyInfo> list = new List<CUIKeyInfo>();

    string sReslut = "";
    private void ProcessKeyEvent(CUIKeyInfo _info)
    {
        if (_info.KeyType == KeyboardType.Character || _info.KeyType == KeyboardType.Number)
        {
            //这里注意光标,如果光标移动到不是最后一个元素的某个位置,要考虑插入的方法
            //sReslut = sReslut.Insert(strTarget.IndexOf(cursorIndex), _info.SValue);
            sReslut += _info.SValue;
        }
        else if (_info.KeyType == KeyboardType.BackSpace)
        {
            //这里注意光标,如果光标移动到不是最后一个元素的某个位置,要考虑中间删除的方法
            //sReslut = sReslut.Remove(cursorIndex -1,cursorIndex);
            sReslut = sReslut.Remove(sReslut.Length - 1, sReslut.Length);
        }
        else if (_info.KeyType == KeyboardType.EnterKey)
        {
            Debug.LogError("sResult = " + sReslut);
        }
    }
    private void ClickButton(GameObject go)
    {
        for (int i = 0; i < list.Count; i++)
        {
            if (list[i].KeyObj == go)
            {
                ProcessKeyEvent(list[i]);
                break;
            }
        }

    }
    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < list.Count; i++)
        {
            CUIKeyInfo info = list[i];
            UIEventListener.Get(info.KeyObj).onClick = ClickButton;
        }
    }
}

三、挂载脚本部分

注意:本资源为原创,转载请注明出处。请勿用作商业用途

2017-01-05 15:05:09 pz789as 阅读数 4496

参考:http://blog.csdn.net/pz789as/article/details/54093140


在网上看到很多资料,都是用的以前老的属性了,强迫症发作,只好自己动手将过期的属性都改了

本来是方法我是从网上找的,自己懒得去解析fnt文件了,于是想到了以前用的NGUI就有专门处理fnt文件的类,于是就下了一个最新的NGUI,把里面的这几个类拷贝了过来:



然后自己写了一个类,显示在unity的菜单栏里面:


需要把这个文件放到Editor下面才会起作用!

然后看实现:

//本方法是通过BMFont导出的fnt和字体图片来导出字体文件的,使用时,只需要选择图片或者fnt文件即可,但是图片和字体文件的名字必须要保持一致,除了后缀名。
	//如果不一样,则将两个文件都选中,导出的名字以最后选择的文件为基准,但是推荐把他们的名字统一,预防出现差错。
	[MenuItem("Assets/CreateMyFont")]
    static void CreateMyFont(){
		if (Selection.objects == null) return;
		if (Selection.objects.Length == 0) {
			Debug.LogWarning("没有选中fnt文件,或者图片文件");
			return;
		}
		//至少需要保证选中文件的目录下面有fnt文件,否则不会生成字体
		Font m_myFont = null;
		TextAsset m_data = null;
		string filePath = "";
		Material mat = null;
		Texture2D tex = null;
		bool bln = false;
		//不管选中fnt、png、mat、fontsettings其中的任何一个,都可以创建字体
		foreach(UnityEngine.Object o in Selection.objects){
			if (o.GetType() == typeof(TextAsset)){
				m_data = o as TextAsset;
				bln = true;
			}else if (o.GetType() == typeof(Material)){
				mat = o as Material;
				bln = true;
			}else if (o.GetType() == typeof(Texture2D)){
				tex = o as Texture2D;
				bln = true;
			}else if (o.GetType() == typeof(Font)){
				m_myFont = o as Font;
				bln = true;
			}
			if (bln){
				filePath = AssetDatabase.GetAssetPath(o);
				filePath = filePath.Substring(0, filePath.LastIndexOf('.'));
			}
		}
		//获取fnt文件,我们在这里加一次判断,为了可以直接选择图片也能导出字体
		string dataPathName = filePath + ".fnt";
		if (m_data == null){
			m_data = (TextAsset)AssetDatabase.LoadAssetAtPath(dataPathName, typeof(TextAsset));
		}
		if (m_data != null){
			string matPathName = filePath + ".mat";
			string fontPathName = filePath + ".fontsettings";
			string texPathName = filePath + ".png";

			//获取图片,如果没有图片,不影响,可以生成之后,再手动设置
			if (tex == null){
				tex = (Texture2D)AssetDatabase.LoadAssetAtPath(texPathName, typeof(Texture2D));
			}
			if (tex == null){
				Debug.LogWarning("没找到图片,或者图片名称和fnt文件名称不匹配");
			}

			//获取材质,如果没有则创建对应名字的材质
			if (mat == null){
				mat = (Material)AssetDatabase.LoadAssetAtPath(matPathName, typeof(Material));
			}
			if (mat == null){
				mat = new Material(Shader.Find("GUI/Text Shader"));
				AssetDatabase.CreateAsset(mat, matPathName);
			}else{
				mat.shader = Shader.Find("GUI/Text Shader");
			}
			mat.SetTexture("_MainTex", tex);

			//获取font文件,如果没有则创建对应名字的font文件
			if (m_myFont == null){
				m_myFont = (Font)AssetDatabase.LoadAssetAtPath(fontPathName, typeof(Font));
			}
			if (m_myFont == null){
				m_myFont = new Font();
				AssetDatabase.CreateAsset(m_myFont, fontPathName);
			}
			m_myFont.material = mat;

			BMFont mbFont = new BMFont();
			//借助NGUI的类,读取字体fnt文件信息,可以不用自己去解析了
			BMFontReader.Load(mbFont, m_data.name, m_data.bytes);
			CharacterInfo[] characterInfo = new CharacterInfo[mbFont.glyphs.Count];
			for(int i=0;i<mbFont.glyphs.Count;i++){
				BMGlyph bmInfo = mbFont.glyphs[i];
				CharacterInfo info = new CharacterInfo();
				//设置ascii码
				info.index = bmInfo.index;
				//设置字符映射到材质上的坐标
				info.uvBottomLeft = new Vector2((float)bmInfo.x/mbFont.texWidth, 1f-(float)(bmInfo.y+bmInfo.height)/mbFont.texHeight);
				info.uvBottomRight = new Vector2((float)(bmInfo.x+bmInfo.width)/mbFont.texWidth, 1f-(float)(bmInfo.y+bmInfo.height)/mbFont.texHeight);
				info.uvTopLeft = new Vector2((float)bmInfo.x/mbFont.texWidth, 1f-(float)(bmInfo.y)/mbFont.texHeight);
				info.uvTopRight = new Vector2((float)(bmInfo.x+bmInfo.width)/mbFont.texWidth, 1f-(float)(bmInfo.y)/mbFont.texHeight);
				//设置字符顶点的偏移位置和宽高
				info.minX = bmInfo.offsetX;
				info.minY = -bmInfo.offsetY-bmInfo.height;
				info.maxX = bmInfo.offsetX+bmInfo.width;
				info.maxY = -bmInfo.offsetY;
				//设置字符的宽度
				info.advance = bmInfo.advance;
				characterInfo[i] = info;
			}
			m_myFont.characterInfo = characterInfo;
			EditorUtility.SetDirty(m_myFont);//设置变更过的资源
			EditorUtility.SetDirty(mat);//设置变更过的资源
			AssetDatabase.SaveAssets();//保存变更的资源
			AssetDatabase.Refresh();//刷新资源,貌似在Mac上不起作用

			//由于上面fresh之后在编辑器中依然没有刷新,所以暂时想到这个方法,
			//先把生成的字体导出成一个包,然后再重新导入进来,这样就可以直接刷新了
			//这是在Mac上遇到的,不知道Windows下面会不会出现,如果不出现可以把下面这一步注释掉
			AssetDatabase.ExportPackage(fontPathName, "temp.unitypackage");
			AssetDatabase.DeleteAsset(fontPathName);
			AssetDatabase.ImportPackage("temp.unitypackage", true);
			AssetDatabase.Refresh();

			Debug.Log("创建字体成功");
		}else{
			Debug.LogWarning("没有找到fnt文件,或者文件名称和图片名称不匹配");
		}
    }

代码也没什么可以说的,上面都带了注释。

主要改动是在计算uv和vert这里了,因为新版本建议不要使用uv和vert,改用uvLeftTop等等~也要跟着进步嘛~

我自己还加入了文件判断,这样可以根据你选择的文件进行字体生成过程,但是在文件夹目录下方必须要存在fnt文件,否则无法导出字体。

这里我在最后多做了一步,本来按照Unity的逻辑,我设置了SetDirty之后,这个资源理论上说应该会刷新的,但是我在实际使用的时候,每次导出完毕没有错误,但是.fontsettings的文件并没有改变。后面在多次尝试之后发现,如果将生成的字体导出成package,然后再导入进来或者关闭unity重新打开,这个就能正常使用。所以在最后我又添加了自动导出导入,最后完成之后,只要点一下import就可以使用新制作的字体了。

上面这个问题是5.5 的 mac版本上出现的,不知道windows版本会不会有这个问题,不过无关紧要,这么写两遍都能够使用~

2015-02-01 23:13:45 Carl180 阅读数 1055

简介:

1、Unity3D的游戏引擎是和编辑器集成在一起的,所有它也是一个制作/开发平台。

2、Unity3D是使用JavaScript、C#作为核心脚本语言来驱动事个游戏引擎。

3、平台可以发布Exe执行文件或者打包为可供网页调用的一个独立的包文件。

4、用Unity3D制作的工程具有高度的可移植性,可以在PS xbox360 Android iPhone mac等系统上运行。

该文章出自【狗刨学习网】


嵌入网页:

1、用Unity3D实现嵌入网页和Flash插入网页原理完全一致,也是使用ActiveX控件嵌入在网页中。所以和Flash一样,需要安装一个播放器插件(小于3M)。


2、查看页面源码,可以看到如下嵌入部分:


         

         


3、和Flash一样,在浏览器中加载3D场景或者读取时的图标进度条都能进行自定义,也可以自定义是否激活是用右键菜单。



数据交互


1、在Unity3D中调用网页js函数


       如果我们在html中有脚本函数;则在u3d中我们可用使用Application.ExternalCall调用js函数,该方法只适合在Web3D环境下使用。该方法支持基本类型的传递和数组传递,任何类型都会转换成字符串类型使用。


例子代码:


       Application.ExternalCall("SayHello","The game says hello!);//调用SayHello,传递一个字符串


2、在Unity3D中直接执行一段脚本代码如:


      Application.ExternalEval("if(document.location.host!='unity3d.com'){document.location='http://unity3d.com';}");


3、在js中调用Unity3D函数(传递消息等)


      如果有Unity3D中有一段用JS写的功能函数:


      function MyFunction(param:String)

      {

              Debug.Log(param);

      }


      需要在JS中呼叫这个函数则可以这样写:



      这里要注意的是MyObject代表Unity3D中的一个场景名称为MyObject,MyFunction是调用的函数,最后一个字符为传递的参数。


与php,jsp等的表单数据交互


         与php,jsp等的表单数据交互很可能会是今后用到的主要方式,原理是利用form表彰传递数据,下面以php为例来进行说明。


         Unity3D可以实现向某个指定页面发送表单数据然后在php中使用_POST获取传递回来的表彰数据。比如:



         在Unity3D中我们发送数据的代码如下:


         var form = new WWWForm();//定义一个网页表单

         form.AddField("myform_action","Action1");//添加一个表彰字段名称为myform_action内容是action1

         var download = new WWW("www.xxx.com/index.php",form);//发送表单数据到指定网址页面

        假如index.php执行的是数据库/统计操作,我们就可以对传递的数据进行保存读取或者其他操作了。


2016-09-09 14:34:04 u011611902 阅读数 1619

Xml的方便之处:方便配置,也方便热更新,方便数据读取。

unity3d读取xml有好几种方式,最简单是直接利用System.Xml读取xml,但是项目打包会比较大,增加了1M的资源占用。另外两个是利用其他轻量级xml库来实现,如Mono.Xml、XMLParser。Mono.Xml是c#写的,XMLParser是js写的。文章主要说明Mono.Xml的用法。

为什么不建议使用System.Xml,unity的解释如下:https://docs.unity3d.com/355/Documentation/Manual/ReducingFilesize.html

When building a player (Desktop, Android or iOS) it is important to not depend on System.dll or System.Xml.dll. Unity does not include System.dll or System.Xml.dll in the players installation. That means, if you want to use Xml or some Generic containers which live in System.dll then the required dlls will be included in the players. This usually adds 1mb to the download size, obviously this is not very good for the distribution of your players and you should really avoid it. If you need to parse some Xml files, you can use a smaller xml library like this one Mono.Xml.zip. While most Generic containers are contained in mscorlib, Stack<> and few others are in System.dll. So you really want to avoid those.

总结是:为了减少包体大小。ios版本对System.Xml支持不是很好。

官方下载地址:https://docs.unity3d.com/355/Documentation/Images/manual/Mono.Xml.zip

csdn下载地址:http://download.csdn.net/detail/cwqcwk1/7105071

XmlVo=>baseVo=>GameConfig.PetMaxLevel。

项目中源码部分,https://github.com/zhutaorun/SomeTips/tree/master/Assets/Scripts/Tools

MiniParser,SmallXmlParser,MiniParser是Mono.Xml.zip主要内容

PathUtils.cs 获取StreamingAssets文件下的xml文件,同时实现xml热更新对模块管理。根据平台不同获取不同路径

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

public class PathUtils
{

    public static string GetStreamFilePath(string fileUrl)
    {
        string path = "";
        if (fileUrl.ToLower().IndexOf("http://") == 0)
            return fileUrl;
        if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor)
        {
            path = "file://"+Application.streamingAssetsPath+"/"+fileUrl;
        }
        else if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            path = "file://"+Application.streamingAssetsPath+"/"+fileUrl;
        }
        else if(Application.platform ==RuntimePlatform.Android)
        {
            path = "jar:file://"+Application.dataPath+"!/assets/"+fileUrl;
        }
        else
        {
            path = Application.dataPath + "/config/" + fileUrl;
        }
        return path;
    }

    public static string GetPersistebrFilePath(string filename)
    {
        string filepath;
        if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.OSXWebPlayer ||
            Application.platform == RuntimePlatform.WindowsEditor ||
            Application.platform == RuntimePlatform.WindowsPlayer)
            filepath = "file://"+Application.dataPath+"/StreamingAssets/+filename";
        else if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android)
            filepath = Application.persistentDataPath + "/" + filename;
        else
        {
            filepath = Application.persistentDataPath + "/" + filename;
        }
#if UNITY_IPHONE
            iphone.SetNoBackupFlag(filepath);
#endif
        return filepath;
    }

}

参考 http://blog.csdn.net/mycwq/article/details/19813779

系统漫游

阅读数 164

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