tag:crieit.net,2005:https://crieit.net/tags/%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89/feed 「スピード」の記事 - Crieit Crieitでタグ「スピード」に投稿された最近の記事 2023-03-26T13:57:23+09:00 https://crieit.net/tags/%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89/feed tag:crieit.net,2005:PublicArticle/18375 2023-01-23T21:44:38+09:00 2023-03-26T13:57:23+09:00 https://crieit.net/posts/Unity-63ce81365440c 【実況ブログ】 Unity でスピードを作ろうぜ(^~^)? <h1 id="📅2023-01-23 mon 21:00"><a href="#%F0%9F%93%852023-01-23+mon+21%3A00">📅2023-01-23 mon 21:00</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 Unity で スピードのモックアップを作ろうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 お父ん、モックアップしか作らないから つまんな……」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 企画書と 設計書のフェーズは すっ飛ばすんでしょ。<br /> プログラミングしかやらないから」</p> <p><a href="https://crieit.now.sh/upload_images/2e5408d4040b15d1191be9e3001e0c4063ce7a550abcd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2e5408d4040b15d1191be9e3001e0c4063ce7a550abcd.png?mw=700" alt="202301_unity_23-2113--unity-hub-1.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Unity Hub でプロジェクトを作る所から始まるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5ef24fe15e444437b71bc798bbce0e9363ce7b19c09d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5ef24fe15e444437b71bc798bbce0e9363ce7b19c09d6.png?mw=700" alt="202301_unity_23-2116--new-project-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 プロジェクト名は <code>Speed</code> でいいだろ」</p> <p><a href="https://crieit.now.sh/upload_images/c933f8126230c479ba0c5ebec0d0b76963ce7c129e87f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c933f8126230c479ba0c5ebec0d0b76963ce7c129e87f.png?mw=700" alt="202301_unity_23-2122--files.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ファイルが最初から、いくつか 入ってるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/cea0e9603e5e6dc94ea4cf623b6f791863ce7ca99fb8b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cea0e9603e5e6dc94ea4cf623b6f791863ce7ca99fb8b.png?mw=700" alt="202301_unity_23-2124--unity-editor.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Unity Editor が出てくるが、自分が使いやすいように セットアップしておいたぜ。<br /> ほんとは ディスプレイいっぱい でかく広げて作業しているが、<br /> 上の画像は ブログにアップするために ウィンドウを小さくしているぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 その ディスプレイいっぱいに広げたウィンドウの画像も 1回 見せてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/1f248217c15688279b47b2f0900fdbc563ce7d460c0a3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1f248217c15688279b47b2f0900fdbc563ce7d460c0a3.png?mw=700" alt="202301_unity_23-2127--maximized-window.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/11c709172df2a247cb41d4142c7e681d63ce7e10aa081.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/11c709172df2a247cb41d4142c7e681d63ce7e10aa081.png?mw=700" alt="202301_unity_23-2129--images-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 トランプ・ゲーム作るんだから トランプの画像がいるだろ。<br /> Project ウィンドウの <code>Assets</code> フォルダーの下に <code>Images</code> フォルダーを作って、<br /> 右クリックして <code>Show in Explorer</code> をクリックしろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/c821fad3a403091a255dbe30d7aba20c63ce7f9d886d0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c821fad3a403091a255dbe30d7aba20c63ce7f9d886d0.png?mw=700" alt="202301_unity_23-2137--playing-cards.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 前に神経衰弱を作った時に 描いたものを フォルダーへぶち込むぜ」</p> <p><a href="https://crieit.now.sh/upload_images/53d649d27d91edfcb15f92cd081316d063ce804487a82.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/53d649d27d91edfcb15f92cd081316d063ce804487a82.png?mw=700" alt="202301_unity_23-2139--assets-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Unity Editor からも見えるな」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 しかし また 1枚1枚 プレーンを置いて 画像をプレーンにドラッグ&ドロップ していくのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 それは きついな……。どないしよ……」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 前に作った <code>Concentration</code> (コンセントレーション;トランプの神経衰弱ゲーム) を <code>Inport Package</code> (インポート・パッケージ)したらいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 やってみるか……」</p> <p>📅2023-01-23 mon 21:44</p> <p><a href="https://crieit.now.sh/upload_images/db1ee23de0677a42495a93b2e8d77e9763ce81d24a808.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/db1ee23de0677a42495a93b2e8d77e9763ce81d24a808.png?mw=700" alt="202301_unity_23-2145--import-package-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 前に <code>Import Package</code> したら 中身をぶちまけられたり、ぐちゃぐちゃに壊されたりしたから 嫌なんだが<br /> まだ プロジェクトを作ったばかりだし 被害もないだろ」</p> <p><a href="https://crieit.now.sh/upload_images/af42b45138bea9d29fa1e1742959d73663ce8352c6e58.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/af42b45138bea9d29fa1e1742959d73663ce8352c6e58.png?mw=700" alt="202301_unity_23-2152--file-chooser-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 開くぜ」</p> <p><a href="https://crieit.now.sh/upload_images/0827bb871523102e75db38dd2c47592663ce83a8b77a3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0827bb871523102e75db38dd2c47592663ce83a8b77a3.png?mw=700" alt="202301_unity_23-2154--import-unity-package.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 コンフリクトは注意してくれるのか」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あっ、 カードの <strong>ゲーム・オブジェクト</strong> が入ってないぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>Concentration</code> プロジェクトの方で カードのゲーム・オブジェクトを プレファブにして Assets に入れておけばいいんじゃないの?」<br /> <a href="https://crieit.now.sh/upload_images/bda04b6bb9979645b606a1ebc107f03c63ce851936456.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bda04b6bb9979645b606a1ebc107f03c63ce851936456.png?mw=700" alt="202301_unity_23-2200--concentration-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Hierarchy ウィンドウにあるだけでは Assets ではないから、 Assets に入れないといけないのか。<br /> 下準備が けっこう居るな。<br /> 元のプロジェクトを壊さずに ゲーム・オブジェクトを プレファブに差し替えられるかな?」</p> <p><a href="https://crieit.now.sh/upload_images/054a299baf1e6823b0710a64d70df3a163ce861db3d61.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/054a299baf1e6823b0710a64d70df3a163ce861db3d61.png?mw=700" alt="202301_unity_23-2204--prefabs-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Hierarchy ウィンドウから Project ウィンドウへ ドラッグ&ドロップで コピーすることは でけるみたいだけど」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ Hierarchy ウィンドウにある方の <code>Hearts 1</code> フォルダーを消して、<br /> Project ウィンドウにある方の <code>Hearts 1</code> プレファブを Hierarchy ウィンドウに戻してみろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/b1b07a72012e1a71ae5ba928f66443b363ce87221cba4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b1b07a72012e1a71ae5ba928f66443b363ce87221cba4.png?mw=700" alt="202301_unity_23-2208--back-to-the-hierarchy-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 何ごともなく 無事 でけたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 ふーん できるんだ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ 残り53枚のカードを プレファブに変換しろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 つら…… ぢごくだ……」</p> <p>📅2023-01-23 mon 22:11</p> <p><a href="https://crieit.now.sh/upload_images/7f23762fb1609ad1875880f9700511a563ce882216fd3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7f23762fb1609ad1875880f9700511a563ce882216fd3.png?mw=700" alt="202301_unity_23-2212--highlight-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうやって選択して 一度に持っていけないかな……」</p> <p><a href="https://crieit.now.sh/upload_images/925b95fa67eb4991a0d4a6152d57060763ce888477949.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/925b95fa67eb4991a0d4a6152d57060763ce888477949.png?mw=700" alt="202301_unity_23-2215--prefabs-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 おっ、いけたようだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 Hierarchy ウィンドウの方の 元のゲーム・オブジェクトも 水色のアイコンに変わってるわよ。<br /> もう プレファブになってんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/beb3bfd6a5c8b27ba2ea1d7abc49add763ce89a6caf05.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beb3bfd6a5c8b27ba2ea1d7abc49add763ce89a6caf05.png?mw=700" alt="202301_unity_23-2219--export-package-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんでもいいや…… <code>Export Package</code> しよ」</p> <p><a href="https://crieit.now.sh/upload_images/1740b8b65ec09e248ee3a881bf0ae68563ce8a6d239bf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1740b8b65ec09e248ee3a881bf0ae68563ce8a6d239bf.png?mw=700" alt="202301_unity_23-2223--import-package-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Speed</code> プロジェクトの方で <code>Import Package</code> しよ」</p> <p><a href="https://crieit.now.sh/upload_images/701cfef5bcb46b2dc95fc01b7e3fa8b063ce8b53738fc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/701cfef5bcb46b2dc95fc01b7e3fa8b063ce8b53738fc.png?mw=700" alt="202301_unity_23-2226--not-found-image-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 プレファブだけ持ってきてもだけで 画像も持ってこないと リンク切れを起こすか<br /> 当たり前と言えば 当たり前だが」</p> <p><a href="https://crieit.now.sh/upload_images/ab0d257fdc6e998609920acef218c19b63ce8c2896079.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ab0d257fdc6e998609920acef218c19b63ce8c2896079.png?mw=700" alt="202301_unity_23-2230--images-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 画像を持ってきたら 復元した」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 スクリプトのアタッチが切れているようだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/09512b60f16781c4daa6b08b7dc20e9b63ce8cfb8ac07.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/09512b60f16781c4daa6b08b7dc20e9b63ce8cfb8ac07.png?mw=700" alt="202301_unity_23-2233--scripts-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 スクリプトを持ってきたら 復元したぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 トランプ・カードだけを インポート・パッケージしやすいような<br /> トランプ・カードだけのプロジェクトを 作っておくべきなんじゃない?」」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 下ごしらえか。 トランプ・ゲームをよく作るようなら 作っておいた方が良さそうだな」</p> <p>📅2023-01-23 mon 22:36</p> <p><a href="https://crieit.now.sh/upload_images/df1169b57a32c731f1b9ff59fd6781d063ce932219cc2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/df1169b57a32c731f1b9ff59fd6781d063ce932219cc2.png?mw=700" alt="202301_unity_23-2300--backward.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんか知らんけど 裏側 剥がれてるから 貼り直しだ ひ~」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 検品って 大事ね~」</p> <p><a href="https://crieit.now.sh/upload_images/6af7ebb1504cec28e39fa2f54cabdb4663ce95b50010b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6af7ebb1504cec28e39fa2f54cabdb4663ce95b50010b.png?mw=700" alt="202301_unity_23-2310--overrides-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Unity Learn のビギナーコースで学んだところによると、 <code>Prefab</code> を <code>Hierarchy</code> でまた いじったら、 <code>Inspector</code> ウィンドウの <code>Overrides</code> ドロップダウンリストから<br /> <code>Apply All</code> ボタンを選んで 押せば プレファブの設定を上書きしてくれるんだったと思う、多分」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ 全部のカードの <code>Apply All</code> ボタンを押すのが終わったら、<br /> Hierarchy ウィンドウのカードを全部消して、<br /> Project ウィンドウにあるカードを Hierarchy ウィンドウへ ドラッグ&ドロップしろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 でけた。 今度は オモテも ウラも 画像が貼り付いてるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 カードができたんだったら、 並べて、<br /> スピードをやってるみたいな 画面を作りなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 画作り(えづくり)か」</p> <p><a href="https://crieit.now.sh/upload_images/93ce062d324302068b8bbaaef3f6d12063ce98c0b3aed.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/93ce062d324302068b8bbaaef3f6d12063ce98c0b3aed.png?mw=700" alt="202301_unity_23-2323--picture-making-rotation-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 例えば 赤色のスートのカードだけ 180°回転させるとか Unity Editor を使って操作する。<br /> こういう道具の使い方の基本操作が すばやいことが 開発屋の <strong>基本のき</strong> だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 解説はいいから 早よ 画を作れだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/1f7ec43cbc69b6b830e6301ac4867b0f63ce9dcc3eb46.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1f7ec43cbc69b6b830e6301ac4867b0f63ce9dcc3eb46.png?mw=700" alt="202301_unity_23-2345--failed-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 あっ! カードを裏返そうとしたら オモテ面と ウラ面の両方が ウラの方向いて<br /> ワケが分からなくなった!」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 やり直せ!」</p> <p><a href="https://crieit.now.sh/upload_images/eeff03117a61300f478adb928e70365463ce9e9d8eeb5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/eeff03117a61300f478adb928e70365463ce9e9d8eeb5.png?mw=700" alt="202301_unity_23-2349--redo-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 不思議な話だが プロジェクトにある カードを全部消して、<br /> エクスポートした自分自身の中身を 再び 自分に入れ直すぜ」</p> <p><a href="https://crieit.now.sh/upload_images/fe3ccc0013db269150d9fed0f8209ee963cea1cf6de55.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fe3ccc0013db269150d9fed0f8209ee963cea1cf6de55.png?mw=700" alt="202301_unity_24-0003--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 オモテ面、ウラ面の2枚で1つのカードを ひっくり返す うまい操作が よく分からん。 疲れた。<br /> 今日は ここまでだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 おつ」</p> <p>📅2023-01-24 tue 00:05 end</p> <h1 id="📅2023-01-24 tue 20:20 start"><a href="#%F0%9F%93%852023-01-24+tue+20%3A20+start">📅2023-01-24 tue 20:20 start</a></h1> <p><a href="https://crieit.now.sh/upload_images/0cac9dd11f72aee33b71ed29369ba99363cfbfb764369.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0cac9dd11f72aee33b71ed29369ba99363cfbfb764369.png?mw=700" alt="202301_unity_24-2021--turn-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Speades 3</code> ゲーム・オブジェクトを選択して <code>Rotation Z</code> を <code>180</code> にすれば<br /> オモテ面、ウラ面を1つのまとまりとして 裏返してくれるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 1個 1個 ゲーム・オブジェクトを選んで テキストボックスに <code>180</code> を入れていけだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d3624ebdc33c41681d3fe986e0f1208863cfc343289d7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d3624ebdc33c41681d3fe986e0f1208863cfc343289d7.png?mw=700" alt="202301_unity_24-2037--turn-and-pop-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 この カードを1枚ずつ選んで 裏返して 少し持ち上げる たこ焼き みたいな作業をやるの<br /> 嫌なんだが」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 もっと スピーディーにやる方法 あるんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/19e06e34c524de3978c86d0a713d958b63cfc6c640d41.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/19e06e34c524de3978c86d0a713d958b63cfc6c640d41.png?mw=700" alt="202301_unity_24-2053--move-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あったとしても 知りようがないぜ。<br /> ここを プログラミング化できたら 30分は 縮まる!」</p> <p><a href="https://crieit.now.sh/upload_images/fa1aa590e1b9848430bd58d4d7cbb6c263cfc756734e2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fa1aa590e1b9848430bd58d4d7cbb6c263cfc756734e2.png?mw=700" alt="202301_unity_24-2055--turn-and-pop-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 反対側にもあって まだ15枚もある!」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 30分 がんばれよ」</p> <p><a href="https://crieit.now.sh/upload_images/f1336529d2a4b05eff678cd21e22f55963cfcac813012.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f1336529d2a4b05eff678cd21e22f55963cfcac813012.png?mw=700" alt="202301_unity_24-2110--picture-making-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 見た目は こんなんで いいかあ」</p> <p>📅2023-01-24 tue 21:13</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 手札って 最大で 何枚になるの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 パイルを全部 手札に混ぜれば 20枚だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 20枚の手札があるケースも 画作り してくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/371ccf8233305415b3c09656cc3a8de963cfcd3b80ea6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/371ccf8233305415b3c09656cc3a8de963cfcd3b80ea6.png?mw=700" alt="202301_unity_24-2119--line-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 カードの端を ちょっと被せつつ並べれば 20枚は 収まるかな?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 WebGL でビルドして 出力結果で 確かめなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/13b016c7d8a0c5288d90ba320bcc9b8063cfcf9124c1e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/13b016c7d8a0c5288d90ba320bcc9b8063cfcf9124c1e.png?mw=700" alt="202301_unity_24-2130--output.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 端が切れてるなあ。 カメラの角度が付いてるからかな?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 メインカメラの位置を きっちり 決めてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/007394f89996bba92895414dc9d7a3d263cfd5932b0dd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/007394f89996bba92895414dc9d7a3d263cfd5932b0dd.png?mw=700" alt="202301_unity_24-2155--main-camera-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 真上というのも 味気ないんで ちょっと傾けつつ 整数にまとめたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/8086af4d99c885dcc426b550c41a60c263cfd5c87158d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8086af4d99c885dcc426b550c41a60c263cfd5c87158d.png?mw=700" alt="202301_unity_24-2154--output.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 画作り は こんなもんでいいだろ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 相手の手札を 前後ひっくり返す意味ってある?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 ダイヤの6と、ダイヤの9は 見分けが付かないよな」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 将棋の駒だって 後手は ひっくり返ってるだろ 例はある 気にするなだぜ」</p> <p>📅2023-01-24 tue 22:01</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 ゲーム開始時に セット されるプログラムを組みましょうよ」</p> <p><a href="https://crieit.now.sh/upload_images/a1d0a6f349b6dada94d3ab69b1f3146163cfd9bc9d5f9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a1d0a6f349b6dada94d3ab69b1f3146163cfd9bc9d5f9.png?mw=700" alt="202301_unity_24-2203--coordinate-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 ゲームを作るときは 座標をメモって置くのが コツだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 xとzの正負が逆じゃないか? カメラが裏向いてんじゃないか?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あれまっ! ほんとだぜ……」</p> <p><a href="https://crieit.now.sh/upload_images/2fe82bb51e287fe4d9888bbf4745caf963cfdac046b15.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2fe82bb51e287fe4d9888bbf4745caf963cfdac046b15.png?mw=700" alt="202301_unity_24-2217--flip-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 グローバル座標にして Y軸を回転軸にして 180°回転したぜ」</p> <p><a href="https://crieit.now.sh/upload_images/acb6aecebe1b2b23e40643c296fe379663cfdcea086fb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/acb6aecebe1b2b23e40643c296fe379663cfdcea086fb.png?mw=700" alt="202301_unity_24-2219--coordinate-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 座標の目安は これでいいだろ」</p> <p>📅2023-01-24 tue 22:28</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 手札は 1枚~20枚 を 位置調整することになるだろ。<br /> 予め 計算式を まとめてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 カード1枚の横幅は だいたい 10 のようだぜ。それを元に計算してみるか」</p> <p><a href="https://crieit.now.sh/upload_images/c2caeed0546c30ccaa9baddd2b32391763cfe15805c97.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c2caeed0546c30ccaa9baddd2b32391763cfe15805c97.png?mw=700" alt="202301_unity_24-2240--coordinate-calc.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 横幅が無限にあるのなら、 <code>(カードの枚数 - 1) * -5</code> の位置から <code>+10</code> 間隔でカードを並べるだけでいいが……」</p> <p><a href="https://crieit.now.sh/upload_images/2263ec6f1360cad978e8ed49000cdde863cfe26322c50.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2263ec6f1360cad978e8ed49000cdde863cfe26322c50.png?mw=700" alt="202301_unity_24-2248--coordinate-calc-b.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 左端が <code>x=-62</code> 、右端が <code>x=62</code> と決まってて、カードは20枚あるのだった」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 62 - (-62) = 124 なので、<br /> 横幅 124 の中に 20 枚のカードがあるので、<br /> 言い換えると<br /> 横幅 124 の中に 19 箇所のカードの隙間があるので、<br /> 1つの間隔は 124 / 19 = 6.526... んー すっきりしないなあ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 123.5 なら 19 で割り切れたのにね」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 割り切ろうとするなだぜ」</p> <pre><code>左端のカードの位置 + (左から何枚目 - 1) * ((右端のカードの位置 - 左端のカードの位置) / (カードの枚数 - 1)) Example: -62 + (左から何枚目 - 1) * (124/19) </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 上式で x 座標はイケるだろう」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ 座標の設計は 終わりだぜ」</p> <p>📅2023-01-24 tue 23:02</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 カードを配るのって どうやってプログラミングすんの?」</p> <p><a href="https://crieit.now.sh/upload_images/6ac00d690a09a483727fa87e0b0a60d363cfe9e77d8b4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6ac00d690a09a483727fa87e0b0a60d363cfe9e77d8b4.png?mw=700" alt="202301_unity_24-2313--arrangement.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 かき集めて シャッフルして 配るだけだぜ」</p> <p>📅2023-01-24 tue 23:25</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 ちょっと やってみてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e9833a5ce75ba96cc1a5ba4db319a03563cfeaea3d791.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e9833a5ce75ba96cc1a5ba4db319a03563cfeaea3d791.png?mw=700" alt="202301_unity_24-2326--game-manager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ゲーム・マネージャーを作る手順は 前にやったから 途中は省略するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/05aca195987ba013e745a15ad42989fd63cfeeff5f131.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/05aca195987ba013e745a15ad42989fd63cfeeff5f131.png?mw=700" alt="202301_unity_24-2344--script-1.png" /></a></p> <p>GameManager.cs:</p> <pre><code class="cs">using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { /// <summary> /// トランプ・カード /// </summary> List<GameObject> goPlayingCards = new(); // Start is called before the first frame update void Start() { for (int i = 1; i < 14; i++) { goPlayingCards.Add(GameObject.Find($"Clubs {i}")); goPlayingCards.Add(GameObject.Find($"Diamonds {i}")); goPlayingCards.Add(GameObject.Find($"Hearts {i}")); goPlayingCards.Add(GameObject.Find($"Spades {i}")); } float posY = 0.0f; float posYStep = -0.2f; float posZ = 42.0f; float posZStep = -((42.0f - (-28)) / goPlayingCards.Count); for (int i = 0; i < goPlayingCards.Count; i++) { var card = goPlayingCards[i]; float x = -62.0f + i * (124 / (goPlayingCards.Count - 1)); card.transform.position = new Vector3(x, posY, posZ); card.transform.rotation = Quaternion.Euler(0, 180, 0); posY += posYStep; posZ += posZStep; } } // Update is called once per frame void Update() { } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 まず、カードをかき集めて ざらっと 机に並べるコードを書いてみよう」</p> <p><a href="https://crieit.now.sh/upload_images/190fa7577a114692299e0a231a22af7663cfef49df78b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/190fa7577a114692299e0a231a22af7663cfef49df78b.png?mw=700" alt="202301_unity_24-2346--game.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 カードが被ってしまって 数字が なんにも見えないが、<br /> まあ、かき集めるのは でけたな」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 続きはまた今度だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 おつ」</p> <p>📅2023-01-24 tue 23:47</p> <h1 id="📅2023-01-25 mon 19:05"><a href="#%F0%9F%93%852023-01-25+mon+19%3A05">📅2023-01-25 mon 19:05</a></h1> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 数字が見えるようにしなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 用事のため あとで」</p> <p>📅2023-01-25 mon 19:14</p> <h1 id="📅2023-01-27 fri 20:00"><a href="#%F0%9F%93%852023-01-27+fri+20%3A00">📅2023-01-27 fri 20:00</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 Excel でチューリング・マシン作ってたら時間が飛んだぜ。<br /> 戻ってきたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 数字が見えるようにしなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/af2d241379fb270da3bc15dac29af24d63d3af5f7bc96.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/af2d241379fb270da3bc15dac29af24d63d3af5f7bc96.png?mw=700" alt="202301_unity_25-1908--screen-size.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 画面の座標は こんな感じか」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あっ、しまった!」</p> <p><a href="https://crieit.now.sh/upload_images/be5e085e43f13919daeee79cf0c2d31863d3c355f27da.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/be5e085e43f13919daeee79cf0c2d31863d3c355f27da.png?mw=700" alt="202301_unity_27-2127--game.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 うっかり ゲームの配置にしてしまった!」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 カードのテクスチャーや枚数を検品しないと 不良品が混じってるかもしれないのに……」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ 先に進みましょう。<br /> 積みあがってる手札を 裏返しなさいよ」</p> <p>📅2023-01-27 fri 21:31</p> <p><a href="https://crieit.now.sh/upload_images/5dc3bd03f4e8a1f7b49cfb3764d6577663d3c77972faa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5dc3bd03f4e8a1f7b49cfb3764d6577663d3c77972faa.png?mw=700" alt="202301_unity_27-2144--y-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あれっ! まだ 時計回りに180°回転してないのに ひっくり返ってるぜ!」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ 180°回転して 戻せだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d91b4b0160e1db1087f4e8b1342e437e63d3c8fc03705.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d91b4b0160e1db1087f4e8b1342e437e63d3c8fc03705.png?mw=700" alt="202301_unity_27-2151--game.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんか積んでる手札の底が1枚ずれてるな。<br /> まあいいや 進んでる間に 原因が見つかるだろ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ 先に進みましょう。<br /> 場にオープンしているカードを1枚選んで ルールを気にせず 中央の台札に 積みましょう!」</p> <p>📅2023-01-27 fri 21:53</p> <p><a href="https://crieit.now.sh/upload_images/8d51e143aaaafae7ca33180c1e3583ff63d3cac4c6dcf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8d51e143aaaafae7ca33180c1e3583ff63d3cac4c6dcf.png?mw=700" alt="202301_unity_27-2159--board.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 その前に カードが 空飛んでるのが気になるぜ 地面を置こう」</p> <p><a href="https://crieit.now.sh/upload_images/55a861eb9ae4abffca209f3a8b0e6d5a63d3cc36b6e5e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/55a861eb9ae4abffca209f3a8b0e6d5a63d3cc36b6e5e.png?mw=700" alt="202301_unity_27-2205--board-on-game.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 位置は こんなもんでいいだろ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 UI はどうすんだぜ? どのカードを選んでるとか」</p> <p><a href="https://crieit.now.sh/upload_images/83cc18e04fb697b888b1ae37df6ac00f63d3cf4513870.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/83cc18e04fb697b888b1ae37df6ac00f63d3cf4513870.png?mw=700" alt="202301_unity_27-2218--lift.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 カードを持ち上げてみると……、<br /> カメラアングルと 光源の関係なのか 手前と奥のプレイヤーで 持ち上げた高さが違って見えるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 カメラの位置を調整したらどうだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/1e3dac9675abc60577c116577b127bb663d3d18b1e80f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1e3dac9675abc60577c116577b127bb663d3d18b1e80f.png?mw=700" alt="202301_unity_27-2227--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こつこつ 画作り……」</p> <p><a href="https://crieit.now.sh/upload_images/35af9c23609d01ab298b5f1c2e1d03a763d3d257522a4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/35af9c23609d01ab298b5f1c2e1d03a763d3d257522a4.png?mw=700" alt="202301_unity_27-2231--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 回転も付けた方が カードゲームっぽいかな?」</p> <pre><code class="csharp"> /// <summary> /// カードを持ち上げる /// </summary> /// <param name="card"></param> private void SetFocus(GameObject card) { var liftY = 5.0f; // 持ち上げる(パースペクティブがかかっていて、持ち上げすぎると北へ移動したように見える) var rotateY = -5; // -5°傾ける var rotateZ = -5; // -5°傾ける card.transform.position = new Vector3(card.transform.position.x, card.transform.position.y + liftY, card.transform.position.z); card.transform.rotation = Quaternion.Euler(card.transform.rotation.eulerAngles.x, card.transform.rotation.eulerAngles.y + rotateY, card.transform.eulerAngles.z + rotateZ); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 付けた変化を 関数にしておくぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 行列にした方がよくないかだぜ? 逆関数 作るの めんどくさいだろ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 そういう最適化は 問題点が出尽くして 完成したあとに やりたかったら やればいいんで」</p> <p><a href="https://crieit.now.sh/upload_images/f018484a5edbaebb5e34b0275e76499863d3d3dab9f5b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f018484a5edbaebb5e34b0275e76499863d3d3dab9f5b.png?mw=700" alt="202301_unity_27-2238--focus.png" /></a></p> <pre><code class="csharp"> /// <summary> /// 持ち上げたカードを場に戻す /// </summary> /// <param name="card"></param> private void ResetFocus(GameObject card) { var liftY = 5.0f; // 持ち上げる(パースペクティブがかかっていて、持ち上げすぎると北へ移動したように見える) var rotateY = -5; // -5°傾ける var rotateZ = -5; // -5°傾ける // 逆をする liftY = -liftY; rotateY = -rotateY; rotateZ = -rotateZ; card.transform.position = new Vector3(card.transform.position.x, card.transform.position.y + liftY, card.transform.position.z); card.transform.rotation = Quaternion.Euler(card.transform.rotation.eulerAngles.x, card.transform.rotation.eulerAngles.y + rotateY, card.transform.eulerAngles.z + rotateZ); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 逆関数をあてれば 持ち上げたカードは場に戻り、<br /> また別のカードを持ち上げれば カードを選んでいる雰囲気が出るな」</p> <p>📅2023-01-27 fri 22:40</p> <pre><code class="csharp"> // 1プレイヤーの1枚目のカードにフォーカスを当てる { if (0 < goPlayersHandCards[0].Count) { var goCard = goPlayersHandCards[0][0]; SetFocus(goCard); } } // 1プレイヤーの1枚目のカードのフォーカスを外す { if (0 < goPlayersHandCards[0].Count) { var goCard = goPlayersHandCards[0][0]; ResetFocus(goCard); } } // 1プレイヤーの1枚目のカードにフォーカスを当てる { if (1 < goPlayersHandCards[0].Count) { var goCard = goPlayersHandCards[0][1]; SetFocus(goCard); } } // 2プレイヤーの1枚目のカードにフォーカスを当てる { if (0 < goPlayersHandCards[1].Count) { var goCard = goPlayersHandCards[1][0]; SetFocus(goCard); } } // 2プレイヤーの1枚目のカードのフォーカスを外す { if (0 < goPlayersHandCards[1].Count) { var goCard = goPlayersHandCards[1][0]; ResetFocus(goCard); } } // 2プレイヤーの2枚目のカードにフォーカスを当てる { if (1 < goPlayersHandCards[1].Count) { var goCard = goPlayersHandCards[1][1]; SetFocus(goCard); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 画作り をしている間は ベタ書きするぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 ただ、コードが長くなって 読みにくいよな」</p> <p><a href="https://crieit.now.sh/upload_images/ab85f934b127e2720e3c423e946c63b763d4df272d661.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ab85f934b127e2720e3c423e946c63b763d4df272d661.png?mw=700" alt="202301_unity_28-1735--lazy-args-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/eef6c69316169a684db175c6e47e90e763d3d8f2747ae.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/eef6c69316169a684db175c6e47e90e763d3d8f2747ae.png?mw=700" alt="202301_unity_27-2259--policy-1.png" /></a></p> <p><code>Assets.Scripts.LazyArgs.cs</code>:</p> <pre><code class="csharp">namespace Assets.Scripts { /// <summary> /// コーディングのテクニックのための仕込み /// </summary> internal class LazyArgs { public delegate void SetValue<T>(T value); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 そこで コードを短く書けるための 仕込み をするぜ」</p> <p><a href="https://crieit.now.sh/upload_images/df19793cde25f278c9794b36d3e94c1f63d4dfe87fe58.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/df19793cde25f278c9794b36d3e94c1f63d4dfe87fe58.png?mw=700" alt="202301_unity_28-1740--get-card-1.png" /></a></p> <p><code>Assets.Scripts.GameManager.cs</code>:</p> <pre><code class="csharp"> /// <summary> /// カードを取得 /// </summary> /// <param name="player">何番目のプレイヤー</param> /// <param name="cardIndex">何枚目のカード</param> /// <param name="setCard">カードをセットする関数</param> private void GetCard(int player, int cardIndex, LazyArgs.SetValue<GameObject> setCard) { if (cardIndex < goPlayersHandCards[player].Count) { var goCard = goPlayersHandCards[player][cardIndex]; setCard(goCard); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 カードを取得するという ありきたりな関数を書き」</p> <p><a href="https://crieit.now.sh/upload_images/fbecb05256d088eec47bc8b8926a59f363d3da74d6bed.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fbecb05256d088eec47bc8b8926a59f363d3da74d6bed.png?mw=700" alt="202301_unity_27-2305--lambda-1.png" /></a></p> <pre><code class="csharp"> // 1プレイヤーの1枚目のカードにフォーカスを当てる GetCard(0, 0, (goCard) => SetFocus(goCard)); // 1プレイヤーの1枚目のカードのフォーカスを外す GetCard(0, 0, (goCard) => ResetFocus(goCard)); // 1プレイヤーの2枚目のカードにフォーカスを当てる GetCard(0, 1, (goCard) => SetFocus(goCard)); // 2プレイヤーの1枚目のカードにフォーカスを当てる GetCard(1, 0, (goCard) => SetFocus(goCard)); // 2プレイヤーの1枚目のカードのフォーカスを外す GetCard(1, 0, (goCard) => ResetFocus(goCard)); // 2プレイヤーの2枚目のカードにフォーカスを当てる GetCard(1, 1, (goCard) => SetFocus(goCard)); </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 長ったらしかったコードを ワンライナー(1行)で書けるようにしたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 1プレイヤーが <code>0</code> で、 1枚目が <code>0</code> って分かりづらくない?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 序数と基数の違いだぜ 別のものなのだから仕方ない 慣れろだぜ」</p> <p>📅2023-01-27 fri 23:09</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 台札に1枚乗せなさいよ」</p> <pre><code class="csharp"> // 右の台札を積み上げる { float x = rightCenterStackX; float y = minY; float z = rightCenterStackZ; foreach (var goCard in goCenterStacksCards[0]) { SetPosRot(goCard, x, y, z); y += 0.2f; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 このコードだと 使い回しづらいので、使い回しやすい形にするかだぜ」</p> <pre><code class="csharp"> // 右の台札を積み上げる { float x = rightCenterStackX; this.rightCenterStacksY = minY; float z = rightCenterStackZ; foreach (var goCard in goCenterStacksCards[0]) { SetPosRot(goCard, x, this.rightCenterStacksY, z); this.rightCenterStacksY += 0.2f; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Y座標は 記憶することにしよう」</p> <p><a href="https://crieit.now.sh/upload_images/a706e47f7197dac257ffc00450c2fdca63d3e0e061ef7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a706e47f7197dac257ffc00450c2fdca63d3e0e061ef7.png?mw=700" alt="202301_unity_27-2332--hand-card-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 『台札は、場札から1枚抜いて置く』という動作に1本化しようぜ」</p> <pre><code class="csharp"> // 左の台札が空っぽの状態 this.leftCenterStackX = -15.0f; this.leftCenterStackY = minY; this.leftCenterStackZ = 10.0f; // 左の台札を積み上げる { // 場札の好きなところから1枚抜いて、台札を1枚置く var player = 1; // 2プレイヤーが var handIndex = 0; // 場札の1枚目から var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); var leftRight = 0; // 左の goCenterStacksCards[leftRight].Add(goCard); // 台札として置く // カードの位置と角度をセット SetPosRot(goCard, this.leftCenterStackX, this.leftCenterStackY, this.leftCenterStackZ, angleY: 0.0f); // 次に台札に積むカードの高さ this.leftCenterStackY += 0.2f; } // 右の台札が空っぽの状態 this.rightCenterStackX = 15.0f; this.rightCenterStackY = minY; this.rightCenterStackZ = 0.0f; // 右の台札を積み上げる { var player = 0; // 1プレイヤーが var handIndex = 0; // 場札の1枚目から var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); var leftRight = 1; // 右の goCenterStacksCards[leftRight].Add(goCard); // 台札として置く // カードの位置と角度をセット SetPosRot(goCard, this.rightCenterStackX, this.rightCenterStackY, this.rightCenterStackZ); // 次に台札に積むカードの高さ this.rightCenterStackY += 0.2f; } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 左の台札と、右の台札を 別にした方がいいな。<br /> カードの移動があったときに、同時に ポリゴンの位置と角度も設定しよう」</p> <p>📅2023-01-27 fri 23:50</p> <pre><code class="csharp"> /// <summary> /// 場札の好きなところから1枚抜いて、台札を1枚置く /// </summary> /// <param name="player">何番目のプレイヤー</param> /// <param name="handIndex">何枚目のカード</param> /// <param name="leftRight">左なら1、右なら0</param> private void PutCardToCenterStack(int player, int handIndex, int leftRight) { var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); goCenterStacksCards[leftRight].Add(goCard); // 台札として置く // カードの位置をセット SetPosRot(goCard, this.centerStacksX[leftRight], this.centerStacksY[leftRight], this.centerStacksZ[leftRight]); // 次に台札に積むカードの高さ this.centerStacksY[leftRight] += 0.2f; } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 一本化すれば こんな感じか」</p> <pre><code class="csharp"> // 左の台札が空っぽの状態 this.centerStacksX[1] = -15.0f; this.centerStacksY[1] = minY; this.centerStacksZ[1] = 10.0f; // 右の台札が空っぽの状態 this.centerStacksX[0] = 15.0f; this.centerStacksY[0] = minY; this.centerStacksZ[0] = 0.0f; // 左の台札を積み上げる { PutCardToCenterStack( player: 1, // 2プレイヤーが handIndex: 0, // 場札の1枚目から leftRight: 0 // 左の ); } // 右の台札を積み上げる { PutCardToCenterStack( player: 0, // 1プレイヤーが handIndex: 0, // 場札の1枚目から leftRight: 1 // 右の ); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ゲーム開始時の台札は こんな感じに置く」</p> <p><a href="https://crieit.now.sh/upload_images/d58d857a620027e6d00db7151d8ccdc163d3ea43f2156.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d58d857a620027e6d00db7151d8ccdc163d3ea43f2156.png?mw=700" alt="202301_unity_28-0013--coroutine-1.png" /></a></p> <pre><code class="csharp"> IEnumerator DoDemo() { float seconds = 1.0f; yield return new WaitForSeconds(seconds); // 1プレイヤーの1枚目のカードにフォーカスを当てる GetCard(0, 0, (goCard) => SetFocus(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの1枚目のカードのフォーカスを外す GetCard(0, 0, (goCard) => ResetFocus(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの2枚目のカードにフォーカスを当てる GetCard(0, 1, (goCard) => SetFocus(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの2枚目のカードのフォーカスを外す GetCard(0, 1, (goCard) => ResetFocus(goCard)); yield return new WaitForSeconds(seconds); // 右の台札を積み上げる { PutCardToCenterStack( player: 0, // 1プレイヤーが handIndex: 1, // 場札の2枚目から leftRight: 1 // 右の台札 ); } yield return new WaitForSeconds(seconds); // - // 2プレイヤーの1枚目のカードにフォーカスを当てる GetCard(1, 0, (goCard) => SetFocus(goCard)); yield return new WaitForSeconds(seconds); // 2プレイヤーの1枚目のカードのフォーカスを外す GetCard(1, 0, (goCard) => ResetFocus(goCard)); yield return new WaitForSeconds(seconds); // 2プレイヤーの2枚目のカードにフォーカスを当てる GetCard(1, 1, (goCard) => SetFocus(goCard)); yield return new WaitForSeconds(seconds); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 あっ、そうだ コルーチン使お」</p> <p><a href="https://crieit.now.sh/upload_images/48076d79f58dd808524438de34cfd70d63d3eb135da8c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/48076d79f58dd808524438de34cfd70d63d3eb135da8c.png?mw=700" alt="202301_unity_28-0016--demo-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 台札に置けるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 次は、手札から 1枚取ってきて 場札として置く動作を作りなさいよ。<br /> そのとき 場札の位置が 歯抜けだったりするだろうから、位置の再調整がいるかもしれないわね」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 今日はここまでだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 おつ」</p> <p>📅2023-01-28 fri 00:20 end</p> <h1 id="📅2023-01-28 sat 17:51"><a href="#%F0%9F%93%852023-01-28+sat+17%3A51">📅2023-01-28 sat 17:51</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👇 場札を並べるコードは 以下のように書いているんだが……」</p> <p><code>Assets.Scripts.GameManager.cs</code> :</p> <pre><code class="csharp"> // 2プレイヤーの場札を並べる(画面では、左から右へ並べる) { float x = maxX; float y = minY; float z = player2HandZ; float xStep = (maxX - minX) / (goPlayersHandCards[1].Count - 1); foreach (var goCard in goPlayersHandCards[1]) { SetPosRot(goCard, x, y, z, angleY: 0.0f); x -= xStep; } } // 中略 // 1プレイヤーの場札を並べる(画面では、右から左へ並べる) { float x = minX; float y = minY; float z = player1HandZ; float xStep = (maxX - minX) / (goPlayersHandCards[0].Count - 1); foreach (var goCard in goPlayersHandCards[0]) { SetPosRot(goCard, x, y, z); x += xStep; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 1プレイヤーが 右から左へ、 2プレイヤーが 左から右へ、 みたいな 方向がまったく逆のものを<br /> 1本化 するのは ちょっと すっきりしない方法を使うぜ」</p> <pre><code class="csharp">public class GameManager : MonoBehaviour { /// <summary> /// 西端 /// </summary> readonly float minX = -62.0f; /// <summary> /// 東端 /// </summary> readonly float maxX = 62.0f; /// <summary> /// 底端 /// /// - `0.0f` は盤 /// </summary> readonly float minY = 0.5f; readonly float player2HandZ = 42.0f; readonly float player2PileZ = 26.0f; readonly float player1PileZ = -12.0f; readonly float player1HandZ = -28.0f; </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 その前に 決まりきった座標を 読取専用でメソッドからアクセスできる自由変数にしておこうぜ」</p> <pre><code class="csharp"> /// <summary> /// 場札を並べる /// </summary> void ArrangeHandCardsP2(int player) { // 2プレイヤーの場札を並べる(画面では、左から右へ並べる) float x = maxX; float xStep = (maxX - minX) / (goPlayersHandCards[player].Count - 1); foreach (var goCard in goPlayersHandCards[player]) { SetPosRot(goCard, x, minY, player2HandZ, angleY: 0.0f); x -= xStep; } } /// <summary> /// 場札を並べる /// </summary> void ArrangeHandCardsP1(int player) { // 1プレイヤーの場札を並べる(画面では、右から左へ並べる) float x = minX; float xStep = (maxX - minX) / (goPlayersHandCards[player].Count - 1); foreach (var goCard in goPlayersHandCards[player]) { SetPosRot(goCard, x, minY, player1HandZ); x += xStep; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 プログラマーのやってることって、違う書き方のコードを1本化することだよな。<br /> この2つを 1本化しようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/9af8c264c924f14f45b2c54b01a3183a63d4eb631459e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9af8c264c924f14f45b2c54b01a3183a63d4eb631459e.png?mw=700" alt="202301_unity_28-1830--player-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 プレイヤー1と2で 違う変数を使っているのを止めて、配列かリストにしようぜ?」</p> <pre><code class="csharp"> readonly float[] handCardsZ = new[] { -28.0f, 42.0f }; readonly float[] pileCardsZ = new[] { -12.0f, 26.0f }; </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こう」</p> <pre><code class="csharp"> /// <summary> /// 場札を並べる /// </summary> void ArrangeHandCards(int player) { float angleY; float stepSign; float x; switch (player) { case 0: // 1プレイヤーの場札は、画面では、右から左へ並べる angleY = 180.0f; stepSign = 1; x = minX; break; case 1: // 2プレイヤーの場札は、画面では、左から右へ並べる angleY = 0.0f; stepSign = -1; x = maxX; break; default: throw new Exception(); } float xStep = stepSign * (maxX - minX) / (goPlayersHandCards[player].Count - 1); foreach (var goCard in goPlayersHandCards[player]) { SetPosRot(goCard, x, minY, handCardsZ[player], angleY: angleY); x += xStep; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 1本化したら こうなったぜ」</p> <p>📅2023-01-28 sat 18:46</p> <p><a href="https://crieit.now.sh/upload_images/08af1db6255bb190ceaeba626ab2a42063d4f23cb4d13.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/08af1db6255bb190ceaeba626ab2a42063d4f23cb4d13.png?mw=700" alt="202301_unity_28-1850--addPile-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 次は 『手札から1枚抜いて場札に置く』というモーションを1つの関数にしたいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 せっかく n枚 指定できる作りなのに……」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ n枚 のところも残すか……」</p> <pre><code class="csharp"> /// <summary> /// 手札からn枚抜いて、場札へ移動する /// /// - 場札は並び直される /// </summary> void AddCardsToHandFromPile(int player, int numberOfCards) { // 手札からn枚抜いて、場札へ移動する var goCards = goPlayersPileCards[player].GetRange(0, numberOfCards); goPlayersPileCards[player].RemoveRange(0, numberOfCards); goPlayersHandCards[player].AddRange(goCards); // 場札を並べる ArrangeHandCards(player); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんな感じで」</p> <p>📅2023-01-28 sat 19:12</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 手札を先頭から抜いたら、後ろのカードが浮いたままになってしまうわよ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 確かに」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 先頭から抜くのが おかしいのでは? 後ろから抜けだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 もっともだぜ」</p> <pre><code class="csharp"> /// <summary> /// 手札の上の方からn枚抜いて、場札の後ろへ追加する /// /// - 画面上の場札は位置調整される /// </summary> void AddCardsToHandFromPile(int player, int numberOfCards) { // 手札の上の方からn枚抜いて、場札へ移動する var length = goPlayersPileCards[player].Count; // 手札の枚数 if (numberOfCards <= length) { var startIndex = length - numberOfCards; var goCards = goPlayersPileCards[player].GetRange(startIndex, numberOfCards); goPlayersPileCards[player].RemoveRange(startIndex, numberOfCards); goPlayersHandCards[player].AddRange(goCards); // 場札を並べる ArrangeHandCards(player); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうかな」</p> <p>📅2023-01-28 sat 19:51</p> <p><a href="https://crieit.now.sh/upload_images/040401253e79479b700bb3e75f2b586e63d500601bf39.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/040401253e79479b700bb3e75f2b586e63d500601bf39.png?mw=700" alt="202301_unity_28-2000--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 画作り を進め中」</p> <p><a href="https://crieit.now.sh/upload_images/fed74a67948058a38082edad6516497663d5013bbfedb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fed74a67948058a38082edad6516497663d5013bbfedb.png?mw=700" alt="202301_unity_28-2003--piles-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 スピードをやってて、手札を積み上げるのって 全部で どういうケースがあるの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 初回で カードを配るときじゃないか?<br /> ゲームが始まったら 手札にカードを積む という動きは無いだろ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 初回は、どこから手札にカードが飛んでくるの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 どこからでもない。<br /> Unity のシーン上に ゲーム・オブジェクトが適当に散らばっているぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 関数にしたいのよ。<br /> 『どこかに置いてあって、それを手札に積む』という定型パターンに乗せたいから、<br /> どこかに置いてあることにしなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 手札以外には、台札と 場札しかないぜ。<br /> そのどっちかだろ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ ゲーム開始時に 散らばっているカードは<br /> 台札という扱いにして、ゲーム開始時に 『台札を色分けして、手札に積む』という定型パターンに乗せなさいよ」</p> <pre><code class="csharp"> // 台札 float[] centerStacksX = { 15.0f, -15.0f }; /// <summary> /// 台札のY座標 /// /// - 右が 0、左が 1 /// - 0.0f は盤なので、それより上にある /// </summary> float[] centerStacksY = { 0.5f, 0.5f }; float[] centerStacksZ = { 0.0f, 10.0f }; </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 台札の一番上のカードのY座標を 外側に追いやって……」</p> <pre><code class="csharp"> /// <summary> /// 台札を、手札へ移動する /// </summary> /// <param name="rightLeft">右:0, 左:1</param> void AddCardsToPileFromCenterStacks(int rightLeft) { // 台札の一番上(一番後ろ)のカードを1枚抜く var numberOfCards = 1; var length = goCenterStacksCards[rightLeft].Count; // 手札の枚数 if (1 <= length) { var startIndex = length - numberOfCards; var goCard = goCenterStacksCards[rightLeft].ElementAt(startIndex); goCenterStacksCards[rightLeft].RemoveAt(startIndex); // 黒いカードは1プレイヤー、赤いカードは2プレイヤー int player; float angleY; if (goCard.name.StartsWith("Clubs") || goCard.name.StartsWith("Spades")) { player = 0; angleY = 180.0f; } else if (goCard.name.StartsWith("Diamonds") || goCard.name.StartsWith("Hearts")) { player = 1; angleY = 0.0f; } else { throw new Exception(); } // プレイヤーの手札を積み上げる goPlayersPileCards[player].Add(goCard); SetPosRot(goCard, pileCardsX[player], pileCardsY[player], pileCardsZ[player], angleY: angleY, angleZ: 180.0f); pileCardsY[player] += 0.2f; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 台札を手札へ移動する動きも 1本化するぜ」</p> <pre><code class="csharp"> void Start() { // ゲーム開始時、とりあえず、すべてのカードは、いったん右の台札という扱いにする for (int i = 1; i < 14; i++) { // 右の台札 goCenterStacksCards[0].Add(GameObject.Find($"Clubs {i}")); goCenterStacksCards[0].Add(GameObject.Find($"Diamonds {i}")); goCenterStacksCards[0].Add(GameObject.Find($"Hearts {i}")); goCenterStacksCards[0].Add(GameObject.Find($"Spades {i}")); } // 右の台札をシャッフル var rightLeft = 0;// 右 goCenterStacksCards[rightLeft] = goCenterStacksCards[rightLeft].OrderBy(i => Guid.NewGuid()).ToList(); // 右の台札をすべて、色分けして、黒色なら1プレイヤーの、赤色なら2プレイヤーの、手札に乗せる while (0 < goCenterStacksCards[rightLeft].Count) { AddCardsToPileFromCenterStacks(rightLeft); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 それに引きずられて、開始時の処理も変えるぜ」</p> <p>📅2023-01-28 sat 21:17</p> <pre><code class="csharp"> // 2プレイヤーが、場札の1枚目を抜いて、左の台札へ積み上げる PutCardToCenterStack( player: 1, // 2プレイヤーが handIndex: 0, // 場札の1枚目から rightLeft: 0 // 左の ); // 2プレイヤーの場札の位置調整 ArrangeHandCards(1); // 1プレイヤーが、場札の1枚目を抜いて、右の台札へ積み上げる PutCardToCenterStack( player: 0, // 1プレイヤーが handIndex: 0, // 場札の1枚目から rightLeft: 1 // 右の ); // 1プレイヤーの場札の位置調整 ArrangeHandCards(0); </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 場札の位置調整を 毎回書くのも煩わしいから 関数の中に入れるかだぜ」</p> <pre><code class="csharp"> /// <summary> /// 場札の好きなところから1枚抜いて、台札を1枚置く /// </summary> /// <param name="player">何番目のプレイヤー</param> /// <param name="handIndex">何枚目のカード</param> /// <param name="rightLeft">右なら0、左なら1</param> private void PutCardToCenterStackFromHand(int player, int handIndex, int rightLeft) { var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); goCenterStacksCards[rightLeft].Add(goCard); // 台札として置く // カードの位置をセット SetPosRot(goCard, this.centerStacksX[rightLeft], this.centerStacksY[rightLeft], this.centerStacksZ[rightLeft]); // 次に台札に積むカードの高さ this.centerStacksY[rightLeft] += 0.2f; // 場札の位置調整 ArrangeHandCards(player); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 モデルへの編集と、画面への編集は 同じ関数に入れない方がいいんだが、<br /> それは あとで考えるぜ。<br /> 関数名も変更」</p> <pre><code class="csharp"> void Start() { // ゲーム開始時、とりあえず、すべてのカードは、いったん右の台札という扱いにする const int right = 0;// 台札の右 const int left = 1;// 台札の左 for (int i = 1; i < 14; i++) { // 右の台札 goCenterStacksCards[right].Add(GameObject.Find($"Clubs {i}")); goCenterStacksCards[right].Add(GameObject.Find($"Diamonds {i}")); goCenterStacksCards[right].Add(GameObject.Find($"Hearts {i}")); goCenterStacksCards[right].Add(GameObject.Find($"Spades {i}")); } // 右の台札をシャッフル goCenterStacksCards[right] = goCenterStacksCards[right].OrderBy(i => Guid.NewGuid()).ToList(); // 右の台札をすべて、色分けして、黒色なら1プレイヤーの、赤色なら2プレイヤーの、手札に乗せる while (0 < goCenterStacksCards[right].Count) { AddCardsToPileFromCenterStacks(right); } // 1,2プレイヤーについて、手札から5枚抜いて、場札として置く(画面上の場札の位置は調整される) AddCardsToHandFromPile(player: 0, numberOfCards: 5); AddCardsToHandFromPile(player: 1, numberOfCards: 5); // 2プレイヤーが、場札の1枚目を抜いて、左の台札へ積み上げる PutCardToCenterStackFromHand( player: 1, // 2プレイヤーが handIndex: 0, // 場札の1枚目から place: left // 左の ); // 1プレイヤーが、場札の1枚目を抜いて、右の台札へ積み上げる PutCardToCenterStackFromHand( player: 0, // 1プレイヤーが handIndex: 0, // 場札の1枚目から place: right // 右の ); StartCoroutine("DoDemo"); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 開始時のコードが かなり短くなっただろ」</p> <p>📅2023-01-28 sat 21:37</p> <p><a href="https://crieit.now.sh/upload_images/ab86da7eb537bc99aadf3ebd969b8c6863d51737a5161.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ab86da7eb537bc99aadf3ebd969b8c6863d51737a5161.png?mw=700" alt="202301_unity_28-2137--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 場札の間隔が空きすぎていて、スピードをしてる感じ、しなくない?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 <strong>均等割り付け</strong> なんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 隙間を詰めてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/26148aac75f12353e84752b46a84c54163d519fbb4986.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/26148aac75f12353e84752b46a84c54163d519fbb4986.png?mw=700" alt="202301_unity_28-2147--calculate.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こういう感じか。 まるで プロポーショナル・フォント みたいだな」</p> <p><a href="https://crieit.now.sh/upload_images/5a09a01bf912e6528f2dbd9821d6cdbd63d51e488bc77.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5a09a01bf912e6528f2dbd9821d6cdbd63d51e488bc77.png?mw=700" alt="202301_unity_28-2208--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 カードの境界線が見えないから 1枚の長い紙みたいに見えるわよ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 世界に 境界線というものは 無いので……」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 カードを少し傾けたらどうだぜ?」</p> <p>📅2023-01-28 sat 22:09</p> <p><a href="https://crieit.now.sh/upload_images/a377c400c9e27ce82da82679529fa85863d51fd264fac.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a377c400c9e27ce82da82679529fa85863d51fd264fac.png?mw=700" alt="202301_unity_28-2214--angle.png" /></a></p> <pre><code class="csharp"> /// <summary> /// 場札を並べる /// </summary> void ArrangeHandCards(int player) { int numberOfCards = goPlayersHandCards[player].Count; // カードの枚数 if (numberOfCards < 1) { return; } float cardAngleZ = -5; // カードの少しの傾き float cardWidth = 10; // カードの横幅 float marginRight = -2; // カードは隣のカードと少し重なる float wholeWidth = numberOfCards * cardWidth + ((numberOfCards - 1) * marginRight); // 場札全体の横幅 float centerOfLeftestCard = -(wholeWidth / 2 - (cardWidth / 2)); // 1プレイヤーから見て一番左のカードの中心座標 float angleY; float stepSign; float x; switch (player) { case 0: // 1プレイヤーの場札は、画面では、右から左へ並べる angleY = 180.0f; stepSign = 1; x = centerOfLeftestCard; break; case 1: // 2プレイヤーの場札は、画面では、左から右へ並べる angleY = 0.0f; stepSign = -1; x = -centerOfLeftestCard; break; default: throw new Exception(); } float xStep = stepSign * (cardWidth + marginRight); foreach (var goCard in goPlayersHandCards[player]) { SetPosRot(goCard, x, minY, handCardsZ[player], angleY: angleY, angleZ: cardAngleZ); x += xStep; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 2プレイヤー側は いい感じに影が付いたが、1プレイヤー側は 光の当たり方のせいで 思ったようにはなってないぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 扇状に並べたら いい感じになるんじゃない?」</p> <p>📅2023-01-28 sat 22:17</p> <p><a href="https://crieit.now.sh/upload_images/e0cdf84d063a717958eaf0a4eb708d0363d5223685550.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e0cdf84d063a717958eaf0a4eb708d0363d5223685550.png?mw=700" alt="202301_unity_28-2220--calculate.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 頭の運動不足の頭では n枚のとき角度は何mがいいのか ぱっと出てこないが まあ 手調整してみるか」</p> <p><a href="https://crieit.now.sh/upload_images/451a21aeb768027cb85956a23304222863d523df195f7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/451a21aeb768027cb85956a23304222863d523df195f7.png?mw=700" alt="202301_unity_28-2227--calculate.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんな式だったかな?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 Y は空を指してるから、テーブルの奥は Z ね」</p> <p>📅2023-01-28 sat 22:58</p> <p><a href="https://crieit.now.sh/upload_images/e89144db700bf6658c029cdae3fcb07c63d52957045fd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e89144db700bf6658c029cdae3fcb07c63d52957045fd.png?mw=700" alt="202301_unity_28-2254--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 うーん、 どうすればいいのか。ちょっと 考えようか」</p> <p><a href="https://crieit.now.sh/upload_images/16f459ea4a174ee5b69b354607d77b7863d52a3ade814.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/16f459ea4a174ee5b69b354607d77b7863d52a3ade814.png?mw=700" alt="202301_unity_28-2256--idea.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 これで行ってみるかだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d0b68d4d1a088f2f9f87ab91931f876063d52d26c2bc0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d0b68d4d1a088f2f9f87ab91931f876063d52d26c2bc0.png?mw=700" alt="202301_unity_28-2311--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 わたしは恥ずかしい。一発で決めれない」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 何発で決まったとか ユーザーには分かんないから 目視確認と 手調整を繰り返せばいいのよ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 半径が 100、スタートの角度が 110°、 間隔の角度は -4° でこれだから、<br /> もっと半径を大きくして カーブを緩くするか」</p> <p><a href="https://crieit.now.sh/upload_images/d41b155b49f4551af3ae041a30fa1f3563d52fbe64198.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d41b155b49f4551af3ae041a30fa1f3563d52fbe64198.png?mw=700" alt="202301_unity_28-2322--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 半径が 200、スタートの角度が 112°、 間隔の角度は -1.83°、 円の中心のz位置を +10」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 うまく画面に収めたが、ゲーム中にこんなケースは出てこないのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 盤の周りが スカスカに空いてる分には ユーザーも困らないでしょう」</p> <p><a href="https://crieit.now.sh/upload_images/caf7c6cc3f7bd62dacfdeee456ad0aa263d531f2053da.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/caf7c6cc3f7bd62dacfdeee456ad0aa263d531f2053da.png?mw=700" alt="202301_unity_28-2332--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 2P側も どう見えるか確認だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 台札は カードが積み重なっていくはずだから、 画面の下側に 気持ち ずらした方がよくない?」</p> <p>📅2023-01-28 sat 22:58</p> <p><a href="https://crieit.now.sh/upload_images/a3de1bff60c52c33dd076bbecb3e1dcf63d533a7eeb87.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a3de1bff60c52c33dd076bbecb3e1dcf63d533a7eeb87.png?mw=700" alt="202301_unity_28-2339--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 几帳面に真上に積むから 2Pのカードと被って見えることは無さそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 几帳面に積まれるのも スピードな感じは しないわねえ」</p> <p><a href="https://crieit.now.sh/upload_images/bf87bea9ab444f6333a58139cf0dd26263d53857d7652.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bf87bea9ab444f6333a58139cf0dd26263d53857d7652.png?mw=700" alt="202301_unity_28-2359--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ランダムにずれを入れると どこに行くか わからんけど」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 もっと 上下の空いてる方向に 伸びなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/906d94f006435d15bb7ac931844003ba63d53a468f78f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/906d94f006435d15bb7ac931844003ba63d53a468f78f.png?mw=700" alt="202301_unity_29-0007--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 スピードな感じは しないわねえ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 台札の所定の位置から離れていくのが おかしいのと、<br /> カードが几帳面に 正方形の角度が ぶれてないのが おかしいんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 なるほど」</p> <p><a href="https://crieit.now.sh/upload_images/2c6b4f87a4a0b118168adace270d965463d53d7939ad3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2c6b4f87a4a0b118168adace270d965463d53d7939ad3.png?mw=700" alt="202301_unity_29-0021--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 少しは 揃えて置こうと してほしいわねえ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 1プレイヤー、2プレイヤーが 右利きか、左利きかでも 変わってくるんじゃないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 そんなん 設定するのも 嬉しさがあるのか分からないので 右利き ということにしとこうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/5cde71936fe6af498ffe18637d8fef4263d5429662c3a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5cde71936fe6af498ffe18637d8fef4263d5429662c3a.png?mw=700" alt="202301_unity_29-0042--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 少しは揃えてみたのと、1プレイヤーと 2プレイヤーで 大きく捻る回転方向を ずらしたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 良くは なってきたわね」</p> <pre><code class="csharp"> /// <summary> /// ぴったり積むと不自然だから、X と Z を少しずらすための仕組み /// /// - 1プレイヤー、2プレイヤーのどちらも右利きと仮定 /// </summary> /// <param name="player"></param> /// <returns></returns> (float, float, float) MakeShakeForCenterStack(int player) { // 1プレイヤーから見て。左上にずれていくだろう var left = -1.5f; var right = 0.5f; var bottom = -0.5f; var top = 1.5f; var angleY = UnityEngine.Random.Range(-10, 40); // 反時計回りに大きく捻りそう switch (player) { case 0: return (UnityEngine.Random.Range(left, right), UnityEngine.Random.Range(bottom, top), angleY); case 1: return (UnityEngine.Random.Range(-right, -left), UnityEngine.Random.Range(-top, -bottom), angleY); default: throw new Exception(); } } </code></pre> <p>📅2023-01-29 sat 00:42</p> <p><a href="https://crieit.now.sh/upload_images/451b97166a4ee878146f6f824fc6df3b63d5440e06550.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/451b97166a4ee878146f6f824fc6df3b63d5440e06550.png?mw=700" alt="202301_unity_29-0049--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 カードのセンタリングが まだ作ってないので 作るぜ」</p> <p><a href="https://crieit.now.sh/upload_images/08a864806a6973158ce09b84cd87f77c63d54556e70c3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/08a864806a6973158ce09b84cd87f77c63d54556e70c3.png?mw=700" alt="202301_unity_29-0054--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんか 手札が めっちゃ遠くに見えるな」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 そりゃ、25枚の場札に合わせた位置だしな」</p> <p>ソースコード:</p> <pre><code class="csharp"> /// <summary> /// 場札を並べる /// </summary> void ArrangeHandCards(int player) { // 25枚の場札が並べるように調整してある int numberOfCards = goPlayersHandCards[player].Count; // カードの枚数 if (numberOfCards < 1) { return; } float cardAngleZ = -5; // カードの少しの傾き int range = 200; // 半径。大きな円にするので、中心を遠くに離したい int offsetCircleCenterZ; // 中心位置の調整 float angleY; float playerTheta; // float leftestAngle = 112.0f; float angleStep = -1.83f; float startTheta = (numberOfCards * Mathf.Abs(angleStep) / 2 - Mathf.Abs(angleStep) / 2 + 90.0f) * Mathf.Deg2Rad; float thetaStep = angleStep * Mathf.Deg2Rad; ; // 時計回り float ox = 0.0f; float oz = handCardsZ[player]; switch (player) { case 0: // 1プレイヤー angleY = 180.0f; playerTheta = 0; offsetCircleCenterZ = -190; break; case 1: // 2プレイヤー angleY = 0.0f; playerTheta = 180 * Mathf.Deg2Rad; offsetCircleCenterZ = 188; // カメラのパースペクティブが付いているから、目視で調整 break; default: throw new Exception(); } float theta = startTheta; foreach (var goCard in goPlayersHandCards[player]) { float x = range * Mathf.Cos(theta + playerTheta) + ox; float z = range * Mathf.Sin(theta + playerTheta) + oz + offsetCircleCenterZ; SetPosRot(goCard, x, minY, z, angleY: angleY, angleZ: cardAngleZ); theta += thetaStep; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 このコードは まあ こんなもんだろ」</p> <p><a href="https://crieit.now.sh/upload_images/6f29b136f7add61236e8cdfb44a59b8863d5471b2f5bb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6f29b136f7add61236e8cdfb44a59b8863d5471b2f5bb.png?mw=700" alt="202301_unity_29-0102--picture-making.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 目視確認と 感覚で 調整」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 画作り は、こんなもんでいいでしょ」</p> <p>📅2023-01-29 sat 01:04</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 次は 入力 を作っていきましょう」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 カーソル・キーの 左、右で ピックアップしている場札を 隣の札に変えるようにしましょう」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 すると、今どの場札に フォーカスが当たっているかを 変数として持ちたいよな」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 でも 今日はここまでだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 おつ」</p> <p>📅2023-01-29 sat 01:23</p> <h1 id="📅2023-01-29 sat 15:05"><a href="#%F0%9F%93%852023-01-29+sat+15%3A05">📅2023-01-29 sat 15:05</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 入力を受け取る部分を まず書くか」</p> <p><code>Assets.Scripts.GameManager.cs</code> :</p> <pre><code class="csharp"> void Update() { // 1プレイヤー if (Input.GetKey(KeyCode.UpArrow)) { // TODO 選択中の場札を1枚抜いて、左の台札に置く } else if (Input.GetKey(KeyCode.DownArrow)) { // TODO 選択中の場札を1枚抜いて、右の台札に置く } else if (Input.GetKeyDown(KeyCode.LeftArrow)) { // TODO 左隣の場札を選択する } else if (Input.GetKeyDown(KeyCode.RightArrow)) { // TODO 右隣の場札を選択する } // 2プレイヤー if (Input.GetKey(KeyCode.W)) { // TODO (1プレイヤー視点で言うと)選択中の場札を1枚抜いて、右の台札に置く } else if (Input.GetKey(KeyCode.S)) { // TODO (1プレイヤー視点で言うと)選択中の場札を1枚抜いて、左の台札に置く } else if (Input.GetKeyDown(KeyCode.A)) { // TODO (1プレイヤー視点で言うと)右隣の場札を選択する } else if (Input.GetKeyDown(KeyCode.D)) { // TODO (1プレイヤー視点で言うと)右隣の場札を選択する } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 スピードの操作って 他にある?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 だいたい こんなもんでしょう。<br /> あとで 気づいたら そのとき 追加しましょう」</p> <p>📅2023-01-29 sat 15:24</p> <p><code>Assets.Scripts.GameManager.cs</code> :</p> <pre><code class="csharp"> /// <summary> /// プレイヤーが選択しているカードは、先頭から何枚目 /// </summary> int[] playsersFocusedCardIndex ={ 0, 0 }; </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 何枚目のカードを選択しているか、覚えさせることにするぜ」</p> <pre><code class="csharp"> /// <summary> /// 左(前側)のカードをフォーカスします /// </summary> /// <param name="player"></param> void MoveFocusToLeftCard(int player) { var previous = playsersFocusedCardIndex[player]; var current = previous - 1; if (current < 1) { return; } // 前にフォーカスしていたカードを、盤に下ろす var goPreviousCard = goPlayersHandCards[player][previous]; ResetFocusHand(goPreviousCard); // 今回フォーカスするカードを持ち上げる var goCurrentCard = goPlayersHandCards[player][current]; SetFocusHand(goCurrentCard); } /// <summary> /// 右(後ろ側)のカードをフォーカスします /// </summary> /// <param name="player"></param> void MoveFocusToRightCard(int player) { var previous = playsersFocusedCardIndex[player]; var current = previous + 1; if (goPlayersHandCards[player].Count <= current) { return; } // 前にフォーカスしていたカードを、盤に下ろす var goPreviousCard = goPlayersHandCards[player][previous]; ResetFocusHand(goPreviousCard); // 今回フォーカスするカードを持ち上げる var goCurrentCard = goPlayersHandCards[player][current]; SetFocusHand(goCurrentCard); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうかなあ?」</p> <p>📅2023-01-29 sat 15:42</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 1本化しろだぜ」</p> <pre><code class="csharp"> /// <summary> /// 隣のカードへフォーカスを移します /// </summary> /// <param name="player"></param> /// <param name="direction">後ろ:0, 前:1</param> void MoveFocusToNextCard(int player, int direction) { int previous; int current; switch (direction) { case 0: previous = playsersFocusedCardIndex[player]; current = previous + 1; if (goPlayersHandCards[player].Count <= current) { return; } break; case 1: previous = playsersFocusedCardIndex[player]; current = previous - 1; if (current < 0) { return; } break; default: throw new Exception(); } // 前にフォーカスしていたカードを、盤に下ろす var goPreviousCard = goPlayersHandCards[player][previous]; ResetFocusHand(goPreviousCard); // 今回フォーカスするカードを持ち上げる var goCurrentCard = goPlayersHandCards[player][current]; SetFocusHand(goCurrentCard); // 更新 playsersFocusedCardIndex[player] = current; } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうかなあ?」</p> <p>📅2023-01-29 sat 15:45</p> <p>古いコード:</p> <pre><code class="csharp"> // 1プレイヤーの1枚目のカードにフォーカスを当てる GetCard(0, 0, (goCard) => SetFocusHand(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの1枚目のカードのフォーカスを外す GetCard(0, 0, (goCard) => ResetFocusHand(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの2枚目のカードにフォーカスを当てる GetCard(0, 1, (goCard) => SetFocusHand(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの2枚目のカードのフォーカスを外す GetCard(0, 1, (goCard) => ResetFocusHand(goCard)); yield return new WaitForSeconds(seconds); </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 これは」</p> <p>新しいコード:</p> <pre><code class="csharp"> // 1プレイヤーの1枚目のカードにフォーカスを当てる GetCard(0, 0, (goCard) => SetFocusHand(goCard)); yield return new WaitForSeconds(seconds); // 1プレイヤーの右隣のカードへフォーカスを移します MoveFocusToNextCard(0, 0); yield return new WaitForSeconds(seconds); // 1プレイヤーの2枚目のカードのフォーカスを外す GetCard(0, 1, (goCard) => ResetFocusHand(goCard)); yield return new WaitForSeconds(seconds); </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こう書き直せるな」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 『フォーカスされているカードはない』という状態を 有りにすれば、<br /> 『1枚目のカードにフォーカスを当てる』のも、<br /> 『1プレイヤーの右隣のカードへフォーカスを移します』で代用できるんじゃないの?」</p> <pre><code class="csharp"> /// <summary> /// プレイヤーが選択している場札は、先頭から何枚目 /// /// - 選択中の場札が無いなら、-1 /// </summary> int[] playsersFocusedCardIndex = { -1, -1 }; </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こう書き直して……」</p> <pre><code class="csharp"> /// <summary> /// 隣のカードへフォーカスを移します /// </summary> /// <param name="player"></param> /// <param name="direction">後ろ:0, 前:1</param> void MoveFocusToNextCard(int player, int direction) { int previous; int current; switch (direction) { case 0: var length = goPlayersHandCards[player].Count; previous = playsersFocusedCardIndex[player]; if (previous==-1) { // 最後尾の外から、最後尾へ入ってくる current = length - 1; } else { current = previous + 1; } if (length <= current) { return; } break; case 1: previous = playsersFocusedCardIndex[player]; if (previous==-1) { // 先頭の外から、先頭へ入ってくる current = 0; } else { current = previous - 1; } if (current < 0) { return; } break; default: throw new Exception(); } // 前にフォーカスしていたカードを、盤に下ろす var goPreviousCard = goPlayersHandCards[player][previous]; ResetFocusHand(goPreviousCard); // 今回フォーカスするカードを持ち上げる var goCurrentCard = goPlayersHandCards[player][current]; SetFocusHand(goCurrentCard); // 更新 playsersFocusedCardIndex[player] = current; } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうかだぜ」</p> <pre><code class="csharp"> for (int i=0; i<2; i++) { // 1プレイヤーの右隣のカードへフォーカスを移します MoveFocusToNextCard(0, 0); yield return new WaitForSeconds(seconds); } // 1プレイヤーの2枚目のカードのフォーカスを外す GetCard(0, 1, (goCard) => ResetFocusHand(goCard)); yield return new WaitForSeconds(seconds); </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 すると こう書けるわけかだぜ。 便利になるな」</p> <p>📅2023-01-29 sat 16:03</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 持ってる場札を、台札の上に置いたら、<br /> 場札は どれをピックアップしている状態に戻るんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 どれもピックアップしてないんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ また端っこから ピックアップし直しかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 それも不便だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ 抜いたカードの右隣を ピックアップするようにしたらいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 右端のカードを抜いたんだったら どうする?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 一番右端のカードを ピックアップしたらいいのよ。<br /> 何もピックアップしないというのも 自然だけど」</p> <p>📅2023-01-29 sat 16:21</p> <pre><code class="csharp"> void Start() { // ... 略 // 2プレイヤーが、場札の1枚目を抜いて、左の台札へ積み上げる MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが handIndex: 0, // 場札の1枚目から place: left // 左の ); // 1プレイヤーが、場札の1枚目を抜いて、右の台札へ積み上げる MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが handIndex: 0, // 場札の1枚目から place: right // 右の ); StartCoroutine("DoDemo"); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 既存のコードでは、任意の場所のカードを引き抜けたが、<br /> これを ピックアップしているカードを引き抜く ように固定したいぜ」</p> <pre><code class="csharp"> private void MoveCardToCenterStackFromHand(int player, int handIndex, int place) { var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 つまり handIndex 変数を廃止して、<br /> <code>playsersFocusedCardIndex[player]</code> を参照するように 1本化したいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 しろだぜ」</p> <pre><code class="csharp"> private void MoveCardToCenterStackFromHand(int player, int place) { int handIndex = playsersFocusedCardIndex[player]; // 何枚目の場札をピックアップしているか if (handIndex < 0 || goPlayersHandCards[player].Count <= handIndex) // 範囲外は無視 { return; } var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); if (goPlayersHandCards[player].Count <= handIndex) // 範囲外アクセス防止対応 { handIndex = goPlayersHandCards[player].Count - 1; } // ... 場札の位置調整が済んだ後で if (0 <= handIndex && handIndex < goPlayersHandCards[player].Count) // 範囲内なら { // 抜いたカードの右隣のカードを(有れば)ピックアップする var goNewPickupCard = goPlayersHandCards[player].ElementAt(handIndex); SetFocusHand(goNewPickupCard); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こう書きかえて」</p> <pre><code class="csharp"> void Start() { // ... 略 // 1プレイヤーの先頭のカードへフォーカスを移します MoveFocusToNextCard(player: 0, direction: 0); // 2プレイヤーの先頭のカードへフォーカスを移します MoveFocusToNextCard(player: 1, direction: 0); // 2プレイヤーが、ピックアップ中の場札を抜いて、左の台札へ積み上げる MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: left // 左の ); // 1プレイヤーが、ピックアップ中の場札を抜いて、右の台札へ積み上げる MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: right // 右の ); StartCoroutine("DoDemo"); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうだぜ」</p> <p>📅2023-01-29 sat 16:44</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 場札を並べ直すと、場札を全部 盤の上に置いてしまって ピックアップを忘れているぜ」</p> <pre><code class="csharp"> /// <summary> /// 場札を並べなおすと、持ち上げていたカードを下ろしてしまうので、再度、持ち上げる /// </summary> void ResumeCardPickup(int player) { int handIndex = playsersFocusedCardIndex[player]; // 何枚目の場札をピックアップしているか if (0 <= handIndex && handIndex < goPlayersHandCards[player].Count) // 範囲内なら { // 抜いたカードの右隣のカードを(有れば)ピックアップする var goNewPickupCard = goPlayersHandCards[player].ElementAt(handIndex); SetFocusHand(goNewPickupCard); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 再度、持ち上げるのを関数化して……」</p> <pre><code class="csharp"> /// <summary> /// 場札を並べる /// </summary> void ArrangeHandCards(int player) { // ... 略 // 場札を並べなおすと、持ち上げていたカードを下ろしてしまうので、再度、持ち上げる ResumeCardPickup(player); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 場札の並べなおしメソッドに組み込んでしまおう。<br /> 他の箇所の既存の 持ち上げ直しコードは消すぜ」</p> <p>📅2023-01-29 sat 17:07</p> <pre><code class="csharp"> void Update() { // 1プレイヤー if (Input.GetKeyDown(KeyCode.UpArrow)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: left // 左の ); } else if (Input.GetKeyDown(KeyCode.DownArrow)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: right // 右の ); } else if (Input.GetKeyDown(KeyCode.LeftArrow)) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)左隣のカードをピックアップするように変えます MoveFocusToNextCard(0, 1); } else if (Input.GetKeyDown(KeyCode.RightArrow)) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)右隣のカードをピックアップするように変えます MoveFocusToNextCard(0, 0); } // 2プレイヤー if (Input.GetKeyDown(KeyCode.W)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: right // 右の ); } else if (Input.GetKeyDown(KeyCode.S)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: left // 左の ); } else if (Input.GetKeyDown(KeyCode.A)) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)左隣のカードをピックアップするように変えます MoveFocusToNextCard(1, 1); } else if (Input.GetKeyDown(KeyCode.D)) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)右隣のカードをピックアップするように変えます MoveFocusToNextCard(1, 0); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 半分埋まったな」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 2プレイヤーは 頭がひっくり返って 不利じゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 上級者用のハンデに使えだぜ」</p> <p>📅2023-01-29 sat 17:18</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 動かしてみると 配列の範囲を超えるエラーと よく出会うので リミットチェックを入れていくぜ」</p> <pre><code class="csharp"> /// <summary> /// 隣のカードへフォーカスを移します /// </summary> /// <param name="player"></param> /// <param name="direction">後ろ:0, 前:1</param> void MoveFocusToNextCard(int player, int direction) { int previous; int current; var length = goPlayersHandCards[player].Count; switch (direction) { // 後ろへ case 0: previous = playsersFocusedCardIndex[player]; if (previous == -1) { // (ピックアップしているカードが無いとき)先頭の外から、先頭へ入ってくる current = 0; } else { current = previous + 1; if (length <= current) { // 範囲外は -1 ということにしておく current = -1; } } break; // 前へ case 1: previous = playsersFocusedCardIndex[player]; if (previous == -1) { // (ピックアップしているカードが無いとき)最後尾の外から、最後尾へ入ってくる current = length - 1; } else { current = previous - 1; // - 1 になるケースもある } break; default: throw new Exception(); } // 更新 playsersFocusedCardIndex[player] = current; if (0 <= previous && previous < goPlayersHandCards[player].Count) // 範囲内なら { // 前にフォーカスしていたカードを、盤に下ろす var goPreviousCard = goPlayersHandCards[player][previous]; ResetFocusHand(goPreviousCard); } if (0 <= current && current < goPlayersHandCards[player].Count) // 範囲内なら { // 今回フォーカスするカードを持ち上げる var goCurrentCard = goPlayersHandCards[player][current]; SetFocusHand(goCurrentCard); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こう」</p> <p>📅2023-01-29 sat 17:40</p> <p><a href="https://crieit.now.sh/upload_images/8372f0534816009612dd239cc72bf53a63d63200df956.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8372f0534816009612dd239cc72bf53a63d63200df956.png?mw=700" alt="202301_unity_29-1744--game.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 右端の場札を 台札の上に置いたら、<br /> 何も場札を選択していない状態になるんだけど、<br /> この瞬間、何ボタンを押したらいいのか 分かんなくなっちゃうのよね」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ、場札がある限り、必ず なんらかの場札が1枚 ピックアップされている状態にした方が いいのかだぜ?」</p> <pre><code class="csharp"> /// <summary> /// 隣のカードへフォーカスを移します /// </summary> /// <param name="player"></param> /// <param name="direction">後ろ:0, 前:1</param> void MoveFocusToNextCard(int player, int direction) { int previous = playsersFocusedCardIndex[player]; int current; var length = goPlayersHandCards[player].Count; if (length < 1) { // 場札が無いなら、何もピックアップされていません current = -1; } else { switch (direction) { // 後ろへ case 0: if (previous == -1 || length <= previous + 1) { // (ピックアップしているカードが無いとき)先頭の外から、先頭へ入ってくる current = 0; } else { current = previous + 1; } break; // 前へ case 1: if (previous == -1 || previous - 1 < 0) { // (ピックアップしているカードが無いとき)最後尾の外から、最後尾へ入ってくる current = length - 1; } else { current = previous - 1; } break; default: throw new Exception(); } } // 更新 playsersFocusedCardIndex[player] = current; if (0 <= previous && previous < goPlayersHandCards[player].Count) // 範囲内なら { // 前にフォーカスしていたカードを、盤に下ろす var goPreviousCard = goPlayersHandCards[player][previous]; ResetFocusHand(goPreviousCard); } if (0 <= current && current < goPlayersHandCards[player].Count) // 範囲内なら { // 今回フォーカスするカードを持ち上げる var goCurrentCard = goPlayersHandCards[player][current]; SetFocusHand(goCurrentCard); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 左右への移動は 右端が左端とつながっているようにループさせて」</p> <pre><code class="csharp"> /// <summary> /// 場札の好きなところから1枚抜いて、台札を1枚置く /// </summary> /// <param name="player">何番目のプレイヤー</param> /// <param name="place">右なら0、左なら1</param> private void MoveCardToCenterStackFromHand(int player, int place) { int handIndex = playsersFocusedCardIndex[player]; // 何枚目の場札をピックアップしているか if (handIndex < 0 || goPlayersHandCards[player].Count <= handIndex) // 範囲外は無視 { return; } var goCard = goPlayersHandCards[player].ElementAt(handIndex); // カードを1枚抜いて goPlayersHandCards[player].RemoveAt(handIndex); if (handIndex < 0 && 0 < goPlayersHandCards[player].Count) { handIndex = 0; } else if (goPlayersHandCards[player].Count <= handIndex) // 範囲外アクセス防止対応 { // 一旦、最後尾へ handIndex = goPlayersHandCards[player].Count - 1; } // それでも範囲外なら、負の数 playsersFocusedCardIndex[player] = handIndex; // 更新:何枚目の場札をピックアップしているか // ... 略 </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 台札の移動は 場札のどれかを必ず選択しておくようにするぜ」</p> <p>📅2023-01-29 sat 18:03</p> <h1 id="📅2023-01-31 mon 04:32"><a href="#%F0%9F%93%852023-01-31+mon+04%3A32">📅2023-01-31 mon 04:32</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 腰が痛くて 目が覚めたので 朝から練習しよ。<br /> えーと どこまで やったっけ?」</p> <p><a href="https://crieit.now.sh/upload_images/275d4af7ee594bca4c1ba9075063dc1f63d81c5528cd4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/275d4af7ee594bca4c1ba9075063dc1f63d81c5528cd4.png?mw=700" alt="202301_unity_31-0436--morning.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 フーン。<br /> 何やってたかな。手札を、場札へ移動する動きも付けたいな。<br /> デバッグ用に スペース・キーに割り当てるか」</p> <pre><code class="csharp"> void Update() { // ... // デバッグ用 if (Input.GetKeyDown(KeyCode.Space)) { // 両プレイヤーは手札から1枚抜いて、場札として置く for (var player=0; player<2; player++) { MoveCardsToHandFromPile(player, 1); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんなんでいいかな」</p> <p><a href="https://crieit.now.sh/upload_images/3e9991937dc29eef9156485c096c377763d81deeb7631.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3e9991937dc29eef9156485c096c377763d81deeb7631.png?mw=700" alt="202301_unity_31-0443--test.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし、手札を場札へ 移動できるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 操作方法を 画面に書き込むかな?」</p> <p><a href="https://crieit.now.sh/upload_images/b91e15681f759b32d14cf9ba5eba579563d8222dda221.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b91e15681f759b32d14cf9ba5eba579563d8222dda221.png?mw=700" alt="202301_unity_31-0501--png.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 どうやって 白色を 透過させるんだぜ?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://note.com/app49/n/n4e5a5f7aac2c">透過PNGの設定方法 Unity</a></p> <p><a href="https://crieit.now.sh/upload_images/f9b5502b6a5a2928c60acd507aaa9da763d82743c1689.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f9b5502b6a5a2928c60acd507aaa9da763d82743c1689.png?mw=700" alt="202301_unity_31-0522--png-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ゲーム・オブジェクトじゃなくて、画像素材側に設定するのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/fc0a753ba31798e572079457a0fb06a463d8288f960b7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fc0a753ba31798e572079457a0fb06a463d8288f960b7.png?mw=700" alt="202301_unity_31-0528--texture-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ウィンドウの縦幅を伸ばすと <code>Apply</code> ボタンが出てきた。気づかね~」</p> <p><a href="https://crieit.now.sh/upload_images/0e081080cd718666c3f53910083e349363d82951a4aa9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0e081080cd718666c3f53910083e349363d82951a4aa9.png?mw=700" alt="202301_unity_31-0531--single.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 べつに 白色が透過される様子もないぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/209553">unityで画像背景を透過させる方法が分かりません。</a><br /> 📖 <a target="_blank" rel="nofollow noopener" href="https://pc.atsuhiro-me.net/entry/2013/01/19/000000">Unityでテクスチャを透明にする</a></p> <p><a href="https://crieit.now.sh/upload_images/3fe7455f460ebf5c1b13f98864b0162863d82be8775df.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3fe7455f460ebf5c1b13f98864b0162863d82be8775df.png?mw=700" alt="202301_unity_31-0542--gimp-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 調べても分からんので昔ながらの方法でやる。GIMP を使って、<br /> PNG画像が RGB 形式で、データが 不透明度を表す A チャンネルを持ってないようなので、<br /> アルファ・チャンネルを追加し……」</p> <p><a href="https://crieit.now.sh/upload_images/d2ad59aa6cb86c87bbaf523fda87cda363d82cd3c987d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d2ad59aa6cb86c87bbaf523fda87cda363d82cd3c987d.png?mw=700" alt="202301_unity_31-0546--gimp-b-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 マジックワンドを使って 白い所を選んで、 <code>[Del]</code> キーで消すぜ」</p> <p><a href="https://crieit.now.sh/upload_images/b5be590cb8815894f852523c7819e38863d82d60d3535.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b5be590cb8815894f852523c7819e38863d82d60d3535.png?mw=700" alt="202301_unity_31-0549--transparent.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 画像を差し替えると 透過した」</p> <p><a href="https://crieit.now.sh/upload_images/8f6bd102d16990e3fe322b6af5a6e82e63d83294a854f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8f6bd102d16990e3fe322b6af5a6e82e63d83294a854f.png?mw=700" alt="202301_unity_31-0610--sprite-diffuse-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 この <code>Shader</code> は <code>Sprites/Diffuse</code> でいいのか?<br /> 自分が何やってんのか 分からなくて つらい」</p> <p>📅2023-01-31 sat 06:12</p> <p><a href="https://crieit.now.sh/upload_images/0e0aa6d92fbcce02b50662bae353d63963d838c020711.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0e0aa6d92fbcce02b50662bae353d63963d838c020711.png?mw=700" alt="202301_unity_31-0637--key-explain.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 操作説明は これぐらい うるさく書いておけば 確かだろ。<br /> 邪魔くさいが……」</p> <p>📅2023-01-31 sat 06:38</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 やっぱ RGB値を 加算したいな……。<br /> シェーダーの書き方を調べるか」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://shibuya24.info/entry/unity-ui-additive">【Unity UI】uGUIで色を加算合成する方法</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 日本人の薄っぺらい記事なんか読んでも さっぱり分からんな 公式読むか」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.unity3d.com/ja/2021.3/Manual/SL-VertexFragmentShaderExamples.html">カスタムシェーダーの基礎</a><br /> 📖 <a target="_blank" rel="nofollow noopener" href="https://docs.unity3d.com/ja/2021.3/Manual/shader-writing.html">シェーダーの作成</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>HLSL</code> という書き方を覚えればいいらしいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 数十分で終わるレベルではないので パス」</p> <p>📅2023-01-31 sat 06:58</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 次は、ゲームのルールを組み込んでいくか」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 しかし、今のプログラミングの書き方では ルール・ベースで書きにくい……」</p> <p><a href="https://crieit.now.sh/upload_images/536ba5b01096d0f188a03d6161da27e963d841d1070f4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/536ba5b01096d0f188a03d6161da27e963d841d1070f4.png?mw=700" alt="202301_unity_31-0715--game-view-model-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 いったん 画面関係の変数は <code>GameViewModel</code> クラスを新しく作って そっちへ移し……」</p> <p><a href="https://crieit.now.sh/upload_images/c6b7756586ef797f69daf16ce236a71763d84239388c9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c6b7756586ef797f69daf16ce236a71763d84239388c9.png?mw=700" alt="202301_unity_31-0717--game-manager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>GameManager.cs</code> の方では <code>GameViewModel</code> インスタンスを使うように書き直し……」</p> <p><a href="https://crieit.now.sh/upload_images/08f6ab6ebc398a80be9e777a38645aea63d843db3828a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/08f6ab6ebc398a80be9e777a38645aea63d843db3828a.png?mw=700" alt="202301_unity_31-0724--game-view-model-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 変数名の頭に <code>go</code> と付けたやつは <code>GameObject</code> なんで、<br /> 画面に関係するものは全部 <code>GameViewModel</code> クラスへ 追いやるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/4512ae14d4b714e74265ac153596ae6163d844b10115c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4512ae14d4b714e74265ac153596ae6163d844b10115c.png?mw=700" alt="202301_unity_31-0728--wrapping.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 配列の長さを取りたいときは、 <code>GetCenterStackCardsLength()</code> メソッドを使うようにする。<br /> これを ラッピング・メソッド(Wrapping method) という」</p> <p><a href="https://crieit.now.sh/upload_images/50fdf08e3d9aed1244e2b4096a015a8263d8456837f39.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/50fdf08e3d9aed1244e2b4096a015a8263d8456837f39.png?mw=700" alt="202301_unity_31-0731--game-manager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こうやって、 <code>GameManager</code> の方は、 ゲーム・オブジェクトをいじらなくても、<br /> <code>player: 0</code> とか、 <code>numberOfCards: 5</code> とか、命令だけ書けばいいような 見た目に変えていくぜ」</p> <p>📅2023-01-31 sat 07:33</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 全部 ラッピングするの 時間かかるから 今朝は ここまで」</p> <p>📅2023-01-31 sat 08:04</p> <h1 id="📅2023-01-31 mon 23:34"><a href="#%F0%9F%93%852023-01-31+mon+23%3A34">📅2023-01-31 mon 23:34</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 眠りが覚めた。ちょっと練習しよ」</p> <p>📅2023-02-01 sat 23:34 start</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 全体的に 書きかえた。また寝よ」</p> <p>📅2023-02-01 sat 03:54 end</p> <h1 id="📅2023-02-01 mon 21:04"><a href="#%F0%9F%93%852023-02-01+mon+21%3A04">📅2023-02-01 mon 21:04</a></h1> <p><a href="https://crieit.now.sh/upload_images/25b899318fe0de3300f6a947f55ecf8d63da5a0216a70.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/25b899318fe0de3300f6a947f55ecf8d63da5a0216a70.png?mw=700" alt="202302_unity_01-2123--explorer.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 大改造した」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 いっぱい増えてるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 会社でやってはいけないことの1つが 大改造よ。<br /> コード・レビュー受け付けられないから 没になるのよ」</p> <p><a href="https://crieit.now.sh/upload_images/ffc55cad2e3f7d0e7e7b80fe9d9b2b7a63da5aaeb2c58.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ffc55cad2e3f7d0e7e7b80fe9d9b2b7a63da5aaeb2c58.png?mw=700" alt="202302_unity_01-2127--timeline.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Unity に ゲームの基本機能が 足りな過ぎるので タイムライン機能を自作した」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 Unity にも あるかも知らんのに」</p> <p><a href="https://crieit.now.sh/upload_images/afa48d3d58dac5034c9bb9608797750163da5b2a18750.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/afa48d3d58dac5034c9bb9608797750163da5b2a18750.png?mw=700" alt="202302_unity_01-2129--command.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Command</code> (コマンド)というのは、プレイヤーができる操作だな。<br /> 中を見てみよう」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/Commands/ICommand.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; /// <summary> /// コマンド /// </summary> interface ICommand { /// <summary> /// コマンド実行 /// </summary> /// <param name="gameModelBuffer">ゲームの内部状態(編集可能)</param> /// <param name="gameViewModel">画面表示の状態(編集可能)</param> void DoIt(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 『コマンドを実行すると、 <strong>ゲームの内部状態</strong> と、 <strong>画面表示の状態</strong> が変わる』、ということを書いている」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/Commands/MoveCardsToHandFromPile.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; /// <summary> /// nプレイヤーの手札から場札へ、m枚のカードを移動 /// </summary> class MoveCardsToHandFromPile : ICommand { // - その他(生成) /// <summary> /// 生成 /// </summary> /// <param name="player">nプレイヤー</param> /// <param name="numberOfCards">カードがm枚</param> internal MoveCardsToHandFromPile(int player, int numberOfCards) { Player = player; NumberOfCards = numberOfCards; } // - プロパティ int Player { get; set; } int NumberOfCards { get; set; } // - メソッド /// <summary> /// 手札の上の方からn枚抜いて、場札の後ろへ追加する /// /// - 画面上の場札は位置調整される /// </summary> public void DoIt(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel) { // 手札の上の方からn枚抜いて、場札へ移動する var length = gameModelBuffer.IdOfCardsOfPlayersPile[Player].Count; // 手札の枚数 if (NumberOfCards <= length) { // もし、場札が空っぽのところへ、手札を配ったのなら、先頭の場札をピックアップする if (gameModelBuffer.IndexOfFocusedCardOfPlayers[Player] == -1) { gameModelBuffer.IndexOfFocusedCardOfPlayers[Player] = 0; } GameModel gameModel = new GameModel(gameModelBuffer); var startIndex = length - NumberOfCards; gameModelBuffer.MoveCardsToHandFromPile(Player, startIndex, NumberOfCards); gameViewModel.ArrangeHandCards(gameModel, Player); } } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 コマンドの中身は こんな感じだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 さっぱり分からん」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/Commands/MoveCardsToPileFromCenterStacks.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; using System; /// <summary> /// 右(または左)側の台札1枚を、手札へ移動する /// </summary> class MoveCardsToPileFromCenterStacks : ICommand { // - 生成 internal MoveCardsToPileFromCenterStacks(int place) { this.Place = place; } // - プロパティ int Place { get; set; } // - メソッド /// <summary> /// 台札を、手札へ移動する /// /// - ゲーム開始時に使う /// </summary> /// <param name="place">右:0, 左:1</param> public void DoIt(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel) { // 台札の一番上(一番後ろ)のカードを1枚抜く var numberOfCards = 1; var length = gameModelBuffer.IdOfCardsOfCenterStacks[Place].Count; // 台札の枚数 if (1 <= length) { var startIndex = length - numberOfCards; var idOfCard = gameModelBuffer.IdOfCardsOfCenterStacks[Place][startIndex]; gameModelBuffer.RemoveCardAtOfCenterStack(Place, startIndex); // 黒いカードは1プレイヤー、赤いカードは2プレイヤー int player; float angleY; var goCard = GameObjectStorage.PlayingCards[idOfCard]; if (goCard.name.StartsWith("Clubs") || goCard.name.StartsWith("Spades")) { player = 0; angleY = 180.0f; } else if (goCard.name.StartsWith("Diamonds") || goCard.name.StartsWith("Hearts")) { player = 1; angleY = 0.0f; } else { throw new Exception(); } // プレイヤーの手札を積み上げる gameModelBuffer.AddCardOfPlayersPile(player, idOfCard); gameViewModel.SetPosRot(idOfCard, gameViewModel.pileCardsX[player], gameViewModel.pileCardsY[player], gameViewModel.pileCardsZ[player], angleY: angleY, angleZ: 180.0f); gameViewModel.pileCardsY[player] += 0.2f; } } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 説明するの めんどくさいんで 感じろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 わらう」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/Commands/MoveCardToCenterStackFromHand.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; /// <summary> /// nプレイヤーがピックアップしている場札を、右(または左)の台札へ移動する /// </summary> class MoveCardToCenterStackFromHand : ICommand { // - 生成 internal MoveCardToCenterStackFromHand(int player, int place) { this.Player = player; this.Place = place; } // - プロパティ int Player { get; set; } int Place { get; set; } // - メソッド /// <summary> /// nプレイヤーがピックアップしている場札を、右(または左)の台札へ移動する /// </summary> /// <param name="player">何番目のプレイヤー</param> /// <param name="place">右なら0、左なら1</param> public void DoIt(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel) { var gameModel = new GameModel(gameModelBuffer); // ピックアップしているカードがあるか? GetIndexOfFocusedHandCard( gameModelBuffer: gameModelBuffer, player: Player, (indexOfFocusedHandCard) => { RemoveAtOfHandCard( gameModelBuffer: gameModelBuffer, gameViewModel: gameViewModel, player: Player, place: Place, indexOfHandCardToRemove: indexOfFocusedHandCard, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[Player] = indexOfNextFocusedHandCard; // 更新:何枚目の場札をピックアップしているか // 場札の位置調整 gameViewModel.ArrangeHandCards( gameModel: gameModel, player: Player); }); }); } private static void GetIndexOfFocusedHandCard(GameModelBuffer gameModelBuffer, int player, LazyArgs.SetValue<int> setIndex) { int handIndex = gameModelBuffer.IndexOfFocusedCardOfPlayers[player]; // 何枚目の場札をピックアップしているか if (handIndex < 0 || gameModelBuffer.IdOfCardsOfPlayersHand[player].Count <= handIndex) // 範囲外は無視 { return; } setIndex(handIndex); } /// <summary> /// 台札を抜く /// </summary> /// <param name="player"></param> /// <param name="indexOfHandCardToRemove"></param> /// <param name="setIndexOfNextFocusedHandCard"></param> private static void RemoveAtOfHandCard(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel, int player, int place, int indexOfHandCardToRemove, LazyArgs.SetValue<int> setIndexOfNextFocusedHandCard) { // 抜く前の場札の数 var lengthBeforeRemove = gameModelBuffer.IdOfCardsOfPlayersHand[player].Count; if (indexOfHandCardToRemove < 0 || lengthBeforeRemove <= indexOfHandCardToRemove) { // 抜くのに失敗 return; } // 抜いた後の場札の数 var lengthAfterRemove = lengthBeforeRemove - 1; // 抜いた後の次のピックアップするカードが先頭から何枚目か、先に算出 int indexOfNextFocusedHandCard; if (lengthAfterRemove <= indexOfHandCardToRemove) // 範囲外アクセス防止対応 { // 一旦、最後尾へ indexOfNextFocusedHandCard = lengthAfterRemove - 1; } else { // そのまま indexOfNextFocusedHandCard = indexOfHandCardToRemove; } var goCard = gameModelBuffer.IdOfCardsOfPlayersHand[player][indexOfHandCardToRemove]; // 場札を1枚抜いて gameModelBuffer.RemoveCardAtOfPlayerHand(player, indexOfHandCardToRemove); AddCardOfCenterStack2(gameModelBuffer, gameViewModel, goCard, place); // 台札 setIndexOfNextFocusedHandCard(indexOfNextFocusedHandCard); } private static void AddCardOfCenterStack2(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel, IdOfPlayingCards idOfCard, int place) { var gameModel = new GameModel(gameModelBuffer); // 手ぶれ var (shakeX, shakeZ, shakeAngleY) = gameViewModel.MakeShakeForCenterStack(place); // 台札の次の天辺(一番後ろ)のカードの中心座標 X, Z var (nextTopX, nextTopZ) = gameViewModel.GetXZOfNextCenterStackCard(gameModel, place); // 台札の捻り var goCard = GameObjectStorage.PlayingCards[idOfCard]; float nextAngleY = goCard.transform.rotation.eulerAngles.y; var length = gameModel.GetLengthOfCenterStackCards(place); if (length < 1) { } else { nextAngleY += shakeAngleY; } gameModelBuffer.AddCardOfCenterStack(place, idOfCard); // 台札として置く // 台札の位置をセット gameViewModel.SetPosRot(idOfCard, nextTopX + shakeX, gameViewModel.centerStacksY[place], nextTopZ + shakeZ, angleY: nextAngleY); // 次に台札に積むカードの高さ gameViewModel.centerStacksY[place] += 0.2f; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 👆 説明がないのなら コードも貼らなくていいのでは?」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/Commands/MoveFocusToNextCard.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; using System; /// <summary> /// nプレイヤーは、右(または左)隣のカードへ、ピックアップを移動します /// </summary> class MoveFocusToNextCard : ICommand { // - 生成 internal MoveFocusToNextCard(int player, int direction, LazyArgs.SetValue<int> setIndexOfNextFocusedHandCard) { this.Player = player; this.Direction = direction; this.SetIndexOfNextFocusedHandCard = setIndexOfNextFocusedHandCard; } // - プロパティ int Player { get; set; } int Direction { get; set; } LazyArgs.SetValue<int> SetIndexOfNextFocusedHandCard { get; set; } // - メソッド /// <summary> /// nプレイヤーは、右(または左)隣のカードへ、ピックアップを移動します /// </summary> /// <param name="player"></param> /// <param name="direction">後ろ:0, 前:1</param> public void DoIt(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel) { GameModel gameModel = new GameModel(gameModelBuffer); int indexOfFocusedHandCard = gameModelBuffer.IndexOfFocusedCardOfPlayers[Player]; int current; var length = gameModelBuffer.IdOfCardsOfPlayersHand[Player].Count; if (length < 1) { // 場札が無いなら、何もピックアップされていません current = -1; } else { switch (Direction) { // 後ろへ case 0: if (indexOfFocusedHandCard == -1 || length <= indexOfFocusedHandCard + 1) { // (ピックアップしているカードが無いとき)先頭の外から、先頭へ入ってくる current = 0; } else { current = indexOfFocusedHandCard + 1; } break; // 前へ case 1: if (indexOfFocusedHandCard == -1 || indexOfFocusedHandCard - 1 < 0) { // (ピックアップしているカードが無いとき)最後尾の外から、最後尾へ入ってくる current = length - 1; } else { current = indexOfFocusedHandCard - 1; } break; default: throw new Exception(); } } SetIndexOfNextFocusedHandCard(current); if (0 <= indexOfFocusedHandCard && indexOfFocusedHandCard < gameModelBuffer.IdOfCardsOfPlayersHand[Player].Count) // 範囲内なら { // 前にフォーカスしていたカードを、盤に下ろす gameViewModel.PutDownCardOfHand(gameModel, Player, indexOfFocusedHandCard); } if (0 <= current && current < gameModelBuffer.IdOfCardsOfPlayersHand[Player].Count) // 範囲内なら { // 今回フォーカスするカードを持ち上げる gameViewModel.PickupCardOfHand(gameModel, Player, current); } } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 まあ、 だから ゲームの状態と、 画面の表示を 変更するのが コマンドだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/b79e7864c7f7f432b4845dc43339ede663da5eed893ed.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b79e7864c7f7f432b4845dc43339ede663da5eed893ed.png?mw=700" alt="202302_unity_01-2144--timeline-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 そして コマンドに 時間を付けて、 時限式で 実行すりゃいいんだぜ。<br /> ソースを見てみよう」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/TimedItem.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline { using Assets.Scripts.Models.Timeline.Commands; /// <summary> /// 指定した時間と、そのとき実行されるコマンドのペア /// </summary> class TimedItem { // - その他(生成) internal TimedItem(float seconds, ICommand command) { this.Seconds = seconds; this.Command = command; } // - プロパティ internal float Seconds { get; private set; } internal ICommand Command { get; private set; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 タイムラインの上に置いてあるコマンドだぜ。<br /> 『音符』みたいなもんだぜ。 感じろ」</p> <p>📄 <code>Assets/Scripts/Models/Timeline/Model.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline { using Assets.Scripts.Models; using Assets.Scripts.Models.Timeline.Commands; using Assets.Scripts.Views; using System.Collections.Generic; /// <summary> /// タイムライン・モデル /// </summary> internal class Model { // - プロパティ List<TimedItem> timedItems = new(); internal List<TimedItem> TimedItems { get { return this.timedItems; } } // - メソッド /// <summary> /// 追加 /// </summary> /// <param name="seconds">実行される時間(秒)</param> /// <param name="command">コマンド</param> internal void Add(float seconds, ICommand command) { this.TimedItems.Add(new TimedItem(seconds,command)); } /// <summary> /// コマンドを消化 /// </summary> /// <param name="elapsedSeconds">ゲーム内消費時間(秒)</param> /// <param name="gameModelBuffer">ゲームの内部状態(編集可能)</param> /// <param name="gameViewModel">画面表示の状態(編集可能)</param> internal void DoIt(float elapsedSeconds, GameModelBuffer gameModelBuffer, GameViewModel gameViewModel) { if (0 < timedItems.Count) { var timedCommand = timedItems[0]; while (timedCommand.Seconds <= elapsedSeconds) { // 消化 timedItems.RemoveAt(0); timedCommand.Command.DoIt(gameModelBuffer, gameViewModel); if (0 < timedItems.Count) { timedCommand = timedItems[0]; } else { break; } } } } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 タイムラインは、『音符』のようなものが記憶されていて、時間が来たら実行される。<br /> 『楽譜』みたいなもんだぜ。 感じろ」</p> <p><a href="https://crieit.now.sh/upload_images/aff31060ad1af05bf580697fae24b5c563da609270f07.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aff31060ad1af05bf580697fae24b5c563da609270f07.png?mw=700" alt="202302_unity_01-2151--game-model-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ゲームの状態を記憶しているのは、 <code>GameModelBuffer</code> インスタンスだぜ。<br /> <code>GameModel</code> は、読み取り専用の <code>GameModelBuffer</code> だぜ」</p> <p>📄 <code>Assets/Scripts/Models/GameModel.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models { using System.Collections.Generic; /// <summary> /// ゲーム・モデル /// /// - 読み取り専用。(Immutable) /// </summary> class GameModel { GameModelBuffer gameModelBuffer; public GameModel(GameModelBuffer gameModel) { this.gameModelBuffer = gameModel; } /// <summary> /// 右(または左)の天辺の台札 /// </summary> /// <param name="place">右:0, 左:1</param> /// <returns></returns> internal IdOfPlayingCards GetLastCardOfCenterStack(int place) { var length = this.GetLengthOfCenterStackCards(place); var startIndex = length - 1; return this.gameModelBuffer.IdOfCardsOfCenterStacks[place][startIndex]; // 最後のカード } /// <summary> /// nプレイヤーが選択している場札は、先頭から何枚目 /// /// - 選択中の場札が無いなら、-1 /// </summary> /// <param name="player">プレイヤー</param> internal int GetIndexOfFocusedCardOfPlayer(int player) { return this.gameModelBuffer.IndexOfFocusedCardOfPlayers[player]; } /// <summary> /// 右(または左)の台札の枚数 /// </summary> /// <param name="place">右:0, 左:1</param> internal int GetLengthOfCenterStackCards(int place) { return this.gameModelBuffer.IdOfCardsOfCenterStacks[place].Count; } /// <summary> /// nプレイヤーの、場札の枚数 /// </summary> /// <param name="player">プレイヤー</param> /// <returns></returns> internal int GetLengthOfPlayerHandCards(int player) { return this.gameModelBuffer.IdOfCardsOfPlayersHand[player].Count; } /// <summary> /// nプレイヤーの、場札をリストで取得 /// </summary> /// <param name="player">プレイヤー</param> /// <returns></returns> internal List<IdOfPlayingCards> GetCardsOfPlayerHand(int player) { return this.gameModelBuffer.IdOfCardsOfPlayersHand[player]; } /// <summary> /// nプレイヤーの、m枚目の場札を取得 /// </summary> /// <param name="player"></param> /// <param name="handIndex"></param> /// <returns></returns> internal IdOfPlayingCards GetCardAtOfPlayerHand(int player, int handIndex) { return this.gameModelBuffer.IdOfCardsOfPlayersHand[player][handIndex]; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>GameModel</code> は、<code>GameModelBuffer</code> を包んでるわけだな」</p> <p>📄 <code>Assets/Scripts/Models/GameModelBuffer.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models { using System.Collections.Generic; /// <summary> /// ゲームの状態 /// /// - 編集可能 /// </summary> public class GameModelBuffer { // - プロパティ /// <summary> /// nプレイヤーが選択している場札は、先頭から何枚目 /// /// - 選択中の場札が無いなら、-1 /// </summary> internal int[] IndexOfFocusedCardOfPlayers { get; set; } = { -1, -1 }; /// <summary> /// 手札 /// /// - プレイヤー側で積んでる札 /// - 0: 1プレイヤー(黒色) /// - 1: 2プレイヤー(黒色) /// </summary> internal List<List<IdOfPlayingCards>> IdOfCardsOfPlayersPile { get; set; } = new() { new(), new() }; /// <summary> /// 場札 /// /// - プレイヤー側でオープンしている札 /// - 0: 1プレイヤー(黒色) /// - 1: 2プレイヤー(黒色) /// </summary> internal List<List<IdOfPlayingCards>> IdOfCardsOfPlayersHand { get; set; } = new() { new(), new() }; /// <summary> /// 台札 /// /// - 画面中央に積んでいる札 /// - 0: 右 /// - 1: 左 /// </summary> internal List<List<IdOfPlayingCards>> IdOfCardsOfCenterStacks { get; set; } = new() { new(), new() }; /// <summary> /// 台札を削除 /// </summary> /// <param name="place"></param> /// <param name="startIndex"></param> internal void RemoveCardAtOfCenterStack(int place, int startIndex) { this.IdOfCardsOfCenterStacks[place].RemoveAt(startIndex); } /// <summary> /// 台札を追加 /// </summary> /// <param name="place"></param> /// <param name="idOfCard"></param> internal void AddCardOfCenterStack(int place, IdOfPlayingCards idOfCard) { this.IdOfCardsOfCenterStacks[place].Add(idOfCard); } /// <summary> /// 手札を追加 /// </summary> /// <param name="player"></param> /// <param name="idOfCard"></param> internal void AddCardOfPlayersPile(int player, IdOfPlayingCards idOfCard) { this.IdOfCardsOfPlayersPile[player].Add(idOfCard); } /// <summary> /// 手札を削除 /// </summary> /// <param name="player"></param> /// <param name="startIndex"></param> /// <param name="numberOfCards"></param> internal void RemoveRangeCardsOfPlayerPile(int player, int startIndex, int numberOfCards) { this.IdOfCardsOfPlayersPile[player].RemoveRange(startIndex, numberOfCards); } /// <summary> /// 場札を追加 /// </summary> /// <param name="player"></param> /// <param name="idOfCards"></param> internal void AddRangeCardsOfPlayerHand(int player, List<IdOfPlayingCards> idOfCards) { this.IdOfCardsOfPlayersHand[player].AddRange(idOfCards); } /// <summary> /// 場札を削除 /// </summary> /// <param name="player"></param> /// <param name="handIndex"></param> internal void RemoveCardAtOfPlayerHand(int player, int handIndex) { this.IdOfCardsOfPlayersHand[player].RemoveAt(handIndex); } /// <summary> /// 手札から場札へ移動 /// </summary> /// <param name="player"></param> /// <param name="startIndex"></param> /// <param name="numberOfCards"></param> internal void MoveCardsToHandFromPile(int player, int startIndex, int numberOfCards) { var idOfCards = this.IdOfCardsOfPlayersPile[player].GetRange(startIndex, numberOfCards); this.RemoveRangeCardsOfPlayerPile(player, startIndex, numberOfCards); this.AddRangeCardsOfPlayerHand(player, idOfCards); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>GameModelBuffer</code> は、ゲームを時間で切った断面図みたいなもんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ スナップショットか?」</p> <p>📄 <code>Assets/Scripts/Models/IdOfPlayingCards.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models { /// <summary> /// トランプのカード /// /// - ジョーカーを除く /// </summary> internal enum IdOfPlayingCards { Clubs1, Clubs2, Clubs3, Clubs4, Clubs5, Clubs6, Clubs7, Clubs8, Clubs9, Clubs10, Clubs11, Clubs12, Clubs13, Diamonds1, Diamonds2, Diamonds3, Diamonds4, Diamonds5, Diamonds6, Diamonds7, Diamonds8, Diamonds9, Diamonds10, Diamonds11, Diamonds12, Diamonds13, Hearts1, Hearts2, Hearts3, Hearts4, Hearts5, Hearts6, Hearts7, Hearts8, Hearts9, Hearts10, Hearts11, Hearts12, Hearts13, Spades1, Spades2, Spades3, Spades4, Spades5, Spades6, Spades7, Spades8, Spades9, Spades10, Spades11, Spades12, Spades13, } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 トランプのカードの Id を、 enum型で作っておくぜ」</p> <p>📅2023-02-01 sat 22:04</p> <p><a href="https://crieit.now.sh/upload_images/6d9d89cdd24a2d5e55270c4e5208ad2e63da64fcd5564.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6d9d89cdd24a2d5e55270c4e5208ad2e63da64fcd5564.png?mw=700" alt="202302_unity_01-2210--view-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ビューは 画面表示関連だぜ」</p> <p>📄 <code>Assets/Scripts/Views/GameObjectStorage.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Views { using Assets.Scripts.Models; using System.Collections.Generic; using UnityEngine; /// <summary> /// ゲーム・オブジェクトと、その Id の紐づけ /// </summary> static class GameObjectStorage { internal static Dictionary<IdOfPlayingCards, GameObject> PlayingCards { get; private set; } = new(); internal static void Add(IdOfPlayingCards cardId, GameObject goCard) { PlayingCards.Add(cardId, goCard); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ゲーム・オブジェクトを、 Id で すぐ取り出せる仕組みを作っておくぜ。<br /> <code>GameObject.Find( ... )</code> は 処理が重たいらしいしな」</p> <p>📄 <code>Assets/Scripts/Views/GameViewModel.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Views { using Assets.Scripts.Models; using System; using UnityEngine; /// <summary> /// 画面表示関連 /// /// 西端: -62.0f /// 東端: 62.0f /// </summary> public class GameViewModel { // - プロパティー /// <summary> /// 底端 /// /// - `0.0f` は盤 /// </summary> internal readonly float minY = 0.5f; internal readonly float[] handCardsZ = new[] { -28.0f, 42.0f }; // 手札(プレイヤー側で伏せて積んでる札) internal readonly float[] pileCardsX = new[] { 40.0f, -40.0f }; // 端っこは 62.0f, -62.0f internal readonly float[] pileCardsY = new[] { 0.5f, 0.5f }; internal readonly float[] pileCardsZ = new[] { -6.5f, 16.0f }; // 台札 internal float[] centerStacksX = { 15.0f, -15.0f }; /// <summary> /// 台札のY座標 /// /// - 右が 0、左が 1 /// - 0.0f は盤なので、それより上にある /// </summary> internal float[] centerStacksY = { 0.5f, 0.5f }; internal float[] centerStacksZ = { 2.5f, 9.0f }; // - メソッド /// <summary> /// 台札の次の天辺の位置 /// </summary> /// <param name="place"></param> /// <returns></returns> internal (float, float) GetXZOfNextCenterStackCard(GameModel gameModel, int place) { var length = gameModel.GetLengthOfCenterStackCards(place); if (length < 1) { // 床上 var nextTopX2 = this.centerStacksX[place]; var nextTopZ2 = this.centerStacksZ[place]; return (nextTopX2, nextTopZ2); } // 台札の次の天辺の位置 var idOfLastCard = gameModel.GetLastCardOfCenterStack(place); // 天辺(最後)のカード var goLastCard = GameObjectStorage.PlayingCards[idOfLastCard]; var nextTopX = (this.centerStacksX[place] - goLastCard.transform.position.x) / 2 + this.centerStacksX[place]; var nextTopZ = (this.centerStacksZ[place] - goLastCard.transform.position.z) / 2 + this.centerStacksZ[place]; return (nextTopX, nextTopZ); } /// <summary> /// 場札を持ち上げる /// </summary> /// <param name="player"></param> /// <param name="handIndesx"></param> internal void PickupCardOfHand(GameModel gameModel, int player, int handIndesx) { var idOfFocusedHandCard = gameModel.GetCardAtOfPlayerHand(player, handIndesx); var liftY = 5.0f; // 持ち上げる(パースペクティブがかかっていて、持ち上げすぎると北へ移動したように見える) var rotateY = -5; // -5°傾ける var rotateZ = -5; // -5°傾ける var goCard = GameObjectStorage.PlayingCards[idOfFocusedHandCard]; goCard.transform.position = new Vector3(goCard.transform.position.x, goCard.transform.position.y + liftY, goCard.transform.position.z); goCard.transform.rotation = Quaternion.Euler(goCard.transform.rotation.eulerAngles.x, goCard.transform.rotation.eulerAngles.y + rotateY, goCard.transform.eulerAngles.z + rotateZ); } /// <summary> /// ピックアップしているカードを場に戻す /// </summary> /// <param name="card"></param> internal void PutDownCardOfHand(GameModel gameModel, int player, int handIndex) { var idOfCard = gameModel.GetCardAtOfPlayerHand(player, handIndex); var liftY = 5.0f; // 持ち上げる(パースペクティブがかかっていて、持ち上げすぎると北へ移動したように見える) var rotateY = -5; // -5°傾ける var rotateZ = -5; // -5°傾ける // 逆をする liftY = -liftY; rotateY = -rotateY; rotateZ = -rotateZ; var goCard = GameObjectStorage.PlayingCards[idOfCard]; goCard.transform.position = new Vector3(goCard.transform.position.x, goCard.transform.position.y + liftY, goCard.transform.position.z); goCard.transform.rotation = Quaternion.Euler(goCard.transform.rotation.eulerAngles.x, goCard.transform.rotation.eulerAngles.y + rotateY, goCard.transform.eulerAngles.z + rotateZ); } /// <summary> /// 場札を並べる /// /// - 左端は角度で言うと 112.0f /// </summary> internal void ArrangeHandCards(GameModel gameModel, int player) { int handIndex = gameModel.GetIndexOfFocusedCardOfPlayer(player); // 25枚の場札が並べるように調整してある int numberOfCards = gameModel.GetLengthOfPlayerHandCards(player); // 場札の枚数 if (numberOfCards < 1) { return; // 何もしない } float cardAngleZ = -5; // カードの少しの傾き int range = 200; // 半径。大きな円にするので、中心を遠くに離したい int offsetCircleCenterZ; // 中心位置の調整 float angleY; float playerTheta; float angleStep = -1.83f; float startTheta = (numberOfCards * Mathf.Abs(angleStep) / 2 - Mathf.Abs(angleStep) / 2 + 90.0f) * Mathf.Deg2Rad; float thetaStep = angleStep * Mathf.Deg2Rad; ; // 時計回り float ox = 0.0f; float oz = this.handCardsZ[player]; switch (player) { case 0: // 1プレイヤー angleY = 180.0f; playerTheta = 0; offsetCircleCenterZ = -190; break; case 1: // 2プレイヤー angleY = 0.0f; playerTheta = 180 * Mathf.Deg2Rad; offsetCircleCenterZ = 188; // カメラのパースペクティブが付いているから、目視で調整 break; default: throw new Exception(); } float theta = startTheta; foreach (var goCard in gameModel.GetCardsOfPlayerHand(player)) { float x = range * Mathf.Cos(theta + playerTheta) + ox; float z = range * Mathf.Sin(theta + playerTheta) + oz + offsetCircleCenterZ; SetPosRot(goCard, x, this.minY, z, angleY: angleY, angleZ: cardAngleZ); theta += thetaStep; } // 場札を並べなおすと、持ち上げていたカードを下ろしてしまうので、再度、持ち上げる this.ResumeCardPickup(gameModel, player); } /// <summary> /// 場札を並べなおすと、持ち上げていたカードを下ろしてしまうので、再度、持ち上げる /// </summary> private void ResumeCardPickup(GameModel gameModel, int player) { int handIndex = gameModel.GetIndexOfFocusedCardOfPlayer(player); if (0 <= handIndex && handIndex < gameModel.GetLengthOfPlayerHandCards(player)) // 範囲内なら { // 抜いたカードの右隣のカードを(有れば)ピックアップする this.PickupCardOfHand(gameModel, player, handIndex); } } /// <summary> /// カードの位置と 捻りの設定 /// </summary> /// <param name="card"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="angleY"></param> /// <param name="angleZ"></param> /// <param name="motionProgress">Update関数の中でないと役に立たない</param> internal void SetPosRot(IdOfPlayingCards idOfCard, float x, float y, float z, float angleY = 180.0f, float angleZ = 0.0f, float motionProgress = 1.0f) { var goCard = GameObjectStorage.PlayingCards[idOfCard]; var beginPos = goCard.transform.position; var endPos = new Vector3(x, y, z); goCard.transform.position = Vector3.Lerp(beginPos, endPos, motionProgress); goCard.transform.rotation = Quaternion.Euler(0, angleY, angleZ); } /// <summary> /// ぴったり積むと不自然だから、X と Z を少しずらすための仕組み /// /// - 1プレイヤー、2プレイヤーのどちらも右利きと仮定 /// </summary> /// <param name="player"></param> /// <returns></returns> internal (float, float, float) MakeShakeForCenterStack(int player) { // 1プレイヤーから見て。左上にずれていくだろう var left = -1.5f; var right = 0.5f; var bottom = -0.5f; var top = 1.5f; var angleY = UnityEngine.Random.Range(-10, 40); // 反時計回りに大きく捻りそう switch (player) { case 0: return (UnityEngine.Random.Range(left, right), UnityEngine.Random.Range(bottom, top), angleY); case 1: return (UnityEngine.Random.Range(-right, -left), UnityEngine.Random.Range(-top, -bottom), angleY); default: throw new Exception(); } } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ゲーム・ビュー・モデルは 画面の表示が どんな感じになってるか記憶したり、編集したりしているな」</p> <p><a href="https://crieit.now.sh/upload_images/bde2a0ff8832ed5f511872b547efed2563da664376b74.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bde2a0ff8832ed5f511872b547efed2563da664376b74.png?mw=700" alt="202302_unity_01-2216--game-manager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 一番上の階層のスクリプトは、整理できてないものが残っている」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 目立つんだから、重要なものを置けだぜ」</p> <p>📄 <code>Assets/Scripts/PlayingCard.cs</code> file:</p> <pre><code class="csharp">using UnityEngine; public class PlayingCard : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } // 今回は使わない // ///// <summary> ///// マウスボタン押下時 ///// </summary> //private void OnMouseDown() //{ // // 裏返します // var oldZ = transform.rotation.eulerAngles.z; // 度数法 // transform.rotation = Quaternion.Euler(0, 0, oldZ + 180); // 180°回転 //} } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>PlayingCard.cs</code> は、神経衰弱ゲームのとき使っていたが、スピードでは使っていないぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ 消しなさいよ!」</p> <p>📄 <code>Assets/Scripts/LazyArgs.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts { /// <summary> /// コーディングのテクニックのための仕込み /// </summary> internal class LazyArgs { public delegate void Action(); public delegate void SetValue<T>(T value); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>LazyArgs.cs</code> は、コードを上手く書くテクニックに使うだけなんで、気にしなくていい」</p> <p>📄 <code>Assets/Scripts/GameManager.cs</code> file:</p> <pre><code class="csharp">using Assets.Scripts.Models; using Assets.Scripts.Views; using System; using System.Linq; using UnityEngine; using Commands = Assets.Scripts.Models.Timeline.Commands; using ModelsOfTimeline = Assets.Scripts.Models.Timeline; /// <summary> /// ゲーム・マネージャー /// /// - スピードは、日本と海外で ルールとプレイング・スタイルに違いがあるので、用語に統一感はない /// </summary> public class GameManager : MonoBehaviour { ModelsOfTimeline.Model commandStorage; GameModelBuffer gameModelBuffer; GameModel gameModel; GameViewModel gameViewModel; // ゲーム内単位時間 float unitSeconds = 1.0f / 60.0f; // ゲーム内経過時間 float elapsedSeconds = 0.0f; // Start is called before the first frame update void Start() { // 全てのカードのゲーム・オブジェクトを、IDに紐づける GameObjectStorage.Add(IdOfPlayingCards.Clubs1, GameObject.Find($"Clubs 1")); GameObjectStorage.Add(IdOfPlayingCards.Clubs2, GameObject.Find($"Clubs 2")); GameObjectStorage.Add(IdOfPlayingCards.Clubs3, GameObject.Find($"Clubs 3")); GameObjectStorage.Add(IdOfPlayingCards.Clubs4, GameObject.Find($"Clubs 4")); GameObjectStorage.Add(IdOfPlayingCards.Clubs5, GameObject.Find($"Clubs 5")); GameObjectStorage.Add(IdOfPlayingCards.Clubs6, GameObject.Find($"Clubs 6")); GameObjectStorage.Add(IdOfPlayingCards.Clubs7, GameObject.Find($"Clubs 7")); GameObjectStorage.Add(IdOfPlayingCards.Clubs8, GameObject.Find($"Clubs 8")); GameObjectStorage.Add(IdOfPlayingCards.Clubs9, GameObject.Find($"Clubs 9")); GameObjectStorage.Add(IdOfPlayingCards.Clubs10, GameObject.Find($"Clubs 10")); GameObjectStorage.Add(IdOfPlayingCards.Clubs11, GameObject.Find($"Clubs 11")); GameObjectStorage.Add(IdOfPlayingCards.Clubs12, GameObject.Find($"Clubs 12")); GameObjectStorage.Add(IdOfPlayingCards.Clubs13, GameObject.Find($"Clubs 13")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds1, GameObject.Find($"Diamonds 1")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds2, GameObject.Find($"Diamonds 2")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds3, GameObject.Find($"Diamonds 3")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds4, GameObject.Find($"Diamonds 4")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds5, GameObject.Find($"Diamonds 5")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds6, GameObject.Find($"Diamonds 6")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds7, GameObject.Find($"Diamonds 7")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds8, GameObject.Find($"Diamonds 8")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds9, GameObject.Find($"Diamonds 9")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds10, GameObject.Find($"Diamonds 10")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds11, GameObject.Find($"Diamonds 11")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds12, GameObject.Find($"Diamonds 12")); GameObjectStorage.Add(IdOfPlayingCards.Diamonds13, GameObject.Find($"Diamonds 13")); GameObjectStorage.Add(IdOfPlayingCards.Hearts1, GameObject.Find($"Hearts 1")); GameObjectStorage.Add(IdOfPlayingCards.Hearts2, GameObject.Find($"Hearts 2")); GameObjectStorage.Add(IdOfPlayingCards.Hearts3, GameObject.Find($"Hearts 3")); GameObjectStorage.Add(IdOfPlayingCards.Hearts4, GameObject.Find($"Hearts 4")); GameObjectStorage.Add(IdOfPlayingCards.Hearts5, GameObject.Find($"Hearts 5")); GameObjectStorage.Add(IdOfPlayingCards.Hearts6, GameObject.Find($"Hearts 6")); GameObjectStorage.Add(IdOfPlayingCards.Hearts7, GameObject.Find($"Hearts 7")); GameObjectStorage.Add(IdOfPlayingCards.Hearts8, GameObject.Find($"Hearts 8")); GameObjectStorage.Add(IdOfPlayingCards.Hearts9, GameObject.Find($"Hearts 9")); GameObjectStorage.Add(IdOfPlayingCards.Hearts10, GameObject.Find($"Hearts 10")); GameObjectStorage.Add(IdOfPlayingCards.Hearts11, GameObject.Find($"Hearts 11")); GameObjectStorage.Add(IdOfPlayingCards.Hearts12, GameObject.Find($"Hearts 12")); GameObjectStorage.Add(IdOfPlayingCards.Hearts13, GameObject.Find($"Hearts 13")); GameObjectStorage.Add(IdOfPlayingCards.Spades1, GameObject.Find($"Spades 1")); GameObjectStorage.Add(IdOfPlayingCards.Spades2, GameObject.Find($"Spades 2")); GameObjectStorage.Add(IdOfPlayingCards.Spades3, GameObject.Find($"Spades 3")); GameObjectStorage.Add(IdOfPlayingCards.Spades4, GameObject.Find($"Spades 4")); GameObjectStorage.Add(IdOfPlayingCards.Spades5, GameObject.Find($"Spades 5")); GameObjectStorage.Add(IdOfPlayingCards.Spades6, GameObject.Find($"Spades 6")); GameObjectStorage.Add(IdOfPlayingCards.Spades7, GameObject.Find($"Spades 7")); GameObjectStorage.Add(IdOfPlayingCards.Spades8, GameObject.Find($"Spades 8")); GameObjectStorage.Add(IdOfPlayingCards.Spades9, GameObject.Find($"Spades 9")); GameObjectStorage.Add(IdOfPlayingCards.Spades10, GameObject.Find($"Spades 10")); GameObjectStorage.Add(IdOfPlayingCards.Spades11, GameObject.Find($"Spades 11")); GameObjectStorage.Add(IdOfPlayingCards.Spades12, GameObject.Find($"Spades 12")); GameObjectStorage.Add(IdOfPlayingCards.Spades13, GameObject.Find($"Spades 13")); commandStorage = new ModelsOfTimeline.Model(); gameModelBuffer = new GameModelBuffer(); gameModel = new GameModel(gameModelBuffer); gameViewModel = new GameViewModel(); // ゲーム開始時、とりあえず、すべてのカードは、いったん右の台札という扱いにする const int right = 0;// 台札の右 // const int left = 1;// 台札の左 foreach (var idOfCard in GameObjectStorage.PlayingCards.Keys) { // 右の台札 gameModelBuffer.IdOfCardsOfCenterStacks[right].Add(idOfCard); } // 右の台札をシャッフル gameModelBuffer.IdOfCardsOfCenterStacks[right] = gameModelBuffer.IdOfCardsOfCenterStacks[right].OrderBy(i => Guid.NewGuid()).ToList(); // 右の台札をすべて、色分けして、黒色なら1プレイヤーの、赤色なら2プレイヤーの、手札に乗せる while (0 < gameModel.GetLengthOfCenterStackCards(right)) { // 即実行 new Commands.MoveCardsToPileFromCenterStacks(place: right).DoIt(gameModelBuffer, gameViewModel); } // 1,2プレイヤーについて、手札から5枚抜いて、場札として置く(画面上の場札の位置は調整される) var time = 0.0f; this.commandStorage.Add(time, new Commands.MoveCardsToHandFromPile(player: 0, numberOfCards: 5)); this.commandStorage.Add(time, new Commands.MoveCardsToHandFromPile(player: 1, numberOfCards: 5)); // 以下、デモ・プレイを登録 SetupDemo(); // OnTick を 1.0 秒後に呼び出し、以降は unitSeconds 秒毎に実行 InvokeRepeating(nameof(OnTick), 1.0f, unitSeconds); } // Update is called once per frame void Update() { // 入力をコマンドとして登録 UpdateInput(); } /// <summary> /// 一定間隔で呼び出される /// </summary> void OnTick() { // 時限式で、コマンドを消化 this.commandStorage.DoIt(elapsedSeconds, gameModelBuffer, gameViewModel); elapsedSeconds += unitSeconds; } /// <summary> /// 入力を、コマンドに変換して、タイムラインへ登録します /// </summary> private void UpdateInput() { const int right = 0;// 台札の右 const int left = 1;// 台札の左 bool handled1player = false; bool handled2player = false; // 先に登録したコマンドの方が早く実行される // (ボタン押下が同時なら)右の台札は1プレイヤー優先 // ================================================== if (Input.GetKeyDown(KeyCode.DownArrow)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる this.commandStorage.Add(elapsedSeconds, new Commands.MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: right // 右の )); handled1player = true; } if (Input.GetKeyDown(KeyCode.W)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる this.commandStorage.Add(elapsedSeconds, new Commands.MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: right // 右の )); handled2player = true; } // (ボタン押下が同時なら)左の台札は2プレイヤー優先 // ================================================== // 2プレイヤー if (Input.GetKeyDown(KeyCode.S)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる this.commandStorage.Add(elapsedSeconds, new Commands.MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: left // 左の )); handled2player = true; } // 1プレイヤー if (Input.GetKeyDown(KeyCode.UpArrow)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる this.commandStorage.Add(elapsedSeconds, new Commands.MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: left // 左の )); handled1player = true; } // それ以外のキー入力は、同時でも勝敗に関係しない // ============================================== // 1プレイヤー if(handled1player) { } else if (Input.GetKeyDown(KeyCode.LeftArrow)) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)左隣のカードをピックアップするように変えます var player = 0; this.commandStorage.Add(elapsedSeconds, new Commands.MoveFocusToNextCard( player: player, direction: 1, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[player] = indexOfNextFocusedHandCard; // 更新 })); } else if (Input.GetKeyDown(KeyCode.RightArrow)) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)右隣のカードをピックアップするように変えます var player = 0; this.commandStorage.Add(elapsedSeconds, new Commands.MoveFocusToNextCard( player: player, direction: 0, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[player] = indexOfNextFocusedHandCard; // 更新 })); } // 2プレイヤー if(handled2player) { } else if (Input.GetKeyDown(KeyCode.A)) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)左隣のカードをピックアップするように変えます var player = 1; this.commandStorage.Add(elapsedSeconds, new Commands.MoveFocusToNextCard( player: player, direction: 1, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[player] = indexOfNextFocusedHandCard; // 更新 })); } else if (Input.GetKeyDown(KeyCode.D)) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)右隣のカードをピックアップするように変えます var player = 1; this.commandStorage.Add(elapsedSeconds, new Commands.MoveFocusToNextCard( player: player, direction: 0, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[player] = indexOfNextFocusedHandCard; // 更新 })); } // デバッグ用 if (Input.GetKeyDown(KeyCode.Space)) { // 両プレイヤーは手札から1枚抜いて、場札として置く for (var player = 0; player < 2; player++) { // 場札を並べる this.commandStorage.Add(elapsedSeconds, new Commands.MoveCardsToHandFromPile( player: player, numberOfCards: 1)); } } } /// <summary> /// タイムライン作成 /// /// - デモ /// </summary> void SetupDemo() { // 卓準備 const int right = 0;// 台札の右 const int left = 1;// 台札の左 float scheduleSeconds = 1.0f; float oneSecond = 1.0f; // 登録:ピックアップ場札を、台札へ積み上げる { // 1プレイヤーが、ピックアップ中の場札を抜いて、右の台札へ積み上げる this.commandStorage.Add(scheduleSeconds, new Commands.MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: right // 右の )); // 2プレイヤーが、ピックアップ中の場札を抜いて、左の台札へ積み上げる this.commandStorage.Add(scheduleSeconds, new Commands.MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: left // 左の )); scheduleSeconds += oneSecond; } // ゲーム・デモ開始 // 登録:カード選択 { for (int i = 0; i < 2; i++) { // 1プレイヤーの右隣のカードへフォーカスを移します { var player = 0; this.commandStorage.Add(scheduleSeconds, new Commands.MoveFocusToNextCard( player: player, direction: 0, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[player] = indexOfNextFocusedHandCard; // 更新 })); } // 2プレイヤーの右隣のカードへフォーカスを移します { var player = 1; this.commandStorage.Add(scheduleSeconds, new Commands.MoveFocusToNextCard( player: player, direction: 0, setIndexOfNextFocusedHandCard: (indexOfNextFocusedHandCard) => { gameModelBuffer.IndexOfFocusedCardOfPlayers[player] = indexOfNextFocusedHandCard; // 更新 })); } scheduleSeconds += oneSecond; } } // 登録:台札を積み上げる { this.commandStorage.Add(scheduleSeconds, new Commands.MoveCardToCenterStackFromHand( player: 0, // 1プレイヤーが place: 1 // 左の台札 )); this.commandStorage.Add(scheduleSeconds, new Commands.MoveCardToCenterStackFromHand( player: 1, // 2プレイヤーが place: 0 // 右の台札 )); scheduleSeconds += oneSecond; } // 登録:手札から1枚引く { // 1プレイヤーは手札から1枚抜いて、場札として置く this.commandStorage.Add(scheduleSeconds, new Commands.MoveCardsToHandFromPile( player: 0, numberOfCards: 1)); // 2プレイヤーは手札から1枚抜いて、場札として置く this.commandStorage.Add(scheduleSeconds, new Commands.MoveCardsToHandFromPile( player: 1, numberOfCards: 1)); scheduleSeconds += oneSecond; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 キー入力しても、コマンドは ただちに実行せず、<br /> いったん タイムラインに登録するというのが、<br /> ビューと モデルを分離した工夫だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 最初から そうしろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 Unity の開発経験が 短いからね」</p> <p>📅2023-02-01 sat 22:24</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>Lerp</code> (リープ) を使うと、モーションを補間できるんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 やってみるかだぜ」</p> <p>📄 <code>Assets/Scripts/GameManager.cs</code> file:</p> <pre><code class="csharp"> /// <summary> /// 場札を持ち上げる /// </summary> /// <param name="player"></param> /// <param name="handIndesx"></param> internal void PickupCardOfHand(GameModel gameModel, int player, int handIndesx) { var idOfFocusedHandCard = gameModel.GetCardAtOfPlayerHand(player, handIndesx); var liftY = 5.0f; // 持ち上げる(パースペクティブがかかっていて、持ち上げすぎると北へ移動したように見える) var rotateY = -5; // -5°傾ける var rotateZ = -5; // -5°傾ける var goCard = GameObjectStorage.PlayingCards[idOfFocusedHandCard]; goCard.transform.position = new Vector3( goCard.transform.position.x, goCard.transform.position.y + liftY, goCard.transform.position.z); goCard.transform.rotation = Quaternion.Euler( goCard.transform.rotation.eulerAngles.x, goCard.transform.rotation.eulerAngles.y + rotateY, goCard.transform.eulerAngles.z + rotateZ); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 例えば、場札を持ち上げるのは、 <code>position</code> や <code>rotation</code> を上書きしていたが、<br /> これをやめて、<br /> 持ち上げる前の <code>position</code> と <code>rotation</code> 、<br /> 持ち上げた後の <code>position</code> と <code>rotation</code> を持てばいいわけだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 それを覚えておいて、 <code>Update</code> メソッドで <code>Lerp()</code> すればいいわけだぜ」</p> <pre><code class="csharp"> /// <summary> /// 場札を持ち上げる /// </summary> /// <param name="player"></param> /// <param name="handIndesx"></param> internal void PickupCardOfHand(GameModel gameModel, int player, int handIndesx) { var idOfFocusedHandCard = gameModel.GetCardAtOfPlayerHand(player, handIndesx); var liftY = 5.0f; // 持ち上げる(パースペクティブがかかっていて、持ち上げすぎると北へ移動したように見える) var rotateY = -5; // -5°傾ける var rotateZ = -5; // -5°傾ける var goCard = GameObjectStorage.PlayingCards[idOfFocusedHandCard]; var beginPosition = goCard.transform.position; var endPosition = new Vector3( goCard.transform.position.x, goCard.transform.position.y + liftY, goCard.transform.position.z); var beginRotation = goCard.transform.rotation; var endRotation = Quaternion.Euler( goCard.transform.rotation.eulerAngles.x, goCard.transform.rotation.eulerAngles.y + rotateY, goCard.transform.eulerAngles.z + rotateZ); // TODO ★ セットせず、 Lerp したい goCard.transform.position = endPosition; goCard.transform.rotation = endRotation; } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 この <code>beginPosition</code>、 <code>endPosition</code>、 <code>beginRotation</code>、 <code>endRotation</code> を<br /> 呼出し元へ さかのぼって持っていけばいいのか、大変だな」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1620798276151971840?s=20&t=y59Zxexg9CNQelCbIjaJFA">開発中画面</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 今日は ここまでだぜ」</p> <p>📅 2023-02-01 sat 23:58 end</p> <h1 id="📅2023-02-02 thu 18:44"><a href="#%F0%9F%93%852023-02-02+thu+18%3A44">📅2023-02-02 thu 18:44</a></h1> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=betM4QG_DgQ&list=PLhaEhzBcQGjAF8nu1ze2lSxC5MyGXE1oc&index=10">作業用BGM</a></p> <p><a href="https://crieit.now.sh/upload_images/807a266506e3b2be5f200d022f65c3b263db8796798d4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/807a266506e3b2be5f200d022f65c3b263db8796798d4.png?mw=700" alt="202302_unity_02-1844--movement-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 とりあえず、 <code>Movement</code> というクラスを作ろうぜ」</p> <p><code>Assets/Scripts/Models/Timeline/Movement.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline { using UnityEngine; /// <summary> /// ゲーム・オブジェクトの動き /// /// - Lerpに使うもの /// </summary> internal class Movement { // - その他(生成) /// <summary> /// 生成 /// </summary> /// <param name="beginPosition">開始位置</param> /// <param name="endPosition">終了位置</param> /// <param name="beginRotation">開始回転</param> /// <param name="endRotation">終了回転</param> /// <param name="gameObject">ゲーム・オブジェクト</param> public Movement( Vector3 beginPosition, Vector3 endPosition, Quaternion beginRotation, Quaternion endRotation, GameObject gameObject) { this.BeginPosition = beginPosition; this.EndPosition = endPosition; this.BeginRotation = beginRotation; this.EndRotation = endRotation; this.GameObject = gameObject; } // - プロパティ internal Vector3 BeginPosition { get; private set; } internal Vector3 EndPosition { get; private set; } internal Quaternion BeginRotation { get; private set; } internal Quaternion EndRotation { get; private set; } internal GameObject GameObject { get; private set; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Lerp</code> に使うデータを 持っておくクラスだな」</p> <p>書き直す前のソース:</p> <pre><code class="csharp"> /// <summary> /// カードの位置と 捻りの設定 /// </summary> /// <param name="card"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="angleY"></param> /// <param name="angleZ"></param> /// <param name="motionProgress">Update関数の中でないと役に立たない</param> internal void SetPosRot(IdOfPlayingCards idOfCard, float x, float y, float z, float angleY = 180.0f, float angleZ = 0.0f, float motionProgress = 1.0f) { var goCard = GameObjectStorage.PlayingCards[idOfCard]; var beginPos = goCard.transform.position; var endPos = new Vector3(x, y, z); goCard.transform.position = Vector3.Lerp(beginPos, endPos, motionProgress); goCard.transform.rotation = Quaternion.Euler(0, angleY, angleZ); } </code></pre> <p>書き直した後のソース:</p> <pre><code class="csharp"> /// <summary> /// カードの位置と 捻りの設定 /// </summary> /// <param name="card"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="angleY"></param> /// <param name="angleZ"></param> /// <param name="motionProgress">Update関数の中でないと役に立たない</param> internal void SetPosRot(IdOfPlayingCards idOfCard, float x, float y, float z, float angleY = 180.0f, float angleZ = 0.0f, float motionProgress = 1.0f) { var goCard = GameObjectStorage.PlayingCards[idOfCard]; var movement = new Movement( beginPosition: goCard.transform.position, endPosition: new Vector3(x, y, z), beginRotation: goCard.transform.rotation, endRotation: Quaternion.Euler(0, angleY, angleZ), gameObject: goCard); goCard.transform.position = Vector3.Lerp(movement.BeginPosition, movement.EndPosition, motionProgress); goCard.transform.rotation = Quaternion.Lerp(movement.BeginRotation, movement.EndRotation, motionProgress); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 動作が変わるんで リファクタリング ではなくて 仕様変更だが、<br /> どんどん <code>Lerp</code> するコードを 関数の外側に出すための 仕込みをしていこう」</p> <p><a href="https://crieit.now.sh/upload_images/621dd5a817a3a1f6113dd6cac51b5f8763db9034de7c1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/621dd5a817a3a1f6113dd6cac51b5f8763db9034de7c1.png?mw=700" alt="202302_unity_02-1927--unwrapped-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>SetPosRot</code> という関数そのものが よくないので、この関数は削除して<br /> 呼出し側に ベタ書き するように変えていこう」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 最大25枚の場札を 円弧上に 揃えて並べていく処理よ それ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ、タイムラインには コマンドだけではなくて、<br /> <code>Movement</code> も置けた方がいいのか」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 <code>ICommand</code> と、 <code>Movement</code> を、1本化しろだぜ」</p> <p><code>Assets/Scripts/Models/Timeline/Commands/ICommand.cs</code> file:</p> <p>書き直す前のソース:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; /// <summary> /// コマンド /// </summary> interface ICommand { /// <summary> /// コマンド実行 /// </summary> /// <param name="gameModelBuffer">ゲームの内部状態(編集可能)</param> /// <param name="gameViewModel">画面表示の状態(編集可能)</param> void DoIt(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel); void Lerp(float progress); /// <summary> /// 持続時間が切れたとき /// </summary> void OnLeave(); } } </code></pre> <p>書き直した後のソース:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.Timeline.Commands { using Assets.Scripts.Models; using Assets.Scripts.Views; /// <summary> /// コマンド /// </summary> interface ICommand { /// <summary> /// 開始時 /// </summary> /// <param name="gameModelBuffer">ゲームの内部状態(編集可能)</param> /// <param name="gameViewModel">画面表示の状態(編集可能)</param> void OnEnter(GameModelBuffer gameModelBuffer, GameViewModel gameViewModel); /// <summary> /// 持続中 /// </summary> /// <param name="progress">進捗 0.0 ~ 1.0</param> void Lerp(float progress); /// <summary> /// 持続時間が切れたとき /// </summary> void OnLeave(); } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>DoIt</code> を、 <code>OnEnter</code> に書き直すだけでも 一貫性が出てきそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 コマンドに 開始時間と 持続時間 を持たせてしまえば どうだぜ?<br /> 名前を <code>TimeSpan</code> にでも変えて、 コマンドはその特殊なケースにしろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/9ffbcaec6153684ab19ecb7f7cd811d063dba250f263d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9ffbcaec6153684ab19ecb7f7cd811d063dba250f263d.png?mw=700" alt="202302_unity_02-2041--time-span-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>TimedItem</code> と、 <code>Command</code> と、 <code>Movement</code> は、 <code>TimeSpan</code> という枠組みで1本化したぜ」</p> <p>📅 2023-02-01 sat 20:46 end</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 どんどん <code>Lerp</code> を使える形に変えていこう」</p> <p>📅 2023-02-01 sat 21:02</p> <p><a href="https://crieit.now.sh/upload_images/07038993315917412365e7a8ed30b72163dba65c59e89.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/07038993315917412365e7a8ed30b72163dba65c59e89.png?mw=700" alt="202302_unity_02-2100--put-down-card-of-hand-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 例えば <code>PutDownCardOfHand</code> メソッドは、単に <code>Movement</code> インスタンスを作るだけのメソッドだと分かった」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 頭の中が整理されてきたのね」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 頭を整理してから プログラミングしてくれだぜ」</p> <pre><code class="csharp"> /// <summary> /// 場札を並べる /// /// - 左端は角度で言うと 112.0f /// </summary> internal void ArrangeHandCards(GameModel gameModel, int player, LazyArgs.SetValue<List<ISpan>> setSpans) { // ... </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 例えば <code>ArrangeHandCards</code> メソッドは、単に <code>Movement</code> インスタンスを複数、作るだけのメソッドだと分かった」</p> <p><a href="https://crieit.now.sh/upload_images/9da5cce608656a39afd64d10d82c062c63dbab5320059.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9da5cce608656a39afd64d10d82c062c63dbab5320059.png?mw=700" alt="202302_unity_02-2123--bug.png" /></a></p> <p>📅 2023-02-01 sat 21:24</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 あっ、バグった!」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 表現しづらいバグを起こすなあ。<br /> 持ち上げるカードを 間違えているんだぜ なぜか」</p> <p><a href="https://crieit.now.sh/upload_images/5df83fbc29ac83b16423729685df063f63dbadb60f858.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5df83fbc29ac83b16423729685df063f63dbadb60f858.png?mw=700" alt="202302_unity_02-2132--fixme-code-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 タイム・スパンの インスタンスの中で 即実行 するコードがあると タイミングが狂ってる感じがするぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>OnEnter</code> メソッドの中ではなく、 <code>Lerp</code> メソッドの中に書けば いいんじゃない?」</p> <pre><code class="csharp"> List<ISpan> SubSpans { get; set; } // - メソッド public override void Lerp(float progress) { base.Lerp(progress); if (this.SubSpans!=null) { foreach (var span in this.SubSpans) { span.Lerp(progress); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 なるほど」</p> <p><a href="https://crieit.now.sh/upload_images/75824c81f812608ff3c9af799de7db5163dbaf0883524.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/75824c81f812608ff3c9af799de7db5163dbaf0883524.png?mw=700" alt="202302_unity_02-2139--sub-spans.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ダメだぜ。持ち上げるカードを間違えているぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 コマンドのタイム・スパンの寿命と、<br /> 場札の位置調整をしたいタイム・スパンの寿命は 別物だからでは?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ タイム・スパンを新しく スポーン(Spawn;生成)しなくちゃ いけないのよ」</p> <p><a href="https://crieit.now.sh/upload_images/3a672258c6245ea0984fcbf08fe7462363dbb0278046d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3a672258c6245ea0984fcbf08fe7462363dbb0278046d.png?mw=700" alt="202302_unity_02-2143--timeline-model-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 タイムライン・モデルは ゲーム・モデルの外側にあるし、 ゲーム・ビュー・モデルの外側でもあるぜ。<br /> タイムライン・モデルは <strong>モデル</strong> なのだろうか? <strong>ビュー</strong> なのだろうか?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 画面に表示されてないから、モデルだろ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 モデルのくせに、ゲーム・オブジェクトを持ってるのは 良くない」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 タイムライン・モデルの <strong>モデルとビューの分離</strong> を先に行っておくべきだったんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/e7a86a76e31094d3827cc96a5faee2a463dbb116f3de9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e7a86a76e31094d3827cc96a5faee2a463dbb116f3de9.png?mw=700" alt="202302_unity_02-2148--discard.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 今なら Discard(ディスカード;更新の破棄)しても ダメージは30分レベルで軽微だから ロールバック(Rollback;巻き戻し)するかだぜ」</p> <p>📅 2023-02-01 sat 21:49</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 巻き戻した」</p> <p><a href="https://crieit.now.sh/upload_images/d1e912417499780590344d3d7876e4b663dbb2aa21421.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d1e912417499780590344d3d7876e4b663dbb2aa21421.png?mw=700" alt="202302_unity_02-2154--model-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 モデルが ビューを持ってると 良くないんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e1894933fdbf99e422b4c700276d2c9a63dbb3e1e0787.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e1894933fdbf99e422b4c700276d2c9a63dbb3e1e0787.png?mw=700" alt="202302_unity_02-2159--lerp-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 じゃあ <code>Lerp</code> メソッドのような、ビュー に属するものを タイムライン・モデルが 持っていては<br /> いけなくないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 そりゃそうだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 <strong>TimelineView</strong> のようなものが 要るのかしら?」</p> <p><a href="https://crieit.now.sh/upload_images/a763038bbe98f909c90c48e982e3405163dbb82a57a01.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a763038bbe98f909c90c48e982e3405163dbb82a57a01.png?mw=700" alt="202302_unity_02-2216--model-view-1.png" /></a></p> <p>📅 2023-02-02 sat 22:20</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>OnEnter</code> メソッドは モデルを扱い、<br /> <code>Lerp</code> メソッドは ビューを扱うというように ぱっきり 分かれているので、<br /> <code>TimeSpan</code> も モデルとビューに分けられないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あっ、トランプの絵柄を取得できるメソッドが欲しいぜ」</p> <p><code>Assets/Scripts/Models/IdOfCardSuits.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models { /// <summary> /// カードのスート(絵柄) /// </summary> internal enum IdOfCardSuits { None, Clubs, Diamonds, Hearts, Spades, } } </code></pre> <p><code>Assets/Scripts/Models/IdOfCardSuits.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Models { using System; /// <summary> /// トランプのカード /// /// - ジョーカーを除く /// </summary> internal enum IdOfPlayingCards { // ... 中略 ... } static class IdOfPlayingCardsExtensions { public static IdOfCardSuits Suit(this IdOfPlayingCards idOfCard) { switch (idOfCard) { case IdOfPlayingCards.Clubs1: case IdOfPlayingCards.Clubs2: case IdOfPlayingCards.Clubs3: case IdOfPlayingCards.Clubs4: case IdOfPlayingCards.Clubs5: case IdOfPlayingCards.Clubs6: case IdOfPlayingCards.Clubs7: case IdOfPlayingCards.Clubs8: case IdOfPlayingCards.Clubs9: case IdOfPlayingCards.Clubs10: case IdOfPlayingCards.Clubs11: case IdOfPlayingCards.Clubs12: case IdOfPlayingCards.Clubs13: return IdOfCardSuits.Clubs; case IdOfPlayingCards.Diamonds1: case IdOfPlayingCards.Diamonds2: case IdOfPlayingCards.Diamonds3: case IdOfPlayingCards.Diamonds4: case IdOfPlayingCards.Diamonds5: case IdOfPlayingCards.Diamonds6: case IdOfPlayingCards.Diamonds7: case IdOfPlayingCards.Diamonds8: case IdOfPlayingCards.Diamonds9: case IdOfPlayingCards.Diamonds10: case IdOfPlayingCards.Diamonds11: case IdOfPlayingCards.Diamonds12: case IdOfPlayingCards.Diamonds13: return IdOfCardSuits.Diamonds; case IdOfPlayingCards.Hearts1: case IdOfPlayingCards.Hearts2: case IdOfPlayingCards.Hearts3: case IdOfPlayingCards.Hearts4: case IdOfPlayingCards.Hearts5: case IdOfPlayingCards.Hearts6: case IdOfPlayingCards.Hearts7: case IdOfPlayingCards.Hearts8: case IdOfPlayingCards.Hearts9: case IdOfPlayingCards.Hearts10: case IdOfPlayingCards.Hearts11: case IdOfPlayingCards.Hearts12: case IdOfPlayingCards.Hearts13: return IdOfCardSuits.Hearts; case IdOfPlayingCards.Spades1: case IdOfPlayingCards.Spades2: case IdOfPlayingCards.Spades3: case IdOfPlayingCards.Spades4: case IdOfPlayingCards.Spades5: case IdOfPlayingCards.Spades6: case IdOfPlayingCards.Spades7: case IdOfPlayingCards.Spades8: case IdOfPlayingCards.Spades9: case IdOfPlayingCards.Spades10: case IdOfPlayingCards.Spades11: case IdOfPlayingCards.Spades12: case IdOfPlayingCards.Spades13: return IdOfCardSuits.Spades; default: throw new ArgumentOutOfRangeException("idOfCard"); } } } } </code></pre> <p>📅 2023-02-03 sat 00:12</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 作った」</p> <p><a href="https://crieit.now.sh/upload_images/33d34bc41640b4ab0cc11582acd5120063dbec62dfa0a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/33d34bc41640b4ab0cc11582acd5120063dbec62dfa0a.png?mw=700" alt="202302_unity_03-0200--bug-point-1.png" /></a></p> <p>📅 2023-02-03 sat 02:00</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 タイム・ライン登録時は まだ 座標が動いてないから、<br /> タイム・ライン登録中も 座標を動かしてやらないと いけないぜ。<br /> この不具合は また今度直そう」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1621193047693492224?s=20&t=CoRWztOdgUDSmBcMSE_6ug">開発中画面</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 今日は ここまで」</p> <h1 id="📅2023-02-03 fri 18:48"><a href="#%F0%9F%93%852023-02-03+fri+18%3A48">📅2023-02-03 fri 18:48</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 しばらく 作り直し」</p> <p><a href="https://crieit.now.sh/upload_images/ea26ca30cc98ad498bd8b846754055b663dd3f4d754cc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ea26ca30cc98ad498bd8b846754055b663dd3f4d754cc.png?mw=700" alt="202302_unity_04-0206--addition-1.png" /></a></p> <p>📅 2023-02-04 sat 02:07</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 7時間ぐらいバグ探して 1つ 直した。<br /> 操作を2連続で行うと カードが変なところに飛んでいくので、<br /> 2つの操作を結合して、1回の操作にする」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1621557770603597829?s=20&t=kCM9dWqp32K8flyyi7UwJw">開発中画面</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 今日はここまで」</p> <h1 id="📅2023-02-04 sat 12:02"><a href="#%F0%9F%93%852023-02-04+sat+12%3A02">📅2023-02-04 sat 12:02</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 作ってみると 分からないところが いっぱい出てくる。散々だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/ebec83eb4d51368e981f5b01d418850163dde49642650.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ebec83eb4d51368e981f5b01d418850163dde49642650.png?mw=700" alt="202302_unity_04-1351--static-game-view-1.png" /></a></p> <p>📅 2023-02-04 sat 13:53</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>GameViewModel</code> を廃止し、静的クラスにしたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/671c39f10b2bfd10364dcb29e820e5d663de36bb375b1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/671c39f10b2bfd10364dcb29e820e5d663de36bb375b1.png?mw=700" alt="202302_unity_04-1941--miss-name-1.png" /></a></p> <p>📅 2023-02-04 sat 19:43</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 怪しい場所を発見したぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 修正したが、バグが直る様子なし」</p> <p><a href="https://crieit.now.sh/upload_images/1da52164e1479a43a0deeeb0c7749e4063de4d8620cfb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1da52164e1479a43a0deeeb0c7749e4063de4d8620cfb.png?mw=700" alt="202302_unity_04-2119--log-1.png" /></a></p> <p>📅 2023-02-04 sat 21:20</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 5.0 だけ持ち上げたいのに、すでに 25.5 も持ち上がってたら、 6倍ぐらい 飛び上がるよな」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 1.06、 2.17、 3.83、 6.06、 8.83、 12.17、 16.06、 20.50、 25.50 は、<br /> +1.06、 +1.11、 +1.66、 +2.23、 +2.77、 +3.34、 +3.89、 +4.44、 +5.0 だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 加速していく 5.0 を累計してんの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 なんで勝手に 積分してんだぜ? 調べるか……」</p> <p><a href="https://crieit.now.sh/upload_images/5fc49fa169db43447eac3818ed2ad21163de53d7257c0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5fc49fa169db43447eac3818ed2ad21163de53d7257c0.png?mw=700" alt="202302_unity_04-2144--sum-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 説明するのは難しいが 理解した。<br /> 開始地点から 終了地点まで 刻んで動け、という命令をしてるときに<br /> 開始地点が 刻々と 進んでいるんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 開始地点は 動くなだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/22a69d36cf4f65370174b4d5c6b5bdd463de578425568.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/22a69d36cf4f65370174b4d5c6b5bdd463de578425568.png?mw=700" alt="202302_unity_04-2201--bug-fix-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こういう書き方で 修正できたが、<br /> こんな書き方が役に立つ場面 初めて見た。<br /> 不思議な気分だぜ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1621884143868219393?s=20&t=DePtrbaQRFX6Mkz2O1Tomg">開発中画面</a></p> <p>📅 2023-02-04 sat 23:55</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 思ったのと 違う動きをしているが、<br /> 不具合のリクツが分かってきたのは前進だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 今日は ここまでだぜ」</p> <h1 id="📅2023-02-05 sun 12:27"><a href="#%F0%9F%93%852023-02-05+sun+12%3A27">📅2023-02-05 sun 12:27</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 バグ探ししてるだけで 進展なし」</p> <p><a href="https://crieit.now.sh/upload_images/22a3541b196232b578691e0e3b01832363df6e92b1057.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/22a3541b196232b578691e0e3b01832363df6e92b1057.png?mw=700" alt="202302_unity_05-1752--modified-1.png" /></a></p> <p>📅 2023-02-05 sat 17:53</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 1か所 変更して 様子を見るぜ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1622158274866057217?s=20&t=25NMt9VXXAmLnP4iA654jw">開発中画面</a></p> <p>📅 2023-02-05 sat 18:02</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 カードが飛び上がるのは なくなったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 連打を禁止したら どうだぜ?<br /> <code>Lerp</code> が重なってるケースがあるのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/3e49488f553402bbbab28b9800855c9463df724eb7739.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3e49488f553402bbbab28b9800855c9463df724eb7739.png?mw=700" alt="202302_unity_05-1808--input-manager-1.png" /></a></p> <p>📅 2023-02-05 sat 18:09</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 入力系は こんがらがると 大変だろうから ゲーム・マネージャーと分離するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 疲れた ラーメン食べに行く いったん休憩!」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 おつ」</p> <p>📅 2023-02-05 sat 18:10 end</p> <h1 id="📅2023-02-06 sun 02:06"><a href="#%F0%9F%93%852023-02-06+sun+02%3A06">📅2023-02-06 sun 02:06</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 3時間寝たと思ったら目が覚めた。練習しよ」</p> <p><a href="https://crieit.now.sh/upload_images/5c0e874300fea62638c208911a56889963dff522348ef.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5c0e874300fea62638c208911a56889963dff522348ef.png?mw=700" alt="202302_unity_06-0326--bug-fix-1.png" /></a></p> <p>📅 2023-02-06 mon 03:28</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 やることの順番を 少しでも 前後間違えると 違った動きをする。<br /> 直した」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1622302091426533381?s=20&t=f5EqhpedTJmS2Pkxi9oGIg">開発中画面</a></p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 👆 やったな!」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1622312190270402560?s=20&t=f5EqhpedTJmS2Pkxi9oGIg">開発中画面</a></p> <p>📅 2023-02-06 mon 04:13</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 今朝は ここまで」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 おつ」</p> <h1 id="📅2023-02-07 tue 03:59"><a href="#%F0%9F%93%852023-02-07+tue+03%3A59">📅2023-02-07 tue 03:59</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 睡眠が 長続きせず 途切れてしまった。 練習するか」</p> <p><a href="https://crieit.now.sh/upload_images/43558fdfe0f08ea345a3f39d2b7ed1b963e15caa8f265.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/43558fdfe0f08ea345a3f39d2b7ed1b963e15caa8f265.png?mw=700" alt="202302_unity_07-0459--getter-1.png" /></a></p> <p>📅 2023-02-06 mon 05:03</p> <p><code>Assets/Scripts/Gui/GameManager.cs</code> file:</p> <pre><code class="csharp"> // - プロパティ // モデル・バッファー GameModelBuffer modelBuffer = new GameModelBuffer(); /// <summary> /// ゲーム・モデル /// </summary> internal GameModel Model { get { if (model == null) { // ゲーム・モデルは、ゲーム・モデル・バッファーを持つ model = new GameModel(modelBuffer); } return model; } } GameModel model; /// <summary> /// スケジュール・レジスター /// </summary> internal ScheduleRegister ScheduleRegister { get { if (scheduleRegister == null) { // スケジューラー・レジスターは、ゲーム・モデルを持つ。 scheduleRegister = new TimedGeneratorOfSpanOfLearp.ScheduleRegister(this.Model); } return scheduleRegister; } } ScheduleRegister scheduleRegister; </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 プロパティは、ゲットしたタイミングで生成されるようにするぜ。<br /> どのゲーム・オブジェクトの <code>Start()</code> イベントハンドラから実行されるか 順番が不定なケースではこうする」</p> <p><code>Assets/Scripts/Gui/InputManager.cs</code> file:</p> <pre><code class="csharp">using Assets.Scripts.Gui.SpanOfLerp.TimedGenerator; using Assets.Scripts.ThinkingEngine.CommandArgs; using UnityEngine; public class InputManager : MonoBehaviour { // - フィールド ScheduleRegister scheduleRegister; // - イベントハンドラ // Start is called before the first frame update void Start() { scheduleRegister = GameObject.Find("Game Manager").GetComponent<GameManager>().ScheduleRegister; } /// <summary> /// Update is called once per frame /// /// - 入力は、すぐに実行は、しません /// - 入力は、コマンドに変換して、タイムラインへ登録します /// </summary> void Update() { const int right = 0;// 台札の右 const int left = 1;// 台札の左 bool handled1player = false; bool handled2player = false; // 先に登録したコマンドの方が早く実行される // (ボタン押下が同時なら)右の台札は1プレイヤー優先 // ================================================== if (Input.GetKeyDown(KeyCode.DownArrow)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる scheduleRegister.AddJustNow(new MoveCardToCenterStackFromHandModel( player: 0, // 1プレイヤーが place: right)); // 右の handled1player = true; } if (Input.GetKeyDown(KeyCode.W)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる scheduleRegister.AddJustNow(new MoveCardToCenterStackFromHandModel( player: 1, // 2プレイヤーが place: right)); // 右の handled2player = true; } // (ボタン押下が同時なら)左の台札は2プレイヤー優先 // ================================================== // 2プレイヤー if (Input.GetKeyDown(KeyCode.S)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる scheduleRegister.AddJustNow(new MoveCardToCenterStackFromHandModel( player: 1, // 2プレイヤーが place: left)); // 左の handled2player = true; } // 1プレイヤー if (Input.GetKeyDown(KeyCode.UpArrow)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる scheduleRegister.AddJustNow(new MoveCardToCenterStackFromHandModel( player: 0, // 1プレイヤーが place: left)); // 左の handled1player = true; } // それ以外のキー入力は、同時でも勝敗に関係しない // ============================================== // 1プレイヤー if (handled1player) { } else if (Input.GetKeyDown(KeyCode.LeftArrow)) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)左隣のカードをピックアップするように変えます scheduleRegister.AddJustNow(new MoveFocusToNextCardModel( player: 0, direction: 1)); } else if (Input.GetKeyDown(KeyCode.RightArrow)) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)右隣のカードをピックアップするように変えます scheduleRegister.AddJustNow(new MoveFocusToNextCardModel( player: 0, direction: 0)); } // 2プレイヤー if (handled2player) { } else if (Input.GetKeyDown(KeyCode.A)) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)左隣のカードをピックアップするように変えます scheduleRegister.AddJustNow(new MoveFocusToNextCardModel( player: 1, direction: 1)); } else if (Input.GetKeyDown(KeyCode.D)) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)右隣のカードをピックアップするように変えます scheduleRegister.AddJustNow(new MoveFocusToNextCardModel( player: 1, direction: 0)); } // デバッグ用 if (Input.GetKeyDown(KeyCode.Space)) { // 両プレイヤーは手札から1枚抜いて、場札として置く for (var player = 0; player < 2; player++) { // 場札を並べる scheduleRegister.AddJustNow(new MoveCardsToHandFromPileModel( player: player, numberOfCards: 1)); } } } } </code></pre> <p>📅 2023-02-07 tue 05:03</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 入力は、入力されたらすぐ実行するということはせず、<br /> 入力時のゲーム時間を付けて、スケジュール・レジスターに コマンドを登録するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d56cdbb9a549ba31c837c6fb9188077d63e1561093086.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d56cdbb9a549ba31c837c6fb9188077d63e1561093086.png?mw=700" alt="202302_unity_07-0423--legal-manager-1.png" /></a></p> <p>📅 2023-02-07 tue 05:04</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 入力の中に、ゲームの制約を書き込むと 読みづらくなるので、<br /> <code>LegalManager</code> というのを別途作って、こっちに ゲームの制約を組み込んでいくぜ」</p> <p><code>Assets/Scripts/ThinkingEngine/IdOfPlayingCards.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.ThinkingEngine { using System; /// <summary> /// トランプのカード /// /// - ジョーカーを除く /// </summary> internal enum IdOfPlayingCards { // ... } static class IdOfPlayingCardsExtensions { public static IdOfCardSuits Suit(this IdOfPlayingCards idOfCard) { // ... } public static int Number(this IdOfPlayingCards idOfCard) { switch (idOfCard) { case IdOfPlayingCards.Clubs1: case IdOfPlayingCards.Diamonds1: case IdOfPlayingCards.Hearts1: case IdOfPlayingCards.Spades1: return 1; case IdOfPlayingCards.Clubs2: case IdOfPlayingCards.Diamonds2: case IdOfPlayingCards.Hearts2: case IdOfPlayingCards.Spades2: return 2; case IdOfPlayingCards.Clubs3: case IdOfPlayingCards.Diamonds3: case IdOfPlayingCards.Hearts3: case IdOfPlayingCards.Spades3: return 3; case IdOfPlayingCards.Clubs4: case IdOfPlayingCards.Diamonds4: case IdOfPlayingCards.Hearts4: case IdOfPlayingCards.Spades4: return 4; case IdOfPlayingCards.Clubs5: case IdOfPlayingCards.Diamonds5: case IdOfPlayingCards.Hearts5: case IdOfPlayingCards.Spades5: return 5; case IdOfPlayingCards.Clubs6: case IdOfPlayingCards.Diamonds6: case IdOfPlayingCards.Hearts6: case IdOfPlayingCards.Spades6: return 6; case IdOfPlayingCards.Clubs7: case IdOfPlayingCards.Diamonds7: case IdOfPlayingCards.Hearts7: case IdOfPlayingCards.Spades7: return 7; case IdOfPlayingCards.Clubs8: case IdOfPlayingCards.Diamonds8: case IdOfPlayingCards.Hearts8: case IdOfPlayingCards.Spades8: return 8; case IdOfPlayingCards.Clubs9: case IdOfPlayingCards.Diamonds9: case IdOfPlayingCards.Hearts9: case IdOfPlayingCards.Spades9: return 9; case IdOfPlayingCards.Clubs10: case IdOfPlayingCards.Diamonds10: case IdOfPlayingCards.Hearts10: case IdOfPlayingCards.Spades10: return 10; case IdOfPlayingCards.Clubs11: case IdOfPlayingCards.Diamonds11: case IdOfPlayingCards.Hearts11: case IdOfPlayingCards.Spades11: return 11; case IdOfPlayingCards.Clubs12: case IdOfPlayingCards.Diamonds12: case IdOfPlayingCards.Hearts12: case IdOfPlayingCards.Spades12: return 12; case IdOfPlayingCards.Clubs13: case IdOfPlayingCards.Diamonds13: case IdOfPlayingCards.Hearts13: case IdOfPlayingCards.Spades13: return 13; default: throw new ArgumentOutOfRangeException("idOfCard"); } } } } </code></pre> <p>📅 2023-02-07 tue 05:24</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 トランプ・カードのIdを、数に変える方法が無かったので、作っておくぜ」</p> <p><code>Assets/Scripts/ThinkingEngine/LegalMove.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.ThinkingEngine { internal class LegalMove { // - メソッド internal static bool CanPutToCenterStack(GameModel gameModel, int player, int place) { int index = gameModel.GetIndexOfFocusedCardOfPlayer(player); if (index == -1) { return false; } IdOfPlayingCards topCard = gameModel.GetLastCardOfCenterStack(place); if (topCard == IdOfPlayingCards.None) { return false; } var numberOfPickup = gameModel.GetCardsOfPlayerHand(player)[index].Number(); int numberOfTopCard = topCard.Number(); // とりあえず差分を取る。 // 負数が出ると、負数の剰余はプログラムによって結果が異なるので、面倒だ。 // 割る数を先に足しておけば、剰余をしても負数にはならない int divisor = 13; // 法 int remainder = (numberOfTopCard - numberOfPickup + divisor) % divisor; return remainder == 1 || remainder == divisor - 1; } } } </code></pre> <p>📅 2023-02-07 tue 06:10</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>LegalManager</code> というゲーム・オブジェクトにアタッチする C#スクリプトは止めて、<br /> <code>LegalMove</code> という静的クラスを作ったぜ」</p> <pre><code class="csharp"> // (ボタン押下が同時なら)右の台札は1プレイヤー優先 // ================================================== if (Input.GetKeyDown(KeyCode.DownArrow) && LegalMove.CanPutToCenterStack( gameModel: scheduleRegister.GameModel, player: 0, // 1プレイヤーが place: right)) // 右の { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる scheduleRegister.AddJustNow(new MoveCardToCenterStackFromHandModel( player: 0, // 1プレイヤーが place: right)); // 右の handled1player = true; } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんな風に、入力に制約を付ける感じで使う」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 ついでに、ボタン連打をするという スパム行為 をやめさせたいな。<br /> 前に押してから 何秒経過するまで 次の入力ができないというような 制約を付ければいいのかだぜ?」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=7kSsKSADyc4">作業用BGM</a></p> <p><a href="https://crieit.now.sh/upload_images/5c8ad51247c2818a0a74c28de179629e63e17941976e9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5c8ad51247c2818a0a74c28de179629e63e17941976e9.png?mw=700" alt="202302_unity_07-0702--timed-command-1.png" /></a></p> <p>📅 2023-02-07 tue 07:03</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 コマンドには 持続時間が自動的にセットされるようにして……」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 すべての入力は コマンドに変換してから実行されるという 建付け にしておけば、<br /> 入力による 必要な待機時間は 決まるな」</p> <pre><code class="csharp"> // - フィールド // ... float[] spamSeconds = new[] { 0f, 0f }; // - イベントハンドラ // ... void Update() { // もう入力できないなら真 bool[] handled = { false, false }; for (var player = 0; player < 2; player++) { // 前判定 // もう入力できないなら真 handled[player] = 0 < spamSeconds[player]; // スパン時間消化 if (0 < spamSeconds[player]) { // 負数になっても気にしない spamSeconds[player] -= Time.deltaTime; } } const int right = 0;// 台札の右 const int left = 1;// 台札の左 // 先に登録したコマンドの方が早く実行される // (ボタン押下が同時なら)右の台札は1プレイヤー優先 // ================================================== // 1プレイヤー { var player = 0; if (!handled[player] && Input.GetKeyDown(KeyCode.DownArrow) && LegalMove.CanPutToCenterStack( gameModel: scheduleRegister.GameModel, player: player, place: right)) // 右の { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveCardToCenterStackFromHandModel( player: player, // 1プレイヤーが place: right)); // 右の spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); handled[player] = true; } } // ... </code></pre> <p>📅 2023-02-07 tue 08:15</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 キー入力したら、コマンドに対応づく持続時間を覚えておいて、<br /> その時間を消化しきるまで 次の入力ができないようにするぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 今朝は ここまで」</p> <h1 id="📅2023-02-09 thu 18:26"><a href="#%F0%9F%93%852023-02-09+thu+18%3A26">📅2023-02-09 thu 18:26</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 動作テストを勝手にしてくれるAIを入れたいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 右、上、下、スペース を押してくれるだけで いいんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ ひとまず、<br /> 1P vs 2P、<br /> 1P vs COM、<br /> COM vs 2P、<br /> COM vs COM<br /> のボタンを作るかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/56fcfed0aebd37033778b7701a124b1163e4c288508ff.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/56fcfed0aebd37033778b7701a124b1163e4c288508ff.png?mw=700" alt="202302_unity_09-1851--ui-default-1.png" /></a></p> <p>📅 2023-02-09 thu 18:54</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 Shader を <code>UI/Default</code> にすると半透明にできるの、ノーヒントでは 気づかないよな」</p> <p><a href="https://crieit.now.sh/upload_images/68cfdc5dbaae0e4d63316bcf379fffa363e4c3f541982.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/68cfdc5dbaae0e4d63316bcf379fffa363e4c3f541982.png?mw=700" alt="202302_unity_09-1857--ui-manager-1.png" /></a></p> <p>📅 2023-02-09 thu 18:57</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>UIManager</code> を作るぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 大改造」</p> <p><a href="https://crieit.now.sh/upload_images/4894f35fd236d41538658b4b49979a2463e4f9ba21c07.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4894f35fd236d41538658b4b49979a2463e4f9ba21c07.png?mw=700" alt="202302_unity_09-2243--to-meaning-1.png" /></a></p> <p>📅 2023-02-09 thu 22:48</p> <p><code>Assets/Scripts/Gui/InputManager/ToMeaning.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.Gui.InputManager { using UnityEngine; /// <summary> /// キー入力の解析 /// </summary> internal class ToMeaning { // - プロパティ /// <summary> /// 自分に近い方の台札へ置く /// </summary> internal bool[] MoveCardToCenterStackNearMe { get; private set; } = new[] { false, false }; /// <summary> /// 自分から遠い方の台札へ置く /// </summary> internal bool[] MoveCardToFarCenterStack { get; private set; } = new[] { false, false }; /// <summary> /// 自分から見て(今ピックアップしているカードの)右隣のカードをピックアップ /// </summary> internal bool[] PickupCardToForward { get; private set; } = new[] { false, false }; /// <summary> /// 自分から見て(今ピックアップしているカードの)左隣のカードをピックアップ /// </summary> internal bool[] PickupCardToBackward { get; private set; } = new[] { false, false }; /// <summary> /// 手札から場札を補充する /// </summary> internal bool Drawing { get; private set; } = false; // - メソッド /// <summary> /// 解析結果を全部消す /// </summary> internal void Clear() { for (var player = 0; player < 2; player++) { MoveCardToCenterStackNearMe[player] = false; MoveCardToFarCenterStack[player] = false; PickupCardToForward[player] = false; PickupCardToBackward[player] = false; } Drawing = false; } /// <summary> /// 物理的なキー入力を、意味的に置き換える /// </summary> /// <param name="player"></param> internal void UpdateFromInput(int player) { if (player == 0) { MoveCardToCenterStackNearMe[player] = Input.GetKeyDown(KeyCode.DownArrow); MoveCardToFarCenterStack[player] = Input.GetKeyDown(KeyCode.UpArrow); PickupCardToForward[player] = Input.GetKeyDown(KeyCode.RightArrow); PickupCardToBackward[player] = Input.GetKeyDown(KeyCode.LeftArrow); } else { MoveCardToCenterStackNearMe[player] = Input.GetKeyDown(KeyCode.S); MoveCardToFarCenterStack[player] = Input.GetKeyDown(KeyCode.W); PickupCardToForward[player] = Input.GetKeyDown(KeyCode.D); PickupCardToBackward[player] = Input.GetKeyDown(KeyCode.A); } Drawing = Input.GetKeyDown(KeyCode.Space); // 1プレイヤーと、2プレイヤーの2回判定されてしまう } /// <summary> /// 解析結果を全部上書きする /// </summary> internal void Overwrite( int player, bool moveCardToCenterStackNearMe, bool moveCardToFarCenterStack, bool pickupCardToForward, bool pickupCardToBackward, bool drawing) { MoveCardToCenterStackNearMe[player] = moveCardToCenterStackNearMe; MoveCardToFarCenterStack[player] = moveCardToFarCenterStack; PickupCardToForward[player] = pickupCardToForward; PickupCardToBackward[player] = pickupCardToBackward; Drawing = drawing; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 何キーを押したかではなく、どういう意図で押したかで データを持つクラスを作るぜ」</p> <p><a href="https://crieit.now.sh/upload_images/f64f0c7d52606cfc27594a855d8f17b863e4fa99794f0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f64f0c7d52606cfc27594a855d8f17b863e4fa99794f0.png?mw=700" alt="202302_unity_09-2251--computer-1.png" /></a></p> <p>📅 2023-02-09 thu 22:51</p> <p><code>Assets/Scripts/ThinkingEngine/Computer.cs</code> file:</p> <pre><code class="csharp">namespace Assets.Scripts.ThinkingEngine { using Assets.Scripts.ThinkingEngine.Model; /// <summary> /// コンピューター・プレイヤー /// </summary> internal class Computer { // - その他 internal Computer(int number) { this.Number = number; } // - プロパティ /// <summary> /// プレイヤー番号 /// /// - 1プレイヤーなら0 /// </summary> public int Number { get; private set; } /// <summary> /// 自分に近い方の台札へ置く /// </summary> internal bool MoveCardToCenterStackNearMe { get; private set; } /// <summary> /// 自分から遠い方の台札へ置く /// </summary> internal bool MoveCardToFarCenterStack { get; private set; } /// <summary> /// 自分から見て(今ピックアップしているカードの)右隣のカードをピックアップ /// </summary> internal bool PickupCardToForward { get; private set; } /// <summary> /// 自分から見て(今ピックアップしているカードの)左隣のカードをピックアップ /// </summary> internal bool PickupCardToBackward { get; private set; } /// <summary> /// 手札から場札を補充する /// </summary> internal bool Drawing { get; private set; } // - メソッド /// <summary> /// コンピューター・プレイヤーが思考して、操作を決める /// </summary> /// <param name="gameModel">現在の局面</param> internal void Think(GameModel gameModel) { // 今回の入力予定 var moveCardToCenterStackNearMe = false; var moveCardToFarCenterStack = false; var pickupCardToForward = false; var pickupCardToBackward = false; var drawing = false; // 順繰りにやってるだけ if (this.MoveCardToCenterStackNearMe == false && this.MoveCardToFarCenterStack == false && this.PickupCardToForward == false && this.Drawing == false) { moveCardToCenterStackNearMe = true; } else if (this.MoveCardToCenterStackNearMe) { moveCardToCenterStackNearMe = false; moveCardToFarCenterStack = true; } else if (this.MoveCardToFarCenterStack) { moveCardToFarCenterStack = false; pickupCardToForward = true; } else if (this.PickupCardToForward) { pickupCardToForward = false; drawing = true; } else if (this.Drawing) { drawing = false; moveCardToCenterStackNearMe = true; } // 今回の入力 this.MoveCardToCenterStackNearMe = moveCardToCenterStackNearMe; this.MoveCardToFarCenterStack = moveCardToFarCenterStack; this.PickupCardToForward = pickupCardToForward; this.PickupCardToBackward = pickupCardToBackward; this.Drawing = drawing; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 コンピューターは 順繰りに キーを押してるだけ」</p> <p><a href="https://crieit.now.sh/upload_images/6a7301f5d50bc1f499bc80fa551a7c9d63e4fb4852de9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6a7301f5d50bc1f499bc80fa551a7c9d63e4fb4852de9.png?mw=700" alt="202302_unity_09-2254--input-manager-1.png" /></a></p> <p>📅 2023-02-09 thu 22:54</p> <p><code>Assets/Scripts/Gui/InputManager.cs</code> file:</p> <pre><code class="csharp">using GuiOfInputManager = Assets.Scripts.Gui.InputManager; using Assets.Scripts.Gui.SpanOfLerp.TimedGenerator; using Assets.Scripts.ThinkingEngine.Model; using Assets.Scripts.ThinkingEngine.Model.CommandArgs; using UnityEngine; using GuiOfTimedCommandArgs = Assets.Scripts.Gui.TimedCommandArgs; using Assets.Scripts.ThinkingEngine; public class InputManager : MonoBehaviour { // - フィールド ScheduleRegister scheduleRegister; /// <summary> /// コンピューター・プレイヤー用 /// </summary> GameModel gameModel; float[] spamSeconds = new[] { 0f, 0f }; /// <summary> /// コンピューター・プレイヤーか? /// /// - コンピューターなら Computer インスタンス /// - コンピューターでなければヌル /// </summary> internal Computer[] Computers { get; set; } = new Computer[] { new Computer(0), new Computer(1), }; GuiOfInputManager.ToMeaning inputToMeaning = new GuiOfInputManager.ToMeaning(); // - イベントハンドラ // Start is called before the first frame update void Start() { var gameManager = GameObject.Find("Game Manager").GetComponent<GameManager>(); scheduleRegister = gameManager.ScheduleRegister; gameModel = gameManager.Model; } /// <summary> /// Update is called once per frame /// /// - 入力は、すぐに実行は、しません /// - 入力は、コマンドに変換して、タイムラインへ登録します /// </summary> void Update() { // キー入力の解析:クリアー inputToMeaning.Clear(); // もう入力できないなら真 bool[] handled = { false, false }; for (var player = 0; player < 2; player++) { // 前判定:もう入力できないなら真 // // - スパム中 // - 対局停止中 handled[player] = 0 < spamSeconds[player] || !gameModel.IsGameActive; if (!handled[player]) { if (Computers[player] == null) { // キー入力の解析:人間の入力を受付 inputToMeaning.UpdateFromInput(player); } else { // コンピューター・プレイヤーが思考して、操作を決める Computers[player].Think(gameModel); // キー入力の解析:コンピューターからの入力を受付 inputToMeaning.Overwrite( player: player, moveCardToCenterStackNearMe: Computers[player].MoveCardToCenterStackNearMe, moveCardToFarCenterStack: Computers[player].MoveCardToFarCenterStack, pickupCardToForward: Computers[player].PickupCardToForward, pickupCardToBackward: Computers[player].PickupCardToBackward, drawing: Computers[player].Drawing); } } // スパン時間消化 if (0 < spamSeconds[player]) { // 負数になっても気にしない spamSeconds[player] -= Time.deltaTime; } } const int right = 0;// 台札の右 const int left = 1;// 台札の左 // 先に登録したコマンドの方が早く実行される // (ボタン押下が同時なら)右の台札は1プレイヤー優先 // ================================================== // 1プレイヤー { var player = 0; if (!handled[player] && inputToMeaning.MoveCardToCenterStackNearMe[player] && LegalMove.CanPutToCenterStack( gameModel: scheduleRegister.GameModel, player: player, place: right)) // 右の { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveCardToCenterStackFromHandModel( player: player, // 1プレイヤーが place: right)); // 右の spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); handled[player] = true; } } // 2プレイヤー { var player = 1; if (!handled[player] && inputToMeaning.MoveCardToFarCenterStack[player] && LegalMove.CanPutToCenterStack( gameModel: scheduleRegister.GameModel, player: player, place: right)) // 右の) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)右の台札へ積み上げる var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveCardToCenterStackFromHandModel( player: player, // 2プレイヤーが place: right)); // 右の spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); handled[player] = true; } } // (ボタン押下が同時なら)左の台札は2プレイヤー優先 // ================================================== // 2プレイヤー { var player = 1; if (!handled[player] && inputToMeaning.MoveCardToCenterStackNearMe[player] && LegalMove.CanPutToCenterStack( gameModel: scheduleRegister.GameModel, player: player, place: left)) { // 2プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveCardToCenterStackFromHandModel( player: player, // 2プレイヤーが place: left)); // 左の spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); handled[player] = true; } } // 1プレイヤー { var player = 0; if (!handled[player] && inputToMeaning.MoveCardToFarCenterStack[player] && LegalMove.CanPutToCenterStack( gameModel: scheduleRegister.GameModel, player: player, place: left)) { // 1プレイヤーが、ピックアップ中の場札を抜いて、(1プレイヤーから見て)左の台札へ積み上げる var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveCardToCenterStackFromHandModel( player: player, // 1プレイヤーが place: left)); // 左の spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); handled[player] = true; } } // それ以外のキー入力は、同時でも勝敗に関係しない // ============================================== // 1プレイヤー { var player = 0; if (handled[player]) { } else if (inputToMeaning.PickupCardToBackward[player]) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)左隣のカードをピックアップするように変えます var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveFocusToNextCardModel( player: player, direction: 1)); spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); } else if (inputToMeaning.PickupCardToForward[player]) { // 1プレイヤーのピックアップしているカードから見て、(1プレイヤーから見て)右隣のカードをピックアップするように変えます var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveFocusToNextCardModel( player: player, direction: 0)); spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); } } // 2プレイヤー { var player = 1; if (handled[player]) { } else if (inputToMeaning.PickupCardToBackward[player]) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)左隣のカードをピックアップするように変えます var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveFocusToNextCardModel( player: player, direction: 1)); spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); } else if (inputToMeaning.PickupCardToForward[player]) { // 2プレイヤーのピックアップしているカードから見て、(2プレイヤーから見て)右隣のカードをピックアップするように変えます var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveFocusToNextCardModel( player: player, direction: 0)); spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); } } // デバッグ用 if (inputToMeaning.Drawing) { // 両プレイヤーは手札から1枚抜いて、場札として置く for (var player = 0; player < 2; player++) { // 場札を並べる var timedCommandArg = new GuiOfTimedCommandArgs.Model(new MoveCardsToHandFromPileModel( player: player, numberOfCards: 1)); spamSeconds[player] = timedCommandArg.Duration; scheduleRegister.AddJustNow(timedCommandArg); } } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 人間のキー入力も、コンピューターのキー入力も、<br /> 同じルーチンに合流するように しておくぜ」</p> <p><a href="https://crieit.now.sh/upload_images/4ddd22bdc1f702f7824e91ba18737a6e63e4fc8a2d089.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4ddd22bdc1f702f7824e91ba18737a6e63e4fc8a2d089.png?mw=700" alt="202302_unity_09-2259--game-manager-1.png" /></a></p> <p>📅 2023-02-09 thu 22:59</p> <p><code>Assets/Scripts/Gui/GameManager.cs</code> file:</p> <pre><code class="csharp">// ... 前略 ... // 登録:ピックアップ場札を、台札へ積み上げる { { // 1プレイヤーが、ピックアップ中の場札を抜いて、右の台札へ積み上げる var player = 0; var spanModel = new MoveCardToCenterStackFromHandModel( player: player, // 1プレイヤーが place: right); // 右の this.ScheduleRegister.AddWithinScheduler(player, spanModel); } { // 2プレイヤーが、ピックアップ中の場札を抜いて、左の台札へ積み上げる var player = 1; var spanModel = new MoveCardToCenterStackFromHandModel( player: player, // 2プレイヤーが place: left); // 左の; this.ScheduleRegister.AddWithinScheduler(player, spanModel); } } // 対局開始の合図 { var spanModel = new SetGameActive( isGameActive: true); { var player = 0; // どっちでもいいが、とりあえず、プレイヤー1に 合図を出させる this.ScheduleRegister.AddWithinScheduler(player, spanModel); } { var player = 1; // プレイヤー2も、間を合わせる this.ScheduleRegister.AddScheduleSeconds( player: player, seconds: new GuiOfTimedCommandArgs.Model(spanModel).Duration); } } // 以下、デモ・プレイを登録 // SetupDemo(); // OnTick を 1.0 秒後に呼び出し、以降は tickSeconds 秒毎に実行 InvokeRepeating(nameof(OnTick), 1.0f, tickSeconds); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <strong>対局開始コマンド</strong> というのを追加した。<br /> これがないと コンピューターが ゲーム起動直後から 台札置くのも すっとばして 場札をいじりだしてしまうぜ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1623684569303257088?s=20&t=ribcP0tlx-bgwQ1pUug2MQ">開発中画面</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 とりあえず こんなもんで」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 今日は ここまでだぜ」</p> <h1 id="📅 2023-02-12 sun 17:52"><a href="#%F0%9F%93%85+2023-02-12+sun+17%3A52">📅 2023-02-12 sun 17:52</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 1プレイヤーと 2プレイヤーのどちらも カードを置けなくなったら、どうすんだっけ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 いっせー のー せっ! の掛け声で一緒に出すんじゃないの?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.nintendo.co.jp/others/playing_cards/howtoplay/speed/index.html">遊びかた:スピード</a></p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 👆 手札から補充する、手札がなければ 場札から補充する、とあるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ、どちらも置けなくなったら、以下のケースがあるわけだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 手札が残っている方は、手札の頂上から1枚 自動的に 出す」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 手札が残っていない方は、場札を1枚 手動的に選んで 出す」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 後出しが できるんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 出さない、というケースもあるのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 どちらかが カード出したら、残っている方は、3秒後に ピックアップしてる場札 勝手に出す、ということで いいのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 カウントダウン 作んなきゃいけないわね」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ、置く札がない状況、仮に <strong>ステイルメイト</strong>(Stalemate) とでも呼ぶとして、<br /> Stalemate かどうか判断する関数を1つ作ろうぜ?」</p> <p>📅 2023-02-12 sun 18:07 ↑</p> <p><a href="https://crieit.now.sh/upload_images/b64d921c905fa5b3d80f6fbdc1b331a063e8afaeb87bf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b64d921c905fa5b3d80f6fbdc1b331a063e8afaeb87bf.png?mw=700" alt="202302_unity_12-1821--player-select.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 その前にこの 画面サイズに関係なく ボタンサイズがある、という<br /> GUI なんとかならないの?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 画面サイズが縮んだのなら、ボタンも縮むべきだろ」</p> <p><a href="https://crieit.now.sh/upload_images/0fa06cd42b6a96be7c9d325dcbea96c263e8b08d18169.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0fa06cd42b6a96be7c9d325dcbea96c263e8b08d18169.png?mw=700" alt="202302_unity_12-1824--ui-layer-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 UI レイヤーのこと よく分かってないのよね」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.unity3d.com/ja/2020.3/Manual/HOWTO-UIMultiResolution.html">複数の解像度のための UI 設計</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 勉強しようぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 <strong>Canvas Scaler</strong> コンポーネントというものがあるらしい。なんだぜそれ?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.unity3d.com/ja/2023.1/Manual/script-CanvasScaler.html">Canvas Scaler</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 スクリプトなのかな?」</p> <p><a href="https://crieit.now.sh/upload_images/fc234b56fd12ce567cb2d50c89c447e463e8b32c393e2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fc234b56fd12ce567cb2d50c89c447e463e8b32c393e2.png?mw=700" alt="202302_unity_12-1835--canvas-scaler-1.png" /></a></p> <p>📅 2023-02-12 sun 18:35</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 追加しようと思ったけど、もう追加されてた……」</p> <p><a href="https://crieit.now.sh/upload_images/1d609babc701100661b9d5e622e4462263e8b3c8770d3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1d609babc701100661b9d5e622e4462263e8b3c8770d3.png?mw=700" alt="202302_unity_12-1838--scale-with-screen-size-1.png" /></a></p> <p>📅 2023-02-12 sun 18:39</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Scale with Screen Size</code> にしたら いいのかな?」</p> <p><a href="https://crieit.now.sh/upload_images/091c39b5c84bb2b6ddeea074ee94e00263e8b4612bd12.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/091c39b5c84bb2b6ddeea074ee94e00263e8b4612bd12.png?mw=700" alt="202302_unity_12-1840--scale-with-screen-size-1.png" /></a></p> <p>📅 2023-02-12 sun 18:42</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 とりあえず これで」</p> <h2 id="ゲーム開始処理の変更"><a href="#%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E5%A7%8B%E5%87%A6%E7%90%86%E3%81%AE%E5%A4%89%E6%9B%B4">ゲーム開始処理の変更</a></h2> <p>📅 2023-02-12 sun 21:11</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 ゲーム開始処理を ごっそり 変えたので説明する」</p> <p><a href="https://crieit.now.sh/upload_images/db14f85afafb9e729ee13bdf3ab3003963e8d85354d18.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/db14f85afafb9e729ee13bdf3ab3003963e8d85354d18.png?mw=700" alt="202302_unity_12-2114--namespaces-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 大まかに、スクリプトを <code>ThinkingEngine</code> と <code>Vision</code> に分けることにする。<br /> <code>ThinkingEngine</code> というのは 画面なしで動くようなもので、<br /> <code>Vision</code> というのは 画面で動くようなゲームが入ってるところだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 その <code>Vision</code> の中は、さらに3つに分けることにする。<br /> <code>Input</code> というのは キーボードからの入力だな。<br /> <code>UserInterface</code> というのは、画面上のボタンとかだぜ。<br /> <code>World</code> は、まあ その他 ぐらいに思えだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/a1baf14cc65e410bc91d0d7211bb925963e8d94861c08.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a1baf14cc65e410bc91d0d7211bb925963e8d94861c08.png?mw=700" alt="202302_unity_12-2118--start-game-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 今までは 勝手にゲームが始まっていたが、<br /> <code>StartGame()</code> メソッドを呼び出すまで 始まらないように変更する」</p> <p><a href="https://crieit.now.sh/upload_images/7929874c531f9d8737d7ae571172f92663e8d9ced7bec.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7929874c531f9d8737d7ae571172f92663e8d9ced7bec.png?mw=700" alt="202302_unity_12-2120--ui-manager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 じゃあ どこで始まるの? というと、<br /> ボタンを押したときに 始まるようにする。<br /> これらは <code>Assets.Scripts.Vision.UserInterface.Manager</code> クラスにまとめてある」</p> <p><a href="https://crieit.now.sh/upload_images/668127cacbe38167a7afa54b308f1bd963e8dafbbe32f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/668127cacbe38167a7afa54b308f1bd963e8dafbbe32f.png?mw=700" alt="202302_unity_12-2125--on-click-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ボタンを押すと On Click() のリストに登録したメソッドが実行される仕組みは 覚えておいてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/a20cfc73c354dc80a7ce9e01c003cdb863e8dc14060d8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a20cfc73c354dc80a7ce9e01c003cdb863e8dc14060d8.png?mw=700" alt="202302_unity_12-2130--game.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 開始時のカードも片づけたぜ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1624749016222420993?s=20&t=99Y5KYaBck67kX1tB9qGQw">開発中画面</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 今日は ここまでだぜ」</p> <p>📅 2023-02-12 sun 21:36 end</p> <h1 id="📅2023-03-17 fri 21:00"><a href="#%F0%9F%93%852023-03-17+fri+21%3A00">📅2023-03-17 fri 21:00</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 おっ、1か月ぶりか。<br /> Unity の画面を見るのも嫌になってるが、<br /> 既知の不具合を1つ 直そうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/8d6cdae7f6cc77b0523831eee6efd16d641458da7041d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8d6cdae7f6cc77b0523831eee6efd16d641458da7041d.png?mw=700" alt="202303_unity_17-2109--input-1.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 入力したことを そのまま実行されると<br /> おかしくなることがあるので、制約を付けたいんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 場札が1枚のときは、左には場札は無いしな」</p> <p><a href="https://crieit.now.sh/upload_images/5155d78be4152a279a1a32f181315d59641473f57a9ee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5155d78be4152a279a1a32f181315d59641473f57a9ee.png?mw=700" alt="202303_unity_17-2305--constraint-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 行動に制約を付けると こんな感じだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 制約は そんなもんで いいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/f49c55cedf8ecf866bd9bfd7bf7ce9196414751f3c50b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f49c55cedf8ecf866bd9bfd7bf7ce9196414751f3c50b.png?mw=700" alt="202303_unity_17-2311--stalemate.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 それより ステールメート(※置けるカードがない)したら どうすんの?」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 カードを引きたくても、手札(自分の側に積んでいたカード)も 無くなってるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 スピードのルールかあ。調べるかだぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1346665563">トランプ【スピード】のルールを教えてくだし。</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 せーの、で 場札の好きなカードを1枚 捨てれるみたいだな」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 今、ステールメートしてるかどうか判定するアルゴリズムを書いてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 大変なんで、また今度な」</p> <h1 id="📅2023-03-18 sat 12:41 - Stalemate"><a href="#%F0%9F%93%852023-03-18+sat+12%3A41+-+Stalemate">📅2023-03-18 sat 12:41 - Stalemate</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 気分乗らないけど、<br /> ステールメートしてるかどうか 判定するアルゴリズムを考えるか……」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 メソッドのシグニチャーから 決めたらいいんじゃない?」</p> <pre><code class="plaintext">入力:   1P の場札   2P の場札   右の台札   左の台札 出力:   Yes/No </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 まあ、こんなもんだろ。<br /> 次は中身だな」</p> <pre><code class="plaintext">置ける数の配列=[   (右札の台札の数+1ー1) mod 13,   (右札の台札の数ー1ー1) mod 13,   (左札の台札の数+1ー1) mod 13,   (左札の台札の数ー1ー1) mod 13] </code></pre> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 👆 最小2つ~最大4つの数を、プレイヤーのどっちかが持ってれば 結果は No だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 1Pの場札、2Pの場札を 愚直に調べるしかないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 場札は 100枚も無いでしょ。愚直で すぐよ」</p> <p><a href="https://crieit.now.sh/upload_images/7d69bced9806f610741f86e812324478641539339b230.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7d69bced9806f610741f86e812324478641539339b230.png?mw=700" alt="202303_unity_18-1307--canPutToCenterStack-1.png" /></a></p> <p><code>Assets/Scripts/ThinkingEngine/Model/LegalMove.cs</code>:</p> <pre><code class="csharp">namespace Assets.Scripts.ThinkingEngine.Model { internal class LegalMove { // - メソッド internal static bool CanPutToCenterStack(GameModel gameModel, int player, int place) { int index = gameModel.GetIndexOfFocusedCardOfPlayer(player); if (index == -1) { return false; } IdOfPlayingCards topCard = gameModel.GetLastCardOfCenterStack(place); if (topCard == IdOfPlayingCards.None) { return false; } var numberOfPickup = gameModel.GetCardsOfPlayerHand(player)[index].Number(); int numberOfTopCard = topCard.Number(); // とりあえず差分を取る。 // 負数が出ると、負数の剰余はプログラムによって結果が異なるので、面倒だ。 // 割る数を先に足しておけば、剰余をしても負数にはならない int divisor = 13; // 法 int remainder = (numberOfTopCard - numberOfPickup + divisor) % divisor; return remainder == 1 || remainder == divisor - 1; } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 台札に置けるか、というメソッドをもう作ってあった。これを使えばいいだけかも」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ使えだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/c3cb02dfbffe998f95a3dd10fc8a951964153b75b776f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c3cb02dfbffe998f95a3dd10fc8a951964153b75b776f.png?mw=700" alt="202303_unity_18-1317--inputManager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 ステールメートの判定は、 インプット・マネージャーに書けばいいかな」</p> <p><a href="https://crieit.now.sh/upload_images/f63fca79390797c934d930fd044157b464153c613c412.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f63fca79390797c934d930fd044157b464153c613c412.png?mw=700" alt="202303_unity_18-1321--stalemate.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>TODO</code> コメントを使って 日本語でプログラムのプレースホルダーを書いていくぜ」</p> <p><a href="https://crieit.now.sh/upload_images/8e69b82d6b3e26cea182e1ba958f4efb6415400faee2d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8e69b82d6b3e26cea182e1ba958f4efb6415400faee2d.png?mw=700" alt="202303_unity_18-1336--stalemate-1.png" /></a></p> <p>📅 2023-03-18 sat 13:39</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 既存のコードと同じものを2回書くぐらいなら、共通化するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 カウント・ダウン・タイマーという 新しい要素を 追加しないといけないわよ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 コルーチンで作れるかな? 大変そうだな……」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 手札があるときは、手札の天辺の札を取れよ。忘れるなよ」</p> <h2 id="📅 2023-03-18 sat 18:10"><a href="#%F0%9F%93%85+2023-03-18+sat+18%3A10">📅 2023-03-18 sat 18:10</a></h2> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 開始と終了の位置を線形補間する <code>Lerp</code> はあるけど、<br /> カウントダウンして 時間が来たら 強制的にカードを台札に置くような<br /> 仕掛けは 作ってないんだが」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 コルーチンを使えだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 カウントダウンが インプット・マネージャーの仕事とは思わん。<br /> ユーザー・インターフェース・マネージャーに カウントダウンをやらせて、<br /> インプット・マネーシャーから ユーザー・インターフェース・マネージャーへ依頼する形にしようかな」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 お互いにおけるカードがなくなったから、カードを置き直すの、名前 何かあるのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 分かんないから 再開(Reopening)でいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ それで」</p> <h2 id="コルーチン"><a href="#%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3">コルーチン</a></h2> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://shibuya24.info/entry/unity-coroutine">【Unity基礎】コルーチンの使い方と注意点まとめ徹底解説</a></p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 復習しよ」</p> <h2 id="ステールメート書き直し"><a href="#%E3%82%B9%E3%83%86%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%BC%E3%83%88%E6%9B%B8%E3%81%8D%E7%9B%B4%E3%81%97">ステールメート書き直し</a></h2> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 あれ、ステールメート判定 できてないぜ。<br /> 持ってるカードだけ見て ステールメートを判定しちゃいけないんだ、<br /> 場札を全部見ないといけないんだ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 書き直せだぜ」</p> <h2 id="📅 2023-03-18 sat 20:05"><a href="#%F0%9F%93%85+2023-03-18+sat+20%3A05">📅 2023-03-18 sat 20:05</a></h2> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 プログラミングが大変になってきたので、<br /> 改造するぜ」</p> <p><code>Assets.Scripts.ThinkingEngine.Models.Player.cs</code> :</p> <pre><code class="csharp">namespace Assets.Scripts.ThinkingEngine.Models { /// <summary> /// プレイヤーの配列の添え字 /// /// - プレイヤー1 は 0 /// - プレイヤー2 は 1 /// </summary> class Player { // - 演算子のオーバーロード #region 演算子のオーバーロード(== と !=) // 📖 [自作クラスの演算子をオーバーロードする](https://dobon.net/vb/dotnet/beginner/operator.html) // 📖 [自作クラスのEqualsメソッドをオーバーライドして、等価の定義を変更する](https://dobon.net/vb/dotnet/beginner/equals.html) public static bool operator ==(Player c1, Player c2) { // nullの確認(構造体のようにNULLにならない型では不要) // 両方nullか(参照元が同じか) // (c1 == c2)とすると、無限ループ if (object.ReferenceEquals(c1, c2)) { return true; } // どちらかがnullか // (c1 == null)とすると、無限ループ if (((object)c1 == null) || ((object)c2 == null)) { return false; } return (c1.source == c2.source) && (c1.source == c2.source); } public static bool operator !=(Player c1, Player c2) { // (c1 != c2)とすると、無限ループ return !(c1 == c2); } /// <summary> /// objと自分自身が等価のときはtrueを返す /// </summary> /// <param name="obj"></param> /// <returns></returns> public override bool Equals(object obj) { //objがnullか、型が違うときは、等価でない if (obj == null || this.GetType() != obj.GetType()) { return false; } //この型が継承できないクラスや構造体であれば、次のようにできる //if (!(obj is TestClass)) //Numberで比較する Player c = (Player)obj; return (this.source == c.source); //または、 //return (this.Number.Equals(c.Number)); } //Equalsがtrueを返すときに同じ値を返す public override int GetHashCode() { return this.source; } #endregion // - その他 internal Player(int source) { this.source = source; } // - フィールド /// <summary> /// 値 /// </summary> int source; // - プロパティー /// <summary> /// 整数型形式で取得 /// </summary> internal int AsInt => source; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 プレイヤーを int 型で表すのは 辛くなってきたので<br /> クラスを使って Player型 を作るぜ。<br /> C# に typedef は無い」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 勝手にしろだぜ」</p> <p><code>Assets.Scripts.ThinkingEngine.Commons.cs</code> :</p> <pre><code class="csharp">namespace Assets.Scripts.ThinkingEngine { using Assets.Scripts.ThinkingEngine.Models; /// <summary> /// よく使う不変値 /// </summary> static class Commons { internal static readonly Player Player1 = new Player(0); internal static readonly Player Player2 = new Player(1); internal static readonly Player[] Players = new Player[] { Player1, Player2, }; } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 よく使う値を 予め作っておくぜ」</p> <h2 id="📅 2023-03-18 sat 22:45"><a href="#%F0%9F%93%85+2023-03-18+sat+22%3A45">📅 2023-03-18 sat 22:45</a></h2> <p><code>Assets/Scripts/Vision/Input/Manager.cs</code> :</p> <pre><code class="csharp"> // ステールメートしてるかどうかの判定 // ================================== // ステールメートしているとき bool isStalemate = true; // 反例を探す foreach (var playerObj in Commons.Players) { foreach (var centerStackPlace in Commons.CenterStacks) { var max = this.gameModel.GetCardsOfPlayerHand(playerObj).Count; for (int i = 0; i < max; i++) { if (LegalMove.CanPutToCenterStack( this.gameModel, playerObj, new HandCardIndex(i), centerStackPlace)) { isStalemate = false; goto end_loop; } } } } end_loop: if (isStalemate) { // TODO ★ カウントダウン・タイマーを表示。0になったら、ピックアップ中の場札を強制的に台札へ置く this.reopeningManager.DoIt(); } </code></pre> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 コードの掲載は 省いていくが、雰囲気は こんな感じ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1637103333709332481?s=20">開発中画面</a></p> <p>📅 2023-03-18 sat 23:49</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 👆 そのあと 大改造して カウントダウンは 付けたぜ。<br /> 今日はここまで」</p> <h1 id="📅 2023-03-19 sun 17:58"><a href="#%F0%9F%93%85+2023-03-19+sun+17%3A58">📅 2023-03-19 sun 17:58</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 Unity の顔を見るのも嫌になっているが 不具合の調査をするかだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 ゲームの結果を表示してくれだぜ。<br /> 1Pの勝ち、2Pの勝ち、引き分け のいずれかだろ」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 両プレイヤーが 同時に最後のカードを 捨てるの、<br /> 何ミリ秒差まで 厳密に判定するの?<br /> 一瞬でも速く置いた方が 勝ちなの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 レトロな 格闘ゲーマーは 1フレームの差を 文句言ってくるからな」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 じゃあ 1フレームの差を区別しろだぜ。<br /> 両者が 最後の1枚を残して ステールメートしてるときは 同時にカード捨てるから 引き分けになるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 カードを捨てた瞬間か、<br /> それとも カードを台札に置いた瞬間か、<br /> どっちで判定するんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 カードを置いた瞬間よ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 カードを置いた瞬間って、どんな瞬間?」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 台札の鉄板のカードに、場札が接した瞬間よ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 デジタルゲーなのに 判定は アナログ的なの つら」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 Unity は物理的な当たり判定を取れるのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 物理演算を使うと、距離とか 速度とか 公平性 保たなくてはいけなくなって大変なので<br /> デジタルな判定にしたいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 台札に投げたカードの モーションの終点で フラグ立てるか」</p> <h1 id="📅 2023-03-22 wed 19:14"><a href="#%F0%9F%93%85+2023-03-22+wed+19%3A14">📅 2023-03-22 wed 19:14</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 これから 風呂入って ビール飲んで まだやる気があったら 開発するぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 開発ブログやる気無くなってるの わらう」</p> <h1 id="📅 2023-03-23 thu 19:35"><a href="#%F0%9F%93%85+2023-03-23+thu+19%3A35">📅 2023-03-23 thu 19:35</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 はあ~ Unity の顔も見たくねー、起動だけ するか~」</p> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 やる気がない時期を やりすごすのが 長く続けるには 重要なのよ」</p> <p>📅 2023-03-23 thu 23:11</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 ソースコードを掃除した。今日は終わり」</p> <h1 id="📅 2023-03-25 sat 16:25"><a href="#%F0%9F%93%85+2023-03-25+sat+16%3A25">📅 2023-03-25 sat 16:25</a></h1> <p><a href="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31f0f35be3a4b6b05ce597c7aab702b763c675227892a.png?mw=700" alt="202108__character__12--ohkina-hiyoko-futsu2.png" /></a><br /> 「 今日はプログラミングすんの?」</p> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 待ってくれだぜ つら。<br /> ジュース飲んで 気分が上がってくれば プログラミングするぜ」</p> <h1 id="📅 2023-03-26 sat 13:56"><a href="#%F0%9F%93%85+2023-03-26+sat+13%3A56">📅 2023-03-26 sat 13:56</a></h1> <p><a href="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b53e954894672b36c716412a272826b63c674b756465.png?mw=700" alt="202101__character__31--ramen-tabero-futsu2.png" /></a><br /> 「 気分が乗ったら プログラミングするぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e846bc7782a0e037a1665e6b3d51b02463c6750a6308a.png?mw=700" alt="202101__character__28--kifuwarabe-futsu.png" /></a><br /> 「 起動する元気も大事だしな」</p> <h1 id="// 書きかけ"><a href="#%2F%2F+%E6%9B%B8%E3%81%8D%E3%81%8B%E3%81%91">// 書きかけ</a></h1> むずでょ