当前位置:   article > 正文

Unity 游戏框架搭建 2019 (三十六) 类在多个文件中实现:partial 关键字_unity partial

unity partial

在上一篇,我们把菜单的顺序从头到尾整理了一遍。在整理菜单顺序的过程中,记录了一个要做的事情。

要做的事情:

  • (完成) 备份:导出文件,并取一个合理的名字。
  • 整理完菜单顺序后,学习新的知识,解决随着示例增多,可能出现类需要合并的问题。

我们要学习新的知识,试着解决类的合并问题。首先我们来看下要合并的类是什么,在我们的示例中是 TransformSimplify,这个 TransformSimplify 是对 Transform API 的简化,而 Transform 有非常多的 API,那么以后肯定还是会给 TransformSimplify 添加方法的。

而我们的示例是逐个写的,写了一个示例,发现要给 TransformSimplify 添加方法,再回头找 TransformSimplify 类,再更改,这样很不妥。因为如果更改了 TransformSimplify 这个类了,那么对应的此篇专栏的文章就会失效了。

所以如果有一个方法能够解决这个问题就好了,在每个示例就可以为已经有的类添加方法,而不去动用以前的示例代码,等学习到一个阶段后进行整理的时候统一进行合并。有这样的东西嘛?

有的,C# 有提供 partial 关键字。

它可以让一个类在多个文件中实现。那我们就试着给 TransformSimplify 和 GameObject 应用 partial 关键字吧。

TransformSimplify 在第五个示例,增加后的代码如下:

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
#endif

namespace QFramework
{
	public partial class TransformSimplify
	{
#if UNITY_EDITOR
		[MenuItem("QFramework/5.Transform API 简化/1.赋值优化", false, 5)]
#endif
		private static void MenuClicked1()
		{
			var transform = new GameObject("transform").transform;

			SetLocalPosX(transform, 5.0f);
			SetLocalPosY(transform, 5.0f);
			SetLocalPosZ(transform, 5.0f);
		}
		
#if UNITY_EDITOR
		[MenuItem("QFramework/5.Transform API 简化/2.重置", false, 6)]
#endif
		private static void MenuClicked2()
		{
			var transform = new GameObject("transform").transform;

			Identity(transform);
		}

		/// <summary>
		/// 重置操作
		/// </summary>
		/// <param name="trans">Trans.</param>
		public static void Identity(Transform trans)
		{
			trans.localPosition = Vector3.zero;
			trans.localScale = Vector3.one;
			trans.localRotation = Quaternion.identity;
		}
		
		public static void SetLocalPosX(Transform transform, float x)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosY(Transform transform, float y)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosZ(Transform transform, float z)
		{
			var localPos = transform.localPosition;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXY(Transform transform, float x, float y)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.y = y;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosXZ(Transform transform, float x, float z)
		{
			var localPos = transform.localPosition;
			localPos.x = x;
			localPos.z = z;
			transform.localPosition = localPos;
		}
		
		public static void SetLocalPosYZ(Transform transform, float y, float z)
		{
			var localPos = transform.localPosition;
			localPos.y = y;
			localPos.z = z;
			transform.localPosition = localPos;
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

GameObjectSimplify 在第七个示例,增加 partial 之后代码如下:

#if UNITY_EDITOR
using UnityEditor;
#endif
 
using UnityEngine;

namespace QFramework
{
    public partial class GameObjectSimplify
    {
        public static void Show(GameObject gameObj)
        {
            gameObj.SetActive(true);
        }

        public static void Hide(GameObject gameObj)
        {
            gameObj.SetActive(false);
        }

#if UNITY_EDITOR
        [MenuItem("QFramework/7.GameObejct API 简化/显示、隐藏简化", false, 8)]
#endif
        private static void MenuClicked()
        {
            var gameObject = new GameObject();

            Hide(gameObject);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

增加之后呢,我们添加一个示例,用来验证 partial 关键字是否正确的。

新的示例呢,是第八个示例。

在示例中,分别为 TransformSimplify 和 GameObjectSimplify 增加一个方法。

代码如下:

#if UNITY_EDITOR
using UnityEditor;
#endif
 
using UnityEngine;


namespace QFramework
{
    public partial class TransformSimplify
    {
        public static void AddChild(Transform transform, Transform childTrans)
        {
            childTrans.SetParent(transform);
        }
    }

    public partial class GameObjectSimplify
    {
        public static void Show(Transform transform)
        {
            transform.gameObject.SetActive(true);
        }

        public static void Hide(Transform transform)
        {
            transform.gameObject.SetActive(false);
        }
    }
    
    public class PartialKeyword
    {
#if UNITY_EDITOR
        [MenuItem("QFramework/8.partial 关键字", false, 9)]
#endif
        private static void MenuClicked()
        {
            var parentTrans = new GameObject("Parent").transform;
            var childTrans = new GameObject("Child").transform;
            
            TransformSimplify.AddChild(parentTrans,childTrans);
            GameObjectSimplify.Hide(childTrans);

        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

执行的结果如下:006tNc79gy1fzfrjlpmilj30hw06c0sz.jpg

菜单如下:
006tNc79gy1fzfrjojvenj308f05bgnc.jpg

目录如下:
006tNc79gy1fzfrjrd85tj30gm0agjss.jpg

学了这个 partial 之后,我们的合并问题就解决了。

这样我们整理阶段要做的事情就做完了。

要做的事情:

  • (完成) 备份:导出文件,并取一个合理的名字。
  • (完成) 整理完菜单顺序后,学习新的知识,解决随着示例增多,可能出现类需要合并的问题。

今天的内容就这些,我们下一篇再见,拜拜~

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

  • QFramework 地址:https://github.com/liangxiegame/QFramework

  • QQ 交流群:623597263

  • Unity 进阶小班

    • 主要训练内容:
      • 框架搭建训练(第一年)
      • 跟着案例学 Shader(第一年)
      • 副业的孵化(第二年、第三年)
    • 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
  • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/98410
推荐阅读
相关标签
  

闽ICP备14008679号