C#中級編程——C#擴展方法+介面,定義統一的搜索介面,基于Unity(三)——圖文詳解加原始碼
- 前言
- 💡一、通過組件,查找所有Image
- 1.設計介面Interface
- 2.實作介面
- 3.擴展方法Transform
- 4.工程內呼叫
- 💡二、查找所有名字為“card”的節點,無視深度
- 1.設計介面Interface
- 2.實作介面
- 3.擴展方法Transform
- 4.工程內呼叫
- 💡三、完整代碼
- 🌲1.`IFindAll.cs`定義介面
- 🌲2.`MethodOfFind.cs`介面實作
- 🌲3.`ActionOfTransform.cs`擴展方法
- 🌲4.`Test1027.cs`負責呼叫
- 總結
- 💢💢著作權宣告
前言
🔥總目錄C#語法系列詳解——總目錄持續更新中,,,
之前寫了C#擴展方法,今天就來記錄下拓展方法+介面的應用,來做一個統一的搜索介面
環境是基于unity2019.4.10f1
老規矩,先上最終效果

如圖所示一共是兩種功能
🔥通過組件,查找所有Image
🔥查找所有名字為“card”的節點,無視深度
💡一、通過組件,查找所有Image
1.設計介面Interface
/// <summary>
/// 查找的介面
/// </summary>
public interface IFindAll
{
/// <summary>
/// 查找
/// </summary>
/// <param name="root">查找的根節點</param>
/// <param name="findResult">存放查找到的結果</param>
void Find(Transform root,List<Transform> findResult);
}
2.實作介面
/// <summary>
/// 通過組件查找子物體的位置
/// </summary>
/// <typeparam name="T"></typeparam>
public class FindByConmponent<T> : IFindAll where T : Component
{
public void Find(Transform root, List<Transform> findResult)
{
foreach (var componentsInChild in root.GetComponentsInChildren<T>())
{
findResult.Add(componentsInChild.transform);
}
}
}
public class MethodOfFind
{
public static void Find(Transform root, List<Transform> result, IFindAll iFindAll)
{
if (root == null)
{
throw new Exception("root不能為空,它定義了查找的起點!");
}
if (result == null)
{
throw new Exception("result不能為空,它用于存放查找的結果!");
}
if (iFindAll == null)
{
throw new Exception("IFindAll不能為空!");
}
iFindAll.Find(root, result);
}
}
3.擴展方法Transform
/// <summary>
/// 給Transform添加拓展方法:通過組件查找
/// </summary>
/// <param name="transform">作用的物件</param>
/// <param name="root">根節點</param>
/// <param name="result">結果</param>
/// <typeparam name="T">組件的型別</typeparam>
public static void FindByComponent<T>(this Transform transform,Transform root,List<Transform> result) where T:Component
{
MethodOfFind.Find(root,result,new FindByConmponent<T>());
}
4.工程內呼叫
呼叫的腳本需要掛載在Canvas上
buttonByConmponent.onClick.AddListener(()=>transform.FindByComponent<Image>(transform,resultOfConmponent));
💡二、查找所有名字為“card”的節點,無視深度
1.設計介面Interface
在之前查找的介面基礎上再加一個是否符合條件的介面
/// <summary>
/// 判斷是否符合要求
/// </summary>
public interface IValidOfTransform
{
bool IsValid(Transform target);
}
2.實作介面
public class FindByName : IValidOfTransform
{
private readonly string m_name;
/// <summary>
/// 建構式:名字賦值
/// </summary>
/// <param name="name">名字</param>
public FindByName(string name)
{
m_name = name;
}
public bool IsValid(Transform target)
{
return target.gameObject.name.Equals(m_name);
}
}
/// <summary>
/// 通過名字遍歷所有的節點
/// </summary>
public class GoThroughByName : IFindAll
{
private readonly IValidOfTransform m_validOfTransform;
/// <summary>
/// 建構式,給IValidOfTransform賦值
/// </summary>
/// <param name="validOfTransform"></param>
public GoThroughByName(IValidOfTransform validOfTransform)
{
m_validOfTransform = validOfTransform;
}
public void Find(Transform root, List<Transform> findResult)
{
//遞回遍歷
for (int i = 0; i < root.childCount; i++)
{
Transform target = root.GetChild(i);
//如果符合,就直接添加
if (m_validOfTransform.IsValid(target))
{
findResult.Add(target);
}
Find(target, findResult);
}
}
}
3.擴展方法Transform
/// <summary>
/// 給Transform添加拓展方法:通過名字遍歷所有的子節點(無視深度)
/// </summary>
/// <param name="transform">作用的物件</param>
/// <param name="root">根節點</param>
/// <param name="result">結果</param>
/// <param name="targetName">名字</param>
public static void FindAllByName(this Transform transform,Transform root,List<Transform> result,string targetName)
{
MethodOfFind.Find(root,result,new GoThroughByName(new FindByName(targetName)));
}
4.工程內呼叫
呼叫的腳本需要掛載在Canvas上
buttonByName.onClick.AddListener(()=>transform.FindAllByName(transform,resultOfName,"card"));
💡三、完整代碼
為了大家方便看,也為了自己以后能看懂,代碼內也做了詳細的注釋
🌲1.IFindAll.cs定義介面
using System.Collections.Generic;
using UnityEngine;
namespace UseInterface
{
/// <summary>
/// 查找的介面
/// </summary>
public interface IFindAll
{
/// <summary>
/// 查找
/// </summary>
/// <param name="root">查找的根節點</param>
/// <param name="findResult">存放查找到的結果</param>
void Find(Transform root,List<Transform> findResult);
}
/// <summary>
/// 判斷是否符合要求
/// </summary>
public interface IValidOfTransform
{
bool IsValid(Transform target);
}
}
🌲2.MethodOfFind.cs介面實作
using System;
using System.Collections.Generic;
using UnityEngine;
namespace UseInterface
{
public class MethodOfFind
{
public static void Find(Transform root, List<Transform> result, IFindAll iFindAll)
{
if (root == null)
{
throw new Exception("root不能為空,它定義了查找的起點!");
}
if (result == null)
{
throw new Exception("result不能為空,它用于存放查找的結果!");
}
if (iFindAll == null)
{
throw new Exception("IFindAll不能為空!");
}
iFindAll.Find(root, result);
}
}
/// <summary>
/// 通過組件查找子物體的位置
/// </summary>
/// <typeparam name="T"></typeparam>
public class FindByConmponent<T> : IFindAll where T : Component
{
public void Find(Transform root, List<Transform> findResult)
{
foreach (var componentsInChild in root.GetComponentsInChildren<T>())
{
findResult.Add(componentsInChild.transform);
}
}
}
/// <summary>
/// 通過名字遍歷所有的節點
/// </summary>
public class GoThroughByName : IFindAll
{
private readonly IValidOfTransform m_validOfTransform;
/// <summary>
/// 建構式,給IValidOfTransform賦值
/// </summary>
/// <param name="validOfTransform"></param>
public GoThroughByName(IValidOfTransform validOfTransform)
{
m_validOfTransform = validOfTransform;
}
public void Find(Transform root, List<Transform> findResult)
{
//遞回遍歷
for (int i = 0; i < root.childCount; i++)
{
Transform target = root.GetChild(i);
//如果符合,就直接添加
if (m_validOfTransform.IsValid(target))
{
findResult.Add(target);
}
Find(target, findResult);
}
}
}
public class FindByName : IValidOfTransform
{
private readonly string m_name;
/// <summary>
/// 建構式:名字賦值
/// </summary>
/// <param name="name">名字</param>
public FindByName(string name)
{
m_name = name;
}
public bool IsValid(Transform target)
{
return target.gameObject.name.Equals(m_name);
}
}
}
🌲3.ActionOfTransform.cs擴展方法
/*Transform的拓展方法*/
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace UseInterface
{
/// <summary>
/// 拓展通過組件查找
/// </summary>
public static class ActionOfTransform
{
/// <summary>
/// 給Transform添加拓展方法:通過組件查找
/// </summary>
/// <param name="transform">作用的物件</param>
/// <param name="root">根節點</param>
/// <param name="result">結果</param>
/// <typeparam name="T">組件的型別</typeparam>
public static void FindByComponent<T>(this Transform transform,Transform root,List<Transform> result) where T:Component
{
MethodOfFind.Find(root,result,new FindByConmponent<T>());
}
/// <summary>
/// 給Transform添加拓展方法:通過名字遍歷所有的子節點(無視深度)
/// </summary>
/// <param name="transform">作用的物件</param>
/// <param name="root">根節點</param>
/// <param name="result">結果</param>
/// <param name="targetName">名字</param>
public static void FindAllByName(this Transform transform,Transform root,List<Transform> result,string targetName)
{
MethodOfFind.Find(root,result,new GoThroughByName(new FindByName(targetName)));
}
}
}
🌲4.Test1027.cs負責呼叫
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UseInterface;
public class Test1027 : MonoBehaviour
{
/// <summary>
/// 通過組件查找的按鈕,通過名字查找的按鈕
/// </summary>
public Button buttonByConmponent, buttonByName;
/// <summary>
/// 通過組件找到的,通過名字找到的
/// </summary>
public List<Transform> resultOfConmponent, resultOfName;
private void Awake()
{
//按鈕添加監聽
buttonByConmponent.onClick.AddListener(()=>transform.FindByComponent<Image>(transform,resultOfConmponent));
buttonByName.onClick.AddListener(()=>transform.FindAllByName(transform,resultOfName,"card"));
}
}
總結
歡迎大佬多多來給萌新指正,歡迎大家來共同探討,
如果各位看官覺得文章有點點幫助,跪求各位給點個“一鍵三連”,謝啦~
宣告:本博文章若非特殊注明皆為原創原文鏈接
https://blog.csdn.net/Wrinkle2017/article/details/120998008
————————————————————————————————
💢💢著作權宣告
著作權宣告:本博客為非營利性個人原創
所刊登的所有作品的著作權均為本人所擁有
本人保留所有法定權利,違者必究!
對于需要復制、轉載、鏈接和傳播博客文章或內容的
請及時和本博主進行聯系
對于經本博主明確授權和許可使用文章及內容的
使用時請注明文章或內容出處并注明網址
轉載請附上原文出處鏈接及本宣告
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/341977.html
標籤:其他
上一篇:大一筆記本配置詳解
下一篇:Pygame對于視頻播放的實作
