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)分部方法可以是静态的或实例级别的 ...
随机推荐
- Navicat Premium 未保存的SQL如何找回 ?
在使用 Navicat Premium 编辑SQL的过程中为防止程序意外崩溃,已经将编辑的SQL都已经备份. 备份存放目录地址:C:\Users\{登录用户名}\Documents\Navicat\M ...
- SQL Join PK ChinaJoy
P PK
- WordPress 使用 Pie-Register 添加前台注册、登录、找回密码和编辑个人资料功能
转自:http://www.wpdaxue.com/front-end-publishing.html Pie-Register 是一个功能比较完善的 WordPress 才能,使用它可以很方便添加和 ...
- The Promise of Deep Learning
The Promise of Deep Learning By Yoshua Bengio Humans have long dreamed of creating machines that thi ...
- 关于MATLAB中的tic toc的问题
关于MATLAB中的tic toc的问题 其一) MATLAB实际单位时间计时函数的具体应用,在编写程序时,经常需要获知代码的执行实际时间,这就需要在程序中用到计时函数,matlab中提供了以下三种方 ...
- uva 12097 - Pie
简单题,二分就行: #include<cstdio> #include<cmath> #define pi acos(-1.0) #define eps 0.000001 #d ...
- 在openshift上自定义node.js的版本
https://github.com/ramr/nodejs-custom-version-openshift 由于是线上服务器,一步一步来: 先把上面的工程拉下来,覆盖到初始化的工程里,提交,让服务 ...
- Ecmall系统自带的分页功能
在Ecmall的二次开发中,分页是必不可少的.这个系统已经自带了分页功能,下面来看看如何使用这个分页. 下面是一个自定义的类,用于查看订单的详细情况.关键在于get_order_data()这个方法, ...
- HDU 2487 Ugly window
这是切的很痛苦的一道题,自己测试了很多样例却终究不过,中间也做了诸多修改,后来无奈去网上看题解,发现遗漏了一种情况,就是两个窗口可能边框都能看见,但是一个嵌套在另一里面,而我判定是不是 “top wi ...
- FishEye简介
前言 在项目开发过程中,随着开发的进行,将有大量的代码编写提交到代码仓库,如何能全面准确的了解源代码的变化,提交的频率,代码量的趋势,发现代码的缺陷,将是控制源代码质量的重要指标,这个时候一个 ...