Unity3D跨平台时partial分部方法的使用
最近看到项目中插件的一部分逻辑,发现问题多多,可读性很差,并且容易出错,于是随手整理了下逻 
辑。
Unity3D的插件逻辑,因为要考虑到针对各平台的移植,因此会大片的出现#if/#endif等条件编译,当
然,为了简化逻辑,我们可以使用Conditional属性,但当需要处理的逻辑规模(函数个数规模、函数逻
辑规模、针对的平台规模等等)达到一定程度时,仍然会显得繁琐,这时候可能就需要寻找新的处理方法
:
可以使用partial分部类/方法的方式解决问题。我们先来看一下修改前的逻辑:
//Sample.cs
public class Sample
{
#if UNITY_ANDROID
	  private AndroidJavaClass _agent = null;
	  private AndroidJavaObject _content = null;
	  
	  public AndroidJavaClass Agent
	  {
		    get { return _agent; }
	  }
  public AndroidJavaObject Content
	  {
		    get { return _content; }
	  }
#elif UNITY_IPHONE
#endif
#region singleton...
	  private Sample()
	  {
#if UNITY_EDITOR
		    Debug.Log("Editor: Sample--------------------");
#elif UNITY_ANDROID
		    try
		    {
			      _agent = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			      _content = _agent.GetStatic<AndroidJavaObject>("currentActivity");
		    }
		    catch (System.Exception ex) 
		    {
			      Debug.LogError(ex != null ? ex.Message : "<null>");
		    }
#elif UNITY_IPHONE
#endif
	  }
#endregion
  public void Func1(string _param1, string _param2)
	  {
#if UNITY_ANDROID
		    if (Content != null)
		    {
			      Content.Call(......);
		    }
#elif UNITY_IPHONE
		    ......
#endif
	  }
  public void Func2()
	  {
#if UNITY_ANDROID
		    if (Content != null)
		    {
			      Content.Call("Func2");
		    }
#elif UNITY_IPHONE
#endif
	  }
  public string Func3()
	  {
#if UNITY_ANDROID
		    if (Content != null)
			      return Content.Call<string>("Func3");
		    else
		    {
			      return "12345678";
		    }
#elif UNITY_IOS
		    return "23456789";
#endif	
		    return "34567890";
	  }
  public int Func4()
	  {
#if UNITY_ANDROID
		    if (Content != null)
		    {
			      return Content.Call<int>("Func4");
		    }		//此处隐藏无返回的情况
#elif UNITY_IPHONE
		    return 100;
#endif	
		    return 100;	//编译时的警告:执行不到的情况等等
	  }
	  ......
	  ......	
}
对比修改之后的内容:
//Sample.cs
public partial class Sample
{
	  partial void init();		//针对构造函数
  partial void func1(string _param1, string _param2);
	  partial void func2();
	  partial void func3(ref string _param1);
	  partial void func4(ref int _param1);
}
public partial class Sample
{
#region singleton...
	  private Sample()
	  {
		    init();
	  }
#endregion
  public void Func1(string _param1, string _param2)
	  {
		    func1(_param1, _param2);
	  }
  public void Func2()
	  {
		    func2();
	  }
  public string Func3()
	  {
		    string tResult = "";
		    func3(ref tResult);
		    return tResult;
	  }
  public int Func4()
	  {
		    int tResult = "";
		    func4(ref tResult);
		    return tResult;
	  }
}
以下针对平台可以分别放在不同文件:
//Sample4Android.cs
#if !UNITY_EDITOR && UNITY_ANDROID
public partial class Sample
{
	  private AndroidJavaClass _agent = null;
	  private AndroidJavaObject _content = null;
  public AndroidJavaClass Agent
	  {
		    get { return _agent; }
	  }
	  public AndroidJavaObject Content
	  {
		    get { return _content; }
	  }
  partial void init()
	  {
		    try
		    {
			      _agent = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			      _content = _agent.GetStatic<AndroidJavaObject>("currentActivity");
		    }
		    catch (System.Exception ex) 
		    {
			      Debug.LogError(ex != null ? ex.Message : "<null>");
		    }
	  }
  partial void func1(string _param1, string _param2)
	  {
		    if (Content != null)
		    {
			      Content.Call(......);
		    }
	  }
	  partial void func2()
	  {
		    if (Content != null)
		    {
			      Content.Call("Func2");
		    }
	  }
	  partial void func3(ref string _param1)
	  {
		    _param1 = Content != null ? Content.Call<string>("Func3") : "12345678";
	  }
	  partial void func4(ref int _param1)
	  {
		    _param1 = Content != null ? Content.Call<int>("Func4") : 100;
	  }
}
#endif
//Sample4Editor.cs
#if UNITY_EDITOR
public partial class Sample
{
}
#endif
//Sample4IPhone.cs
#if !UNITY_EDITOR && (UNITY_IPHONE || UNITY_IOS)
public partial class Sample
{
}
#endif
我们可以看到,修改之后可读性大大提高,而且出错的概率也会下降很多,同时对于多平台的同时开发移植都很友好。
Unity3D跨平台时partial分部方法的使用的更多相关文章
- C#中的分部类和分部方法:partial
		
这篇文章主要介绍了C#中的分部类和分部方法,讲解了类的拆分和方法的定义的拆分,需要的朋友可以参考下可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应 ...
 - C#3.0新增功能05 分部方法
		
连载目录 [已更新最新开发文章,点击查看详细] 分部类或结构可以包含分部方法. 类的一个部分包含方法的签名. 可以在同一部分或另一个部分中定义可选实现. 如果未提供该实现,则会在编译时删除 ...
 - C# partial修饰符_分部类_分部方法
		
今天翻了翻书,发现自己还是遗留下不少基础性的东西,老实说,不管一些基础的东西用到不用到都很应该了解,因为基础毕竟学习量不是很大. 一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多 ...
 - c# partial 分部类和分部方法
		
一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚 ...
 - 分部类,分部方法 - 修饰符partial
		
一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多个源文件中,每个源文件只包含类型定义的一部分. 当使用自动生成的源时,无须重新创建源文件便可将代码添加到类中.Visual Stu ...
 - 利用partial关键字声明分部类和分部方法
		
一.分部类 1.分部类的定义:简单的说,分部类就是把一个类拆分成多个类,每个类文件只包含其中的一部分,类.结构.接口.方法都可以拆分,在定义的时候加上partial修饰符. 注意:分部类必须属于同一命 ...
 - 分部方法 partial
		
当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法 class PartOld { string name; public virtual void OnChangeName ...
 - C# Partial:分部方法和分部类
		
using System; namespace Partial { class Program { static void Main(string[] args) { A a = new A(); } ...
 - C# 分部方法partial
		
定义:使用partial关键字构建分部类定义.允许在一个文件中构建方法原型,而在另一个文件中实现. 1)分部方法只可以定义在分部类中 2)分部方法必须返回void 3)分部方法可以是静态的或实例级别的 ...
 
随机推荐
- HTML5+CSS3鼠标悬停图片特效
			
点击预览效果 下载该特效: HTML5+CSS3鼠标悬停图片特效.zip 特效说明: 一款HTML5+CSS3鼠标悬停图片事件网页特效,集合了最流行鼠标悬停图片文字.图片动画移动 ...
 - JavaScript自学代码--(四)
			
//JavaScript Window - 浏览器对象模型 window.document.getElementById("header"); //等价于 document.get ...
 - C#中值参数的使用实例
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 函数的参 ...
 - ubuntu 64bit “arm-linux-gcc: No such file or directory”问题的解决方法
			
安装lsb-core sudo apt-get install lsb-core
 - [wikioi]石子归并
			
http://wikioi.com/problem/1048/ 区间型动态规划.参考PPT:http://wenku.baidu.com/view/73c1ded5b9f3f90f76c61bc4.h ...
 - [收藏转贴]构建RESTful风格的WCF服务
			
RESTful Wcf是一种基于Http协议的服务架构风格. 相较 WCF.WebService 使用 SOAP.WSDL.WS-* 而言,几乎所有的语言和网络平台都支持 HTTP 请求. RESTf ...
 - ANDROID_MARS学习笔记_S05_002_给传感器注册listener
			
1 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); se ...
 - 两个有关Knockout自定义拓展方法fn的小技巧
			
Adding custom functions using "fn" 让observable自增/自减 最简单的方法是self.num(self.num() + 1), 但是这个写 ...
 - 【HDOJ】2721 Persistent Bits
			
题目有点长,但是题意说的很清楚.位操作. #include <stdio.h> ]; int main() { int a, b, c, s; int i, j, k, n, tmp, m ...
 - bzoj1799
			
这是一道比较难的数位dp 因为逐位统计好像无法处理数位和整除原数的 但是有了刚才的bzoj1072的经验,我们能做的是逐位处理被一个数d整除的方案 不难想到先穷举数位和now,now最大也就162,可 ...