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>
むずでょ