<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                本篇文章介紹如何實現如下代碼的鏈式編程: ```cs this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity); ``` 以上代碼中,this 為 MonoBehaviour 類型的對象。 ## 如何實現? 通過上篇文章介紹的 return this + 靜態擴展很容易做到,實現代碼如下所示: ```cs public static MonoBehaviour Position(this MonoBehaviour selfBehaviour, Vector3 position) { selfBehaviour.transform.position = position; return selfBehaviour; } public static MonoBehaviour LocalScale(this MonoBehaviour selfBehaviour, float xyz) { selfBehaviour.transform.localScale = Vector3.one * xyz; return selfBehaviour; } public static MonoBehaviour Rotation(this MonoBehaviour selfBehaviour, Quaternion rotation) { selfBehaviour.transform.rotation = rotation; return selfBehaviour; } ``` 很容易實現對吧?但是這樣有個問題,由于靜態擴展方法返回的是 MonoBehaviour 類而不是this所屬的類型,所以接下來鏈式方法中只能使用 MonoBehaviour 的方法。不能像如下方式使用。 ```cs this.Position(Vector3.one) .LocalScale(1.0f) .Rotation(Quaternion.identity) .DoSomething(); ``` 以上代碼中,this 為 MonoBehaviour 類型的對象。 如何解決這個問題呢?答案是引入泛型。 ## 引入泛型 實現代碼如下所示: ```cs public static T Position<T>(this T selfBehaviour, Vector3 position) where T : MonoBehaviour { selfBehaviour.transform.position = position; return selfBehaviour; } public static T LocalScale<T>(this T selfBehaviour, float xyz) where T : MonoBehaviour { selfBehaviour.transform.localScale = Vector3.one * xyz; return selfBehaviour; } public static T Rotation<T>(this T selfBehaviour, Quaternion rotation) where T : MonoBehaviour { selfBehaviour.transform.rotation = rotation; return selfBehaviour; } ``` 實現很簡單,只是把之前代碼中的 MonoBehaivour 改成泛型T,然后增加一個約束: where T : MonoBehaviour。表示這個泛型一定要繼承自 MonoBehaviour。這樣之前例子中的this可以使用MonoBehaviour 之外的方法實現鏈式編程了。 ## 進一步完善 不只是自己實現的 MonoBehaviour 腳本像 UGUI 的 Image 等都要支持 transform 的鏈式編程。那么就要找到transfom 到底是哪個類?最后找到了如下代碼。 ```cs namespace UnityEngine { /// <summary> /// <para>Base class for everything attached to GameObjects.</para> /// </summary> [RequiredByNativeCode] public class Component : Object { /// <summary> /// <para>The Transform attached to this GameObject.</para> /// </summary> public extern Transform transform { [MethodImpl(MethodImplOptions.InternalCall)] get; } ... ``` 最終定位到,transform 是 Component 的屬性器。 所以可以將之前的實現改為如下代碼: ```cs public static T Position<T>(this T selfComponent, Vector3 position) where T : Component { selfComponent.transform.position = position; return selfComponent; } public static T LocalScale<T>(this T selfComponent, float xyz) where T : Component { selfComponent.transform.localScale = Vector3.one * xyz; return selfComponent; } public static T Rotation<T>(this T selfComponent, Quaternion rotation) where T : Component { selfComponent.transform.rotation = rotation; return selfComponent; } ``` 通過此種方式實現 Graphfic,Component 等類,最后可以實現如下方式的鏈式編程。 ```cs Image image = null; image.LocalPosition(Vector3.back) .ColorAlpha(0.0f) .Hide(); ``` 當然,去查看一個屬性到底是哪個類實現的這個過程也是一個很好的學習方式 : ) ,有很多類都可以實現鏈式編程,不過剩下的要靠大家自己了,當然也可以參考 QFramework 里的實現方式,不過 QFramework 也只是對筆者常用的類進行了實現。 OK,本篇介紹到這里。 轉載請注明地址:涼鞋的筆記:[liangxiegame.com](http://liangxiegame.com) ## 更多內容 * QFramework 地址:[https://github.com/liangxiegame/QFramework](https://github.com/liangxiegame/QFramework) * QQ 交流群:[623597263](http://shang.qq.com/wpa/qunwpa?idkey=706b8eef0fff3fe4be9ce27c8702ad7d8cc1bceabe3b7c0430ec9559b3a9ce66) * **Unity 進階小班**: * 主要訓練內容: * 框架搭建訓練(第一年) * 跟著案例學 Shader(第一年) * 副業的孵化(第二年、第三年) * 權益、授課形式等具體詳情請查看[《小班產品手冊》](https://liangxiegame.com/master/intro):https://liangxiegame.com/master/intro * 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。 ![](http://file.liangxiegame.com/38eccb55-40b2-4845-93d6-f5fb50ff9492.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看