Browsed by
分类:Unity3D

使LitJson支持Unity的类型

使LitJson支持Unity的类型

在使用LitJson时,会发现不支持Unity的Vector3等类型,更为奇怪的是在Unity的Editor模式下是正常的,在真机设备上不行了,今天查看源码终于找到原因了。

LitJson本身为支持Unity已经定义了一个类UnityTypeBindings,局部代码如下:

#if UNITY_EDITOR
[UnityEditor.InitializeOnLoad]
#endif
public static class UnityTypeBindings {

   static bool registerd;

   static UnityTypeBindings(){
      Register();
   }

就是因为在UNITY_EDITOR下加了标签[UnityEditor.InitializeOnLoad],所以在编辑器模式下支持Vector3等类型,因此只需要在项目加上如下代码即可:

UnityTypeBindings.Register()

参照以下注册方法,可实现自定义类型的Json序列化支持

Action<Vector2,JsonWriter> writeVector2 = (v,w) => {
   w.WriteObjectStart();
   w.WriteProperty("x",v.x);
   w.WriteProperty("y",v.y);
   w.WriteObjectEnd();
};

JsonMapper.RegisterExporter<Vector2>((v,w) => {
   writeVector2(v,w);
});

参考资料:
LitJson官网:http://lbv.github.io/litjson/
Unity之查找资源被哪里引用了

Unity之查找资源被哪里引用了

有时候要删除一个资源,就需要先查看下被哪里引用了,防止误删。Unity提供了一个方法 AssetDatabase.GetDependencies(),但是它只能查找这个资源引用了那些资源。 但是我想要的是查找某个资源被那些资源引用了,这是两种相反的查找公式。

网上找到一个查找脚本,速度很快,不过只能在Mac上用。右键选择一个资源,点击 Find References,会在Console面板上输出结果。

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

public class FindProject {

	#if UNITY_EDITOR_OSX

	[MenuItem("Assets/Find References In Project", false, 2000)]
	private static void FindProjectReferences()
	{
		string appDataPath = Application.dataPath;
		string output = "";
		string selectedAssetPath = AssetDatabase.GetAssetPath (Selection.activeObject);
		List<string> references = new List<string>();

		string guid = AssetDatabase.AssetPathToGUID (selectedAssetPath);

		var psi = new System.Diagnostics.ProcessStartInfo();
		psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
		psi.FileName = "/usr/bin/mdfind";
		psi.Arguments = "-onlyin " + Application.dataPath + " " + guid;
		psi.UseShellExecute = false;
		psi.RedirectStandardOutput = true;
		psi.RedirectStandardError = true;

		System.Diagnostics.Process process = new System.Diagnostics.Process();
		process.StartInfo = psi;

		process.OutputDataReceived += (sender, e) => {
			if(string.IsNullOrEmpty(e.Data))
				return;

			string relativePath = "Assets" + e.Data.Replace(appDataPath, "");

			// skip the meta file of whatever we have selected
			if(relativePath == selectedAssetPath + ".meta")
				return;

			references.Add(relativePath);

		};
		process.ErrorDataReceived += (sender, e) => {
			if(string.IsNullOrEmpty(e.Data))
				return;

			output += "Error: " + e.Data + "\n";
		};
		process.Start();
		process.BeginOutputReadLine();
		process.BeginErrorReadLine();

		process.WaitForExit(2000);

		foreach(var file in references){
			output += file + "\n";
			Debug.Log(file, AssetDatabase.LoadMainAssetAtPath(file));
		}

		Debug.LogWarning(references.Count + " references found for object " + Selection.activeObject.name + "\n\n" + output);
	}

	#endif
}

 

Unity之文本Text颜色渐变

Unity之文本Text颜色渐变

Unity的UGUI的Text只能设置单个颜色,由于项目需求,需要Text有渐变色,在网上找了几篇,发型都在用一个叫 TextVerticalGradientThreeColor的组件,不过这个组件虽然支持三种颜色,但是不能更改颜色数量和渐变位置,还是太方便,怎么办呢?那就花点时间自己造轮子吧。

TextGradientColor可配合自带的Outline和Shadow使用,上下顺序不同,渲染出来的效果也有差别,可以自己试试。

代码如下:

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

namespace UI.Extension
{
	//和文本的 Shadow 和 outline 效果配合 , 渲染顺序不一样,效果也不一样

	[AddComponentMenu ("UI/Effects/Text Gradient Color")]
	[RequireComponent (typeof(Text))]
	public class TextGradientColor : BaseMeshEffect
	{
		public Gradient gradientColor = new Gradient ();
		//是否垂直方向
		public bool isVertical = true;
		//是否叠加原有颜色
		public bool isMultiplyTextColor = false;
		protected TextGradientColor ()
		{
		}

		private void ModifyVertices (VertexHelper vh)
		{
			List<UIVertex> verts = new List<UIVertex> (vh.currentVertCount);
			vh.GetUIVertexStream (verts);
			vh.Clear ();

			//每个字母 分为两个三角形,6个顶点,如下图 0和5位置相同 2和3位置相同
			/**
			 *   5-0 ---- 1
			 *    | \    |
			 *    |  \   |
			 *    |   \  |
			 *    |    \ |
			 *    4-----3-2
			 **/

			int step = 6;
			for (int i = 0; i < verts.Count; i += step) {

				UIVertex start1, start2, end1, end2, current1, current2;
				if (isVertical) {
					start1 = verts [i + 0];
					start2 = verts [i + 1];
					end1 = verts [i + 4];
					end2 = verts [i + 3];
				} else {
					start1 = verts [i + 0];
					start2 = verts [i + 4];
					end1 = verts [i + 1];
					end2 = verts [i + 2];
				}

				for (int j = 0; j < gradientColor.colorKeys.Length; j++) {
					GradientColorKey colorKey = gradientColor.colorKeys [j];
					if (j == 0) {
						multiplyColor (start1,colorKey.color);
						multiplyColor (start2,colorKey.color);
					} else if (j == gradientColor.colorKeys.Length - 1) {
						multiplyColor (end1,colorKey.color);
						multiplyColor (end2,colorKey.color);

						//right
						vh.AddVert (start1);
						vh.AddVert (start2);
						vh.AddVert (end2);

						//left
						vh.AddVert (end2);
						vh.AddVert (end1);
						vh.AddVert (start1);

					} else {
						// create right
						current2 = CreateVertexByTime (start2, end2, colorKey.time);
						vh.AddVert (start1);
						vh.AddVert (start2);
						vh.AddVert (current2);

						// create left
						current1 = CreateVertexByTime (start1, end1, colorKey.time);
						vh.AddVert (current2);
						vh.AddVert (current1);
						vh.AddVert (start1);

						start1 = current1;
						start2 = current2;
					}
				}
			}

			//添加三角形

			//每个字母的顶点数量
			int stepVertCount = (gradientColor.colorKeys.Length - 1) * 2 * 3;
			for (int i = 0; i < vh.currentVertCount; i += stepVertCount) {
				for (int m = 0; m < stepVertCount; m += 3) {
					vh.AddTriangle (i + m + 0, i + m + 1, i + m + 2);
				}
			}
		}

		private UIVertex multiplyColor(UIVertex vertex, Color color)
		{
			if (isMultiplyTextColor)
				vertex.color = Multiply (vertex.color, color);
			else
				vertex.color = color;
			return vertex;
		}

		public static Color32 Multiply(Color32 a, Color32 b)
		{
			a.r = (byte)((a.r * b.r) >> 8);
			a.g = (byte)((a.g * b.g) >> 8);
			a.b = (byte)((a.b * b.b) >> 8);
			a.a = (byte)((a.a * b.a) >> 8);
			return a;
		}

		//根据比例创建顶点 (time这里是gradientColor里的比例)
		private UIVertex CreateVertexByTime (UIVertex start, UIVertex end, float time)
		{
			UIVertex center = new UIVertex ();
			center.normal = Vector3.Lerp (start.normal, end.normal, time);
			center.position = Vector3.Lerp (start.position, end.position, time);
			center.tangent = Vector4.Lerp (start.tangent, end.tangent, time);
			center.uv0 = Vector2.Lerp (start.uv0, end.uv0, time);
			center.uv1 = Vector2.Lerp (start.uv1, end.uv1, time);
			center.color =  gradientColor.Evaluate (time);

			if (isMultiplyTextColor) {
				//multiply color
				var color = Color.Lerp(start.color, end.color, time);
				center.color = Multiply (color, gradientColor.Evaluate (time));
			} else {
				center.color = gradientColor.Evaluate (time);
			}

			return center;
		}

		#region implemented abstract members of BaseMeshEffect

		public override void ModifyMesh (VertexHelper vh)
		{
			if (!this.IsActive ()) {
				return;
			}

			ModifyVertices (vh);
		}

		#endregion
	}
}  

 

Mac下MonoDevelop的快捷键记录

Mac下MonoDevelop的快捷键记录

MonoDevelop

记录下Mac下MonoDeveloper快捷键

Window下开发Unity3D,除了Vs无它。

苹果下按键说明如下

  • ⌘——Command ()
  • ⌃ ——Control
  • ⌥——Option (alt)
  • ⇧——Shift
  • ⇪——Caps Lock

跳转:

Command+Y:跳转到声明
Command+L:跳转到具体行
Shift+Command+D:跳转/打开工程文件(VS里面大番茄快速打开文件)Command+上:跳转到文件顶部
Command+下:跳转到文件底部
Command+左:跳转行首
Command+右:跳转行尾
Option+Command+左右方向键:向前/向后转到光标所在位置(这个应该说特别有用)

查找:

Shift+Command+Y:查找所有引用
Command+Y:在文件中查找字符
Shift+Command+F:在所有文件中查找字符

注释:

Command+/:注释/取消注释当前行

编辑:

Command+C:复制
Command+V:粘贴
Command+Z:撤销
Command+X:剪切
Control+K:删除光标后所有当前行内容
Option+上下按键:将当前行向上/向下移动(VS里面Alt+上下按键效果)Option+左右按键:按整个单词切换(VS中Control+左右一样的效果)Option+Delete:删除单词内容

列出了常用的快捷键,自己做个记录,也希望帮助到需要的朋友,如果有更好的MonoDeveloper使用技巧

 

快捷键可以自己修改 Command+,  但是貌似monoDevelop上的设置选项有点少,比如复制当前行  没找到在,可能是unity自带的,版本有点老,你也可以去官方下载最新的