最近看到项目中插件的一部分逻辑,发现问题多多,可读性很差,并且容易出错,于是随手整理了下逻
辑。
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. An easy way to syncTime using C#

    /* * Created by SharpDevelop. * User: Administrator * Date: 2013/10/23 * Time: 8:57 * author zibet * ...

  2. 4071: [Apio2015]巴邻旁之桥

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  3. Android WebView缓存分析

    http://blog.csdn.net/a345017062/article/details/8703221   WebView的缓存可以分为页面缓存和数据缓存. 页面缓存是指加载一个网页时的htm ...

  4. 一周一话题之四(JavaScript、Dom、jQuery全面复习总结<jQuery篇>)

    -->目录导航 一. 初探Jquery 1. 介绍 2. 基础 二. Jquery操作 1. jQuery页面加载 2. 选择器 3. 操作Dom 三. Jquery进阶 1. 隐式迭代与链式编 ...

  5. redis key expire

    EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的』(volati ...

  6. 【HDOJ】4513 吉哥系列故事——完美队形II

    这题目上学期就看了,不过最近发现可以用马拉车来解,而且还是基本算法. 稍微对回文串成立条件变形一下即可. /* 4513 */ #include <iostream> #include & ...

  7. 【HDOJ】2209 翻纸牌游戏

    状态压缩+双向广搜.注意控制时间t. /* 2209 */ #include <iostream> #include <string> #include <map> ...

  8. System.Windows.Forms中的Message Structure

    结构用途说明Implements a Windows message. Properties 1.public IntPtr HWnd { get; set; } Gets or sets the w ...

  9. TeeChart的最小步长和最大步长

    /// <summary> /// 坐标轴的最大步长 /// </summary> public double MajorStep { get { return axis.Ca ...

  10. “net.tcp://localhost:9000/ObtainData”处带有协定“"IObtainData"”的 ChannelDispatcher 无法打开其 IchannelListener。

    http://stackoverflow.com/questions/1252791/how-to-solve-the-channeldispatcher-is-unable-to-open-its- ...