最近看到项目中插件的一部分逻辑,发现问题多多,可读性很差,并且容易出错,于是随手整理了下逻
辑。
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分部方法的使用的更多相关文章

  1. C#中的分部类和分部方法:partial

    这篇文章主要介绍了C#中的分部类和分部方法,讲解了类的拆分和方法的定义的拆分,需要的朋友可以参考下可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应 ...

  2. C#3.0新增功能05 分部方法

    连载目录    [已更新最新开发文章,点击查看详细]    分部类或结构可以包含分部方法. 类的一个部分包含方法的签名. 可以在同一部分或另一个部分中定义可选实现. 如果未提供该实现,则会在编译时删除 ...

  3. C# partial修饰符_分部类_分部方法

    今天翻了翻书,发现自己还是遗留下不少基础性的东西,老实说,不管一些基础的东西用到不用到都很应该了解,因为基础毕竟学习量不是很大. 一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多 ...

  4. c# partial 分部类和分部方法

    一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚 ...

  5. 分部类,分部方法 - 修饰符partial

    一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多个源文件中,每个源文件只包含类型定义的一部分. 当使用自动生成的源时,无须重新创建源文件便可将代码添加到类中.Visual Stu ...

  6. 利用partial关键字声明分部类和分部方法

    一.分部类 1.分部类的定义:简单的说,分部类就是把一个类拆分成多个类,每个类文件只包含其中的一部分,类.结构.接口.方法都可以拆分,在定义的时候加上partial修饰符. 注意:分部类必须属于同一命 ...

  7. 分部方法 partial

    当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法 class PartOld { string name; public virtual void OnChangeName ...

  8. C# Partial:分部方法和分部类

    using System; namespace Partial { class Program { static void Main(string[] args) { A a = new A(); } ...

  9. C# 分部方法partial

    定义:使用partial关键字构建分部类定义.允许在一个文件中构建方法原型,而在另一个文件中实现. 1)分部方法只可以定义在分部类中 2)分部方法必须返回void 3)分部方法可以是静态的或实例级别的 ...

随机推荐

  1. 浅谈JavaScript词法分析步骤

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Ob ...

  2. 一篇文章让你彻底搞清楚Python中self的含义

    刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数? 你看完这篇文章后就会明白所有的疑问. self代表类的实例,而非类. ...

  3. C++ 类族的设计

     - 类族的设计]    按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,求出圆格柱体的表面积.体积并输出并且完成要求的计算任务:    (1)先建立一个Point(点)类,包含数据成员 ...

  4. android app修改包名

    change package nameA.使用到得工具    notepad++,everything搜索工具(C:\Users\Administrator\Desktop\MusicScanResu ...

  5. uva 1482 - Playing With Stones

    对于组合游戏的题: 首先把问题建模成NIM等经典的组合游戏模型: 然后打表找出,或者推出SG函数值: 最后再利用SG定理判断是否必胜必败状态: #include<cstdio> #defi ...

  6. X窗口系统的协议和架构

    转自X窗口系统的协议和架构 在电脑中,X窗口系统(常称作 X11.X)是一种以位图显示的网络透明化窗口系统.本条目详述 X11 的协议及其技术架构. X C/S模型和网络透明性 X 基于C/S模型.运 ...

  7. ECmall错误:Call to a member function get_users_count() on a non-object

    问题描述: 在后台添加了一个app报错:Call to a member function get_users_count()Fatal error: Call to a member functio ...

  8. POJ 2750 Potted Flower(线段树的区间合并)

    点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...

  9. 【POJ 2486】 Apple Tree (树形DP)

    Apple Tree Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to a ...

  10. [wikioi]传纸条

    http://wikioi.com/problem/1169/ 棋盘型的动态规划,这道题可以看成是从左上角向右下角走两条不重合的路(除了开始和结尾).动态规划要想的是状态和阶段,状态是(x1,y1,x ...