Upgrade to Pro — share decks privately, control downloads, hide ads and more …

無限スクロールの実装を通して見る、Unity上の共通基盤を作り始める際の考え方

 無限スクロールの実装を通して見る、Unity上の共通基盤を作り始める際の考え方

本資料は、2026年5月14日に開催された「ゲームクリエイターズトレーニングキャンプ主催 春のLT大会&交流会」(運営:クラスメソッド)で登壇した際に使用したスライド資料です。
LTでは、弊社で進行中のプロジェクト内で並行して開発を進めているUnity用UI共通基盤「ApUI」を作成する流れで得た知見の紹介を行いました。
OSSの採用や基盤の学習コスト、設計ミスの実例について触れております。基盤を作り始めた際にぶつかった事例の一例として、ご覧いただけると幸いです。

Avatar for altplus Inc.

altplus Inc.

August 25, 2026

More Decks by altplus Inc.

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 永薗 朋弥 Tomomi Nagasono 株式会社オルトプラス 技術部テックリード Unityクライアントエンジニア 2024年に中途⼊社。 新規開発プロジェクトに参画中。

    並⾏して共通基盤の開発や、社内の Unity勉強会の運営を担当。 この前、プライベートで東京ゲームダンジョン 12に出展してきました 2
  2. 無限スクロール機能の概要 ➢ クラス名: ReusedScroll ◦ 表⽰要素(セル)をオブジェクトプールで管理する スクロールビュー ◦ Inspector上から挙動のカスタマイズが可能 ▪

    スクロール⽅向 (縦/横) ▪ ループ設定 ▪ 慣性 ◦ 拡張コンポーネントを付与して機能を追加できる ▪ カルーセルUI 6
  3. 便利なアセット/OSSについて • Unityの機能はアセットやOSSで拡張可能 ◦ ◦ • 普段の開発では積極的に使いたい ◦ ◦ •

    LoopScrollRect ▪ 無限スクロールUI DOTween / LitMotion ▪ イージング挙動を簡易に書けるライブラリ ⼯数削減 ⼀般に公開された知識が使える 共通基盤に導⼊する際は慎重な検討が必要 8
  4. 共通基盤にOSSを導⼊する際の検討事項 • Unityの機能だけで実装できないか ◦ Unityの機能は都度追加されている ▪ ▪ ◦ • Unity2021〜:オブジェクトプール追加

    (UnityEngine.Pool) Unity6〜 :async/awaitのサポート (Awaitable) 数年前できなかったことが、最新だとできるかもしれない アセット/OSSのライセンス、サポートの問題 ◦ ◦ 基盤に含まれるライセンスの効⼒は基盤を利⽤するプロジェクト全てに及ぶ 使えなくなった際、移⾏のためにコストがかかる ▪ ものによっては全プロジェクトで対応を迫られる 9
  5. 使えるときには使いたい • 基盤の⼀部処理を外部から上書きできる構造で実装 ◦ ◦ 基盤側)ActionのSetterを公開 ▪ そのままで動くよう、基盤内の関数で初期化しておく 利⽤側)公開されたActionにOSSを使⽤した処理を上書き public

    class ApUICarousel { // 基盤側 public Action<float, Vector3> DoSnapAction { private get; set; } } void Awake(){ DoSnapAction = DoSnapDefault; // ApUICarousel内定義の挙動を登録 } public class Project { // 利用側 ApUICarousel _carousel; } public void Construct(){ // LitMotionのイージング処理で上書き _carousel.DoSnapAction = (time, EndPosition) => LMotion.Create(... } 12
  6. 学習コストを下げるためにできること • 既存の知識にならって使えるようにする ◦ ◦ ◦ • 新しい操作、使い⽅は学習を要求する 似た機能があるなら、使い勝⼿を寄せた⽅が使いやすくなる ≒

    直感的 コーディングルールに沿って⾃動で矯正される環境を⽤意する ◦ ◦ Lint, Github Actions等 品質の保証 + ルールの学習コストの低減 14
  7. ReusedScrollの実装 Unityのコンポーネント指向に沿った設計 • コアコンポーネント(ReusedScroll) ◦ 各機能の最⼩要件 ▪ ▪ ▪ •

    セルの位置計算処理 セルのオブジェクトプール管理 スクロール操作 拡張コンポーネント(Carousel) ◦ 最⼩要件に含まれない機能 コンポーネントの付け外しで動作を変えられる 15
  8. 学習コストについての失敗例 2.横⽅向スクロール対応追加 • • コアコンポーネントに切り替えパラメータを追加 ◦ 縦スクロール/横スクロール コンテント座標の実装を流⽤ ◦ 0

    +330 +660 (コンテント座標) 右⽅向が+となり、Unityと座標系が⼀致する 内部動作: 左(ー⽅向)にスクロールされたら、 全てのセルのRectTransform.X座標をーする 18
  9. 学習コストについての失敗例 その結果 • • コアコンポーネントに縦、横の実装がどちらも含まれる 同じー⽅向へのスクロール時、 ◦ 縦スクロール ▪ 全てのセルのRectTransform.Y座標を+する

    ◦ 横スクロール ▪ 全てのセルのRectTransform.X座標をーする 0 +200 +300 +500 (コンテント座標) → コアコンポーネントが縦/横の機能をどちらも含んでしまっている + スクロール⽅向ごとにUnity上の座標計算が反転している 19
  10. どうなった? 問題:コアコンポーネントが縦/横の機能をどちらも含んでしまっている +スクロール⽅向ごとにUnity上の座標計算が反転している • 追加実装時、作業者が↑の問題を前提に作成する必要が⽣まれた // こんな処理が頻発 return _reusedScroll.Direction switch

    { ScrollDirection.Horizontal => pointInCanvasPosition - zeroPosition, ScrollDirection.Vertical => zeroPosition - pointInCanvasPosition, _ => throw new ArgumentOutOfRangeException() }; → 学習コストの増加、作業量、思考量の増加を招いてしまった (社内全体に広める前でまだよかった) 20
  11. 今ならどうする? 原因:コアコンポーネント内で縦と横の位置計算が混ざったこと • コアコンポーネントをさらに分割し、縦横の処理が混ざらないようにする ◦ ◦ ◦ • コンテント座標の管理 縦スクロール

    / 横スクロール (どちらか) セルのオブジェクトプール管理 Unityの座標系に沿った部分以外は表に出ないようにする ◦ 全てコアのコンテント座標管理内で⾏い、表に出す場合はUnity座標系に必ず変換 これらを基に、v2の設計、実装を考え中(懇親会等で意⾒などあればお聞かせください) 21
  12. まとめ • 基盤にOSSを採⽤する際は以下の点を検討しよう ◦ ◦ • 基盤の学習コストを意識しよう ◦ ◦ •

    Unityの機能で対応できないか ライセンス、サポート終了のリスク ⼀ヶ所の難解さは多くの⼈に影響する 少⼈数チームでもAIを⽤いる際は注意 失敗したら振り返ろう ◦ 原因、対策が理解できれば経験値に変わる 22