約 4,392 件
https://w.atwiki.jp/mcforum/pages/70.html
気体パイプと液体パイプのメモ (編集中) 設備 名称、和名、素材、備考 気体パイプ 気体ブリッジ 断熱気体パイプ 輻射気体パイプ 気体ポンプ ミニ気体ポンプ 気体フィルター 気体貯蔵庫 気体バルブ 気体遮断器 気体缶詰め器 (拙訳) 気体缶放出器 (拙訳) 液体パイプ 液体ブリッジ デュプリカント(参考) 消費 酸素100g/秒, 1000kcal/サイクル ミールウッド 成長サイクル 消費 生産(自生) (栽培) 12.0 3.0 土10kg/サイクル ミールライス600kcal 名称 品質 消費材料 カロリー 1サイクル1株あたり得られるカロリー ミールライス -1 - 600kcal 200kcal ├ ライスローフ 0 ミールライス1200kcal, 水50kg 1700kcal 283kcal └ ピクルス -1 ミールライス1800kcal 1800kcal 200kcal ※ピクルスはミールライスより消費期限が長い(16サイクル) ブリッスルブロッサム 成長サイクル 消費 生産(自生) (栽培) 24.0 6.0 水20kg/サイクル ブリッスルベリー1600kcal 名称 品質 消費材料 カロリー 1サイクル1株あたり得られるカロリー ブリッスルベリー 0 - 1600kcal 266kcal ├ グリルベリー +1 ブリッスルベリー1600kcal 2000kcal 333kcal └ ベリーの香草焼き +4 ブリッスルベリー3200kcal, ピンチャペッパー2個 4000kcal 333kcal ※ベリーの香草焼きはグリルベリーより高品質、また製作時間は同じなので効率が良い ダスクキャップ 成長サイクル 消費 生産(自生) (栽培) 30.0 7.5 ヘドロ4000g/サイクル キノコ2400kcal 名称 品質 消費材料 カロリー 1サイクル1株あたり得られるカロリー キノコ 0 - 2400kcal 320kcal └ 焼きキノコ +1 キノコ2400kcal 2800kcal 373kcal スリートウィート 成長サイクル 消費 生産(自生) (栽培) 72.0 18.0 水20kg/サイクル, 肥料4000g/サイクル 穀粒18個 名称 品質 消費材料 カロリー 1サイクル1株あたり得られるカロリー スリートウィートの穀粒 - - (18個) (1個) ├ フロストバンズ +2 スリートウィートの穀粒3個 1200kcal 400kcal └ ペッパーブレッド +5 スリートウィートの穀粒10個, ピンチャペッパー1個 4000kcal 400kcal ※ペッパーブレッドはフロストバンズより高品質、また製作時間は同じなので効率が良い
https://w.atwiki.jp/mcforum/pages/83.html
ここにはInGameプログラミングで有用そうなことをメモっておく
https://w.atwiki.jp/mcforum/pages/4.html
ニュース @wikiのwikiモードでは #news(興味のある単語) と入力することで、あるキーワードに関連するニュース一覧を表示することができます 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_174_ja.html たとえば、#news(wiki)と入力すると以下のように表示されます。 【クリスマス2021】高本彩花|ひなこい - ひなこい攻略Wiki - Gamerch(ゲーマチ) 【カウンターサイド】リセマラ当たりランキング - カウサイ攻略Wiki - Gamerch(ゲーマチ) ウィキペディアを作ったiMacが箱付きで競売に登場。予想落札価格は約96万円!(ギズモード・ジャパン) - Yahoo!ニュース - Yahoo!ニュース 【テイルズオブルミナリア】リセマラ当たりランキング - TOルミナリア攻略Wiki - Gamerch(ゲーマチ) 終末のアーカーシャ(終アカ)攻略wiki - Gamerch(ゲーマチ) メトロイド ドレッド攻略Wiki - Gamerch(ゲーマチ) 【まおりゅう】最強パーティー編成とおすすめキャラ【転スラアプリ】 - Gamerch(ゲーマチ) 【グランサガ】リセマラ当たりランキング - グランサガ攻略wiki - Gamerch(ゲーマチ) アイプラ攻略Wiki|アイドリープライド - AppMedia(アップメディア) マニュアル作成に便利な「画像編集」機能を提供開始! - ナレッジ共有・社内wikiツール「NotePM」 (2021年12月6日) - エキサイトニュース マニュアル作成に便利な「画像編集」機能を提供開始! - ナレッジ共有・社内wikiツール「NotePM」 - PR TIMES 【アイプラ】リセマラは必要?当たりキャラランキング【IDOLY PRIDE】 - Gamerch(ゲーマチ) 【ウインドボーイズ】リセマラ当たりランキング(最新版) - ウインドボーイズ攻略Wiki - Gamerch(ゲーマチ) モンハンライズ攻略Wiki|MHRise - AppMedia(アップメディア) 篠原悠希×田中芳樹が明かす「歴史ファンタジー小説ならではの悩み」(現代ビジネス) - Yahoo!ニュース - Yahoo!ニュース SlackからWikiへ!シームレスな文章作成・共有が可能な「GROWIBot」リリース - アットプレス(プレスリリース) 【ウマ娘】チャンピオンズミーティングの攻略まとめ - Gamerch(ゲーマチ) 【ウマ娘】ナリタブライアンの育成論|URAシナリオ - Gamerch(ゲーマチ) 【ウマ娘】ヒシアケボノの育成論|URAシナリオ - Gamerch(ゲーマチ) 【ウマ娘】フジキセキの育成論|URAシナリオ - Gamerch(ゲーマチ) ドラゴンクエストけしケシ攻略Wiki - Gamerch(ゲーマチ) 【スタオケ】カード一覧【金色のコルダスターライトオーケストラ】 - Gamerch(ゲーマチ) 【スマブラSP】ソラのコンボと評価【スマブラスペシャル】 - Gamerch(ゲーマチ) 【ブレフロレゾナ】リセマラ当たりランキング【ブレイブフロンティアレゾナ】 - ブレフロR攻略Wiki - Gamerch(ゲーマチ) 【スパロボ30】攻略ルート早見表|ミッション一覧【スーパーロボット大戦30】 - AppMedia(アップメディア) 仲村トオル、共演者は事前に“Wiki調べ” - 沖縄タイムス 【ENDER LILIES】攻略チャートと全体マップ【エンダーリリィズ】 - Gamerch(ゲーマチ) 【ウマ娘】あんしん笹針師の選択肢はどれを選ぶべき? - Gamerch(ゲーマチ) 【ポケモンユナイト】アップデート情報・キャラ調整まとめ - ポケモンユナイト攻略Wiki - Gamerch(ゲーマチ) 【Apex】シーズン11の新要素と最新情報まとめ【エーペックス】 - Gamerch(ゲーマチ) 【ゼルダ無双】スッパ(DLCキャラ)の解放条件|おすすめコンボと固有アクション【厄災の黙示録】 - AppMedia(アップメディア) ロストジャッジメント攻略Wiki - Gamerch(ゲーマチ) 【Among us】新マップThe Airship(エアシップ)の解説【アモングアス】 - Gamerch(ゲーマチ) ハーネスについて小児科医の立場から考える(坂本昌彦) - 個人 - Yahoo!ニュース - Yahoo!ニュース ゼルダ無双攻略Wiki|厄災の黙示録 - AppMedia(アップメディア) ウマ娘攻略Wiki - AppMedia(アップメディア) ゲトメア(ゲートオブナイトメア)攻略Wiki - Gamerch(ゲーマチ) 【白夜極光】リセマラ当たりランキング - 白夜 極光 wiki - Gamerch(ゲーマチ) お蔵入りとなった幻の『スーパーマリオ』 オランダの博物館でプレイ可能?(リアルサウンド) - Yahoo!ニュース - Yahoo!ニュース Linux Professional Institute (LPI)は、Linux認定試験LPIC-3のバージョンアップを発表 - PR TIMES ナレッジ共有・社内wikiツール「NotePM」が「ITreview Best Software in Japan 2021」のTOP50に選出 - PR TIMES 真女神転生5攻略Wiki|メガテン5 - AppMedia(アップメディア) 【B4B】近接ビルドデッキにおすすめのカード【back4blood】 - Gamerch(ゲーマチ) ポケモンスナップ攻略wiki - AppMedia(アップメディア) 富野由悠季「ブレンパワード」作り直したい!ファンを前に意欲(シネマトゥデイ) - Yahoo!ニュース - Yahoo!ニュース 【スマブラSP】カズヤの評価とコンボ【スマブラスペシャル】 - Gamerch(ゲーマチ) ナレッジ共有・社内wiki「NotePM」が「ITreview Grid Award 2021 Fall」で、チームコラボレーションとマニュアル作成部門において「Leader」を5期連続でW受賞! (2021年10月15日) - エキサイトニュース メモ・ドキュメント・wiki・プロジェクト管理などオールインワンのワークスペース「Notion」が日本語ベータ版提供開始 - TechCrunch Japan ガーディアンテイルズ攻略Wiki|ガデテル - AppMedia(アップメディア) 【ギアジェネ】リセマラ当たりランキング【コードギアス】 - ギアジェネ攻略Wiki - Gamerch(ゲーマチ) モンスターファーム2(MF2)攻略wiki|アプリ・Switch移植版 - AppMedia(アップメディア) 【ブラサジ】最強キャラTierランキング【ブラックサージナイト】 - Gamerch(ゲーマチ) 【パワプロ】鬼滅の刃コラボ情報まとめ - Gamerch(ゲーマチ) 【SPAJAM2021】第3回予選大会は「クイズ!WIKIにゃんず!」を開発したチーム「かよちゃんず」が最優秀賞! | gamebiz - SocialGameInfo 検索結果における「ナレッジパネル」の役割とは・・・ウィキメディア財団とDuckDuckGoの共同調査 - Media Innovation ナレッジ共有・社内wikiツール「NotePM」が「BOXIL SaaS AWARD 2021 Autumn」にて「コラボレーション部門」を受賞! - PR TIMES 【ポケモンユナイト】カメックスの評価と立ち回り【UNITE】 - Gamerch(ゲーマチ) 「ゼルダの伝説 BotW」のマラソンで23秒? 驚きの速さで完走した方法が話題(リアルサウンド) - Yahoo!ニュース - Yahoo!ニュース Wikipediaが「中国人編集者の身の安全を守るため」に一部の編集者アカウントをBANに - GIGAZINE 【ドッカンバトル】3.5億ダウンロードキャンペーン最新情報 - ドッカンバトル攻略Wiki - Gamerch(ゲーマチ) BTS(防弾少年団)のV、8月のWikipedia閲覧数が韓国アーティストで1位!グループでは4ヶ月連続トップ - Kstyle 【イース6オンライン】リセマラ当たりランキング|召喚ガチャの開放条件は? - Gamerch(ゲーマチ) BacklogからNotePMへwiki情報を自動API連携する「Backlog to NotePM」をSaaStainerに掲載開始 - PR TIMES ライザのアトリエ2攻略Wiki - AppMedia(アップメディア) 真女神転生3リマスター攻略Wiki|メガテン3 - AppMedia(アップメディア) タスクも文書もWikiもデータベースもまとめて管理できる「Notion」とは? - ASCII.jp ナレッジ共有・社内wikiツール「NotePM」が、見るだけ専用ユーザー『無料』の新プランを発表! - PR TIMES 【かのぱず】リセマラ当たりランキング【彼女お借りします】 - Gamerch(ゲーマチ) 【乃木フラ】リセマラの必要はある?【乃木坂的フラクタル】 - Gamerch(ゲーマチ) 【パワプロ】生放送まとめ|パワフェス2021 - パワプロ攻略Wiki - Gamerch(ゲーマチ) ポケモンBDSP(ダイパリメイク)攻略wiki - AppMedia(アップメディア) ルーンファクトリー5攻略wiki|ルンファク5 - AppMedia(アップメディア) シャーマンキングふんばりクロニクル攻略Wiki - Gamerch(ゲーマチ) アーテリーギア‐機動戦姫-攻略Wiki - Gamerch(ゲーマチ) 簡単操作で自分専用Wikiを構築できるMarkdownエディタ「Obsidian」のモバイル版を使ってみた - GIGAZINE 情報マネジメントツール「Huddler」がwiki機能を刷新 - PR TIMES シェアエコ配送アプリ「DIAq(ダイヤク)」のアンカーアプリで、高層ビル・商業施設の入館方法などお役立ち情報をまとめた「DIAqwiki」を公開 - アットプレス(プレスリリース) 異常熱波のカナダで49.6度、いま北米で起きていること(森さやか) - 個人 - Yahoo!ニュース - Yahoo!ニュース 【ツイステ】マスターシェフの攻略~辛味のふるさと~【料理イベント】 - Gamerch(ゲーマチ) 【ラグナロクオリジン】リセマラは不要?おすすめ職業は?【ラグオリ】 - Gamerch(ゲーマチ) 白夜極光攻略wiki - AppMedia(アップメディア) 【バイオミュータント】2.02アプデ|アップデート1.4情報 - バイオミュータント攻略Wiki - Gamerch(ゲーマチ) ニーアレプリカントリメイク攻略wiki|ver.1.22 - AppMedia(アップメディア) 【ウマ娘】ゴルシウィークはいつから?キャンペーン情報まとめ - Gamerch(ゲーマチ) シーズン66 - 【超速GP】ミニ四駆 超速グランプリ攻略まとめwiki - 電撃オンライン 乃木坂的フラクタル攻略Wiki - Gamerch(ゲーマチ) 「こんなことになるとは…」13年前のエイプリルフールについた“嘘”がネットで… ある男の告白(BuzzFeed Japan) - Yahoo!ニュース - Yahoo!ニュース 【ウマ娘】DMM版のデータ連携のやり方とメリット【プリティーダービー】 - Gamerch(ゲーマチ) 整理不要の情報共有ツール(社内Wiki)「Nerve」シードラウンドで総額約3500万円の資金調達を実施 - PR TIMES Nerve - 整理不要の情報共有ツール(社内Wiki) ローンチカスタマー募集開始のお知らせ - PR TIMES Among Us攻略Wiki【アマングアス・アモングアス】 - Gamerch(ゲーマチ) 稲作アクションRPG『天穂のサクナヒメ』における「農林水産省攻略wiki説」は本当なのか? - AUTOMATON 無料とは思えない多機能っぷりなWikiインフラ「Wiki.js」レビュー、自前でホスト&外部サービスと連携可能 - GIGAZINE Microsoft Teamsの基本と活用(24) TeamsのWikiを使う - マイナビニュース 『ゲーミングお嬢様』での提起が話題に “企業系wiki”に横たわる問題点とは - リアルサウンド 「エイリアンのたまご」,自動周回機能と公式wikiが登場 - 4Gamer.net 【リゼロス】Re ゼロから始める異世界生活 Lost in Memories攻略まとめwiki - 電撃オンライン ヌーラボ、プロジェクト管理ツール「Backlog」の絵文字入力の補完機能・Wiki編集の自動マージ機能を修正改善 - PR TIMES Backlog、Wikiにファイル添付が容易にできる機能をリリース -- グローバルバーの視認性改善なども実施 - PR TIMES GK川島、パンチング失点でWiki書き換え炎上 「セネガル代表」「プロボクサー」... - J-CASTニュース
https://w.atwiki.jp/mcforum/pages/96.html
目次 できたもの 前提 素材集め マウスを載せたら展開するメニューを作るパネルの配置 アンカーの設定はお好み 表示順序の制御 その他の設定 展開/格納アニメーションを作る パネルにマウスを載せたら展開、パネルからマウスを外したら格納されるスクリプトを設定するマウス検知をしてトリガー制御するスクリプト セーブとロードのボタンを制御するメニュー操作をする際には葵ちゃんが増えないようにする カウンタ値を制御する共通処理を実装する セーブの動作を実装する ロードの動作を実装する おまけ:リセットボタンとセーブのクリアボタンを実装する できたもの 前提 Unity クリッカーゲームを作ってみたい/04-葵ちゃんが堆積するようにするの続き 素材集め + 詳細を開く メニューウインドウを作るにあたって、枠を付けてみる 洋風フレーム・装飾 A1 https //commons.nicovideo.jp/material/nc121822 利用許可範囲:インターネット全体に許可 営利利用:営利利用可能 その他付加細則あり 素材のフレームのうち、角の部分を切り抜きAssetsに追加しておく。 マウスを載せたら展開するメニューを作る + 詳細を開く パネルの配置 Canvas にウインドウになる Panel を配置する。 色を変更する場合は、インスペクターから Image → Color で変更する 画面右側に少しだけ見えていて、マウスを載せたら展開するため左端に素材のフレームを載せる。 一つは Sprite Renderer の設定でY軸反転して載せる。スケールをマイナス値にしても良い。 今後の拡張性を見越して、メニュー内部でスクロールができるよう UI → Scroll View を設置する Scroll View の Viewport → Content にスクロールさせたい文字やボタンを配置する ここでは「めにゅー」の UI → Text (TextMeshPro) と UI → Button(TextMeshPro) アンカーの設定はお好み Game 画面に見えている状態(パネルを展開した想定の位置)でウインドウサイズを変更してみて挙動を確認 ここでの設定は以下 Panel は center/middle 縁の素材は left/top と left/bottom Scroll View / Viewport / Content は stretch/stretch "めにゅー" の Text (TMP) は left/top Save Button / Load Button と中の Text(TMP) は stretch/stretch 表示順序の制御 カメラに映る表示順序は Canvas や素材 Sprite の Order in Layer の数値で調整する その他の設定 他にも細かい挙動をインスペクターで設定する Button テキストの Auto Size Scroll View の Scroll Rect → Movement Type でスクロール挙動の調整等 展開/格納アニメーションを作る デフォルトのパネルの位置は格納している状態にする Panel を対象に、まずは展開アニメーションを作成する 具体的な操作は Unity クリッカーゲームを作ってみたい/01-茜ちゃんをクリックしてアニメーションさせる の回を参照のこと 展開アニメーションなので、始点は格納された位置、終点は展開した位置になるようなアニメーションにする。 ここでは右端から左方向に展開するので Rect Transform の Anchored Position の x 座標を変化させる 続けて格納アニメーションを作成する Panel の Animator で 初期状態を空のState (ここでは Close に名前を変更している) に繋ぎ、その後 展開アニメーション → 格納アニメーション → 展開…となるように矢印を繋ぐ。 アニメーションの箱は Assets からドロップで追加できる Close からパネルの展開アニメーションに向かう矢印の設定は、open トリガー契機で、Has Exit Time 及び Fixed Duration のチェックは外し、Transition Duration の値は 0.5 、Interruption Source は Next に設定。 パネルの展開アニメーションからパネルの格納アニメーションに向かう矢印の設定は、close トリガー契機で、Has Exit Time 及び Fixed Duration のチェックは外し、Transition Duration の値は 0.5 、Interruption Source は Next に設定。 パネルの格納アニメーションからパネルの展開アニメーションに向かう矢印の設定は、open トリガー契機で、Has Exit Time 及び Fixed Duration のチェックは外し、Transition Duration の値は 0.5 、Interruption Source は Next に設定。 パネルにマウスを載せたら展開、パネルからマウスを外したら格納されるスクリプトを設定する パネルに Box Collider 2D を付け、コライダーのサイズをパネルと同じサイズに設定する。 マウス検知制御用のスクリプトを付ける。 マウス検知をしてトリガー制御するスクリプト OnMouseEnter と OnMouseExit を実装する。 Enter はマウスが乗ったとき、Exit はマウスが離れた時の動作を記述する。 using UnityEngine; public class MenuMouseOver MonoBehaviour{ Animator anime; private void Start() { anime = gameObject.GetComponent Animator (); } void OnMouseEnter() { anime.SetTrigger("open"); } void OnMouseExit() { anime.SetTrigger("close"); }} 他にもRaycastを使用して検知する方法等も存在する 検索キーワード "unity マウスオーバー Raycast" セーブとロードのボタンを制御する メニュー操作をする際には葵ちゃんが増えないようにする + 詳細を開く セーブおよびロードをクリックした際に通常のクリック制御が実行されないようにフラグ制御する GameController に通常クリック可否のフラグを設ける 単純なフラグ制御なので、public bool メンバにして直接設定/参照できるようにしておく ここでは public bool clickable とし、初期値は true (クリック可) にする。 public class GameController MonoBehaviour{ public static GameController instance; // カウンタの通知を受けるオブジェクトのリスト(インスペクターより登録) public List GameObject counterReceivers; int clickCount; public bool clickable; void Awake() {~省略~ void Start() { // オブジェクトを永続化 DontDestroyOnLoad(gameObject); clickable = true; }~省略~ メニューを展開した場合には clickable を false に、格納したときは true に制御する。 public class MenuMouseOver MonoBehaviour{ Animator anime; GameController gameCtrl; private void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); anime = gameObject.GetComponent Animator (); } void OnMouseEnter() { anime.SetTrigger("open"); gameCtrl.clickable = false; } void OnMouseExit() { anime.SetTrigger("close"); gameCtrl.clickable = true; }} 画面クリック時に、clickable が false の場合には何もしないで return で終了するようにする。 これにより、メニューを展開している間は葵ちゃんが増えなくなる public class Click MonoBehaviour{~省略~ void Update() { if (!controller.clickable) { return; } if (Input.GetMouseButtonDown(0)) { anime.SetTrigger("click_cancel"); anime.SetTrigger("click");~省略~ カウンタ値を制御する共通処理を実装する + 詳細を開く GameController が保持するカウンタ値を設定/取得できる関数を追加する 設定時にはカウンタ値を監視している機能に通知をする必要がある 既存のカウンタ値をインクリメントする機能と共通化するため、通知処理はnotyfyCount関数として分離し、設定やインクリメント時に呼び出すように変更する。 ~省略~ void Start() { // オブジェクトを永続化 DontDestroyOnLoad(gameObject); clickable = true; } void notifyCount(int count) { // 指定されたカウント値を、登録オブジェクト全てに通知 foreach (GameObject obj in counterReceivers) { ICounterReceiver receiver = obj.GetComponent ICounterReceiver (); if (receiver != null) { receiver.UpdateCounter(count); } } } public void IncrementCount() { // カウンタをインクリメントして、登録オブジェクト全てに通知 clickCount++; notifyCount(clickCount); } public void SetCount(int count) { // 設定されたカウンタ値を、登録オブジェクト全てに通知 clickCount = count; notifyCount(clickCount); } public int GetCount() { // カウンタ値を返却 return clickCount; }} セーブの動作を実装する + 詳細を開く Save用のスクリプトを作成し、Save用の Button オブジェクトにコンポーネント追加する。 Save用のスクリプトを記述する ここでは、簡易な保存方法として PlayerPrefs への保存/読み込みを実施する。 セーブを実施した旨は、カウンタ表示用テキストに追記する using UnityEngine;using TMPro; public class Save MonoBehaviour{ GameController gameCtrl; TextMeshProUGUI tmp; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { PlayerPrefs.SetInt("Count", gameCtrl.GetCount()); PlayerPrefs.Save(); tmp.text += "(せーぶしました)"; }} ボタンクリックで OnClick() 関数が呼び出されるようにインスペクターで設定する。 ボタンのイベントを + ボタンで増やし、オブジェクトとしてヒエラルキーウインドウから Save用の Button をドラッグしてきてドロップする。 呼び出される関数として、Save スクリプトの OnClick() を選択する。 ロードの動作を実装する + 詳細を開く 葵ちゃんの数を調整するのは、今後のことも考慮してGameControllerに実施してもらう。 GameController に Click クラスを保持するよう修正 public の AdjustAoiChan() 関数として葵ちゃんの数を調整する関数を作成 葵ちゃんの数調整と合わせて登録クラスへの通知も実施する(表示も変更される) using System.Collections.Generic;using UnityEngine; public class GameController MonoBehaviour{ public static GameController instance; // カウンタの通知を受けるオブジェクトのリスト(インスペクターより登録) public List GameObject counterReceivers; public bool clickable; int clickCount; Click click;~省略~ void Start() { // オブジェクトを永続化 DontDestroyOnLoad(gameObject); clickable = true; click = GameObject.FindObjectOfType Click (); }~省略~ public int GetCount() { // カウンタ値を返却 return clickCount; } public void AdjustAoiChan(int target) { // 今いる葵ちゃんの数をカウント GameObject[] aois = GameObject.FindGameObjectsWithTag("Aoi"); int now = aois.Length; if (now target) { // 今いる人数の方が多い場合 while (now target) { // 葵ちゃんには消えてもらう Destroy(aois[now - 1]); now--; } } else { // 今いる人数の方が少ない場合 while (now target) { click.spawnAoi(); now++; } } // 終わったら登録オブジェクトに通知 SetCount(target); }} Load用のスクリプトを作成し、Load用の Button オブジェクトにコンポーネント追加する。 Load用のスクリプトを記述する PlayerPrefs に保存していた情報を読み込み、GameControllerへ葵ちゃんの数調整を依頼。 ロードを実施した旨は、カウンタ表示用テキストに追記する using UnityEngine;using TMPro; public class Load MonoBehaviour{ GameController gameCtrl; TextMeshProUGUI tmp; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { // 葵ちゃんの数を調整する int target = PlayerPrefs.GetInt("Count"); gameCtrl.AdjustAoiChan(target); tmp.text += "(ろーどしました)"; }} おまけ:リセットボタンとセーブのクリアボタンを実装する + 詳細を開く リセットボタンとセーブのクリアボタンを配置する。 設置方法やスクリプトの付け方はセーブやロードと同じ。 リセットボタン using UnityEngine;using TMPro; public class Reset MonoBehaviour{ GameController gameCtrl; TextMeshProUGUI tmp; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { // 葵ちゃんの数をリセットする gameCtrl.AdjustAoiChan(0); tmp.text += "(りせっとしました)"; }} セーブのクリアボタン using UnityEngine;using TMPro; public class Clear MonoBehaviour{ TextMeshProUGUI tmp; void Start() { tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { PlayerPrefs.DeleteKey("Count"); tmp.text += "(せーぶをクリアしました)"; }}
https://w.atwiki.jp/mcforum/pages/50.html
メンバー えこさん yuuki19970920 など
https://w.atwiki.jp/mcforum/pages/75.html
目次 参考 環境 0.プロジェクト設定 1.Oculusのアクションの設定 2.入力値を画面に出す 参考 SteamVR Unity Plugin v2.2.0でのインプットhttps //qiita.com/sakano/items/d87a9b11c23a9bbe166f SteamVR Plugin 2.0のコントローラーの入力系の覚え書きhttps //qiita.com/htpn/items/9838f5cb5d78de90a5c2 環境 Unity 2019.1.0f2 SteamVR Plugin 2.2.0プロジェクトへのインポート時に出るダイアログ類は大体YesかAcceptAllする 0.プロジェクト設定 0.1.「Edit」→「Project Settings...」でPlayerのXR Settingを有効化、OpenVRが一番上に来るようにしておく。必要があるとかなんとか… 1.Oculusのアクションの設定 1.1.「Window」→「SteamVR Input」でダイアログを開く 1.2.「Action Sets」の[+]ボタンを押して新しいセットを追加 ※名前は小文字にする必要がある? 1.3.「Actions」の[+]タブを押して各アクションを追加していく Name Type Trigger vector1 Trigger_Touch boolean Grip vector1 JoyStick vector2 JoyStick_Touch boolean JoyStick_Click boolean Button_A boolean Button_B boolean Button_X boolean Button_X_Touch boolean Button_Y boolean Button_Y_Touch boolean Right_Skeleton boolean \skeleton\hand\right Left_Skeleton boolean \skeleton\hand\left ※参考サイトに従ってAとBのTouchは用意していないが用意すべきかもしれない ※Skeletonの定義はよくわかってない ※[\skeleton\hand\left]がクリックで選択しても選択できない時があった。何かの拍子に選択できた。プルダウンでright/left切り替えてたらか・・・?選択できないAction削除して再作成したりもした。 ※上手くいかない場合、Advanced SettingsからDelete generate input folderして再度generateしてみたり、プロジェクトを再作成する… ※振動させる場合はoutでvibrationの出力を一つ作っておく。 1.4.一旦「Save and generate」ボタンで生成する 1.5.「Open binding UI」ボタンを押して、ブラウザの画面へ ※ここでブラウザに何も表示されない場合、Actionの設定が誤ってる(コンパイルエラーしてる?っぽい)場合がある。 1.6.現在のバインドの「編集」を押して編集画面に入る ※ここで、上部のタブに自分で追加したActionSetの名前が表示されてなかったら何か間違ってるかミスってるかバグ 1.7.追加したActionSetを選択して、後は各部の使用方法をそれっぽいのを選んでActionを設定していく。ここで何故かアクションが出ない場合、ActionのType指定とか誤ってるかもしれない。 1.8.一通り設定したらデフォルトバインドの置換を実行する? ※ソースコードから察するともしかするといらない可能性もあるなぁ… 1.9.ブラウザの設定画面とSteamVR Inputの画面を閉じる 2.入力値を画面に出す 2.1.適当なシーンを作成 2.2.「SteamVR」→「Prefabs」から[CameraRig]をSceneにドロップして配置する 2.3.カメラから見える位置に 3D Text オブジェクトでも浮かべておく 2.4.適当なAssetsディレクトリを掘ってC#の新規スクリプトを作成。参考サイトの「SteamVR Plugin 2.0のコントローラーの入力系の覚え書き」のソースコードをもとにデバッグ文成形処理を記述する。 ほぼコピペ、3点変更してある 「入力取得方法2 右手」の処理はどうも__actions_系が無さそうな雰囲気なのでコメントアウト+Text2も削除 Text1は 3D Text配置したのでTextMeshにした。表示できれば何でも良い start()内のActivatePrimaryは2.2.0で削除されてるようなので、カンで「myAction.Activate(SteamVR_Input_Sources.Any);」にした。 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using Valve.VR; public class MyInput MonoBehaviour{ //取得する手(右手か左手か任意の手) public SteamVR_Input_Sources handType; //default以外のActionSetを取得する public SteamVR_ActionSet myAction; //入力取得方法1定義 public SteamVR_Action_Single Trigger; public SteamVR_Action_Boolean Trigger_Touch; public SteamVR_Action_Single Grip; public SteamVR_Action_Vector2 JoyStick; public SteamVR_Action_Boolean JoyStick_Touch; public SteamVR_Action_Boolean JoyStick_Click; public SteamVR_Action_Boolean Button_X; public SteamVR_Action_Boolean Button_X_Touch; public SteamVR_Action_Boolean Button_Y; public SteamVR_Action_Boolean Button_Y_Touch; public SteamVR_Action_Boolean Button_A; public SteamVR_Action_Boolean Button_B; public TextMesh text1; void Start() { //default以外のActionSetを取得できるように設定 //myAction.(true); myAction.Activate(SteamVR_Input_Sources.Any); } void Update() { string output = ""; //左手の値を取得するように設定 handType = SteamVR_Input_Sources.LeftHand; //入力取得方法1 左手 //Vector1,2,3は変数名.GetAxisで取得 output += "Trigger = " + Trigger.GetAxis(handType) + "\n"; //booleanは変数名.GetStateで取得 output += "Trigger_Touch = " + Trigger_Touch.GetState(handType) + "\n"; output += "Grip = " + Grip.GetAxis(handType) + "\n"; output += "JoyStick = " + JoyStick.GetAxis(handType) + "\n"; output += "JoyStick_Touch = " + JoyStick_Touch.GetState(handType) + "\n"; output += "JoyStick_Click = " + JoyStick_Click.GetState(handType) + "\n"; output += "Button_X = " + Button_X.GetState(handType) + "\n"; output += "Button_X_Touch = " + Button_X_Touch.GetState(handType) + "\n"; output += "Button_Y = " + Button_Y.GetState(handType) + "\n"; output += "Button_Y_Touch = " + Button_Y_Touch.GetState(handType); text1.text = output; output = ""; //右手の値を取得するように設定 handType = SteamVR_Input_Sources.RightHand; //入力取得方法2 右手/* #region Input_2 output += "Trigger = " + SteamVR_Input.__actions_myinput_in_Trigger.GetAxis(handType) + "\n"; output += "Trigger_Touch = " + SteamVR_Input.__actions_myinput_in_Trigger_Touch.GetState(handType) + "\n"; output += "Grip = " + SteamVR_Input.__actions_myinput_in_Grip.GetAxis(handType) + "\n"; output += "JoyStick = " + SteamVR_Input.__actions_myinput_in_JoyStick.GetAxis(handType) + "\n"; output += "JoyStick_Touch = " + SteamVR_Input.__actions_myinput_in_JoyStick_Touch.GetState(handType) + "\n"; output += "JoyStick_Click = " + SteamVR_Input.__actions_myinput_in_JoyStick_Click.GetState(handType) + "\n"; output += "Button_A = " + SteamVR_Input.__actions_myinput_in_Button_A.GetState(handType) + "\n"; output += "Button_B = " + SteamVR_Input.__actions_myinput_in_Button_B.GetState(handType); text2.text = output; */ }} 2.5.作成したスクリプトを適当に空オブジェクトを作って貼り付け 2.6.スクリプト貼り付けたオブジェクトクリックして、スクリプトのパブリック変数を全部インスペクターウインドウで埋める。 ※プルダウンからそれらしい名前のを一通り選択するだけでいい。myActionは作成したActionSet名を指定する。 ※テキストオブジェクトだけ貼り付けた3D Textなどをドロップして設定してやる とりあえず値が取れてるのでヨシ 謝辞 本ページ内で使用されているUnity-Chan!は以下の著作・ライセンスの元使用しています。 © Unity Technologies Japan/UCL http //unity-chan.com/contents/license_jp/
https://w.atwiki.jp/mcforum/pages/47.html
Engram
https://w.atwiki.jp/mcforum/pages/103.html
目次 できたもの 前提 Windows向けビルドプロジェクト設定 ビルドする WebGL向けビルドプロジェクト設定 公開方法 できたもの プレイアブル:Github Page 公開ページ https //ecolight15.github.io/akane_clicker_web/ 前提 Unity クリッカーゲームを作ってみたい/10-もっと音を増やしたいの続き Windows向けビルド + 詳細を開く プロジェクト設定 Edit → Project Settings... でプロジェクト設定ウインドウを開く Player から Company Name, Product Name, Version 等設定する Resolution and Presentation 必要に応じて Fullscreen Mode は解除し、Windowed に変更する。 解像度設定も入力する ウインドウ枠を掴んで任意のサイズに変更可能にする場合には Resizable Window のチェックを入れる Alt + Enter 等でのフルスクリーン切り替えを許可する場合は「Allow Fullscreen Switch」のチェックを入れる Splash Image ゲーム開始時に表示されるメーカーロゴ等の設定を実施する Preview ボタンを押すと動作を確認できる Logos で任意のロゴが追加できる。 Unity のロゴは、無償版では削除不可 ビルドする File → Build Settings... でビルド設定を開く PC, Mac Linux Standalone にユニティアイコンが付いていることをチェック ついていない場合は、右下にSwitch Platform ボタンが表示されているので押して切り替える 上部のシーン一覧で必要なシーンを全て選択 Build And Run ボタンでフォルダ選択ダイアログが表示されるので、一式が格納される空ディレクトリを選択する アプリケーションの作成と実行確認ができる WebGL向けビルド + 詳細を開く プロジェクト設定 概ねWindowsアプリビルドの方法と同じなので省略 Project Settings の WebGL のタブで WebGL 向けの設定画実施できる Publish Settings Compression Format で圧縮形式の変更ができるが、もしGithub Page で公開する場合、BrotliやGZipに対応していないため Disable にすること。 WebGLのビルド画面でビルドできる Code Optimization で成果物 Size 優先でビルドするかビルド Speed 優先にするか選択できる。 プロジェクトの内容によっては Size のほうが速度もサイズも早くて小さくなることもあるとのこと。 公開方法 UnityRoom での公開 https //unityroom.com/ 要ユーザー登録 Github Page での公開 Github にコミットpushするだけで、WEB UI上からプレイできる形で公開が可能 Github Page の使い方の詳細はGoogleで検索すること 前述の Project Settings で Compression Format を Disable にしないと動作しなかったのを確認済み。 プロジェクトのディレクトリ名は保持したまま、ディレクトリごとアップロードする必要がある index ページの内容はWEB GLプレイヤーの記述を保持すれば書き換えは可能
https://w.atwiki.jp/mcforum/pages/35.html
STAR DUST INDUSTRIES ようこそ、スターダストインダストリーズへ! 当社では各種宇宙船、宇宙機、タレット、人工衛星、宇宙ステーションモジュールの開発、販売を行っています。 宇宙ステーション 当社が所有する宇宙ステーションの一覧です。 Station GUNMA (権限放棄) Station TOKYO (本社) Station CHIBA 製品 宇宙船 輸送機 小型輸送機 SDI-LC SerieseSDI-LC10 Light Carrier SDI-LC20 Light Carrier SDI-LFC10 Light Fighting Carrier SDI-LFC20 Light Fighting Carrier 大型輸送機 SDI-HC SeriesSDI-HC100 Garbage Collector SDI-HC201 Garbage Collector II SDI-HC210 Garbage Collector II SDI-HC211 Garbage Collector II Armed タレット アンチマターキャノンタレット SDI-TAC SerieseSDI-TAC21 Antimatter Cannon Turret SDI-TAC22 Antimatter Cannon SDI-TAC30 Long Antimatter Cannon Turret 人工衛星 防衛衛星 SDI-DSAT SerieseSDI-DSAT100 Defense Sat 宇宙ステーションモジュール トーラス型宇宙ステーションモジュール SDI-SSMT SerieseSDI-SSMT300 Small Torus 3 Arms SDI-SSMT400 Small Torus 4 Arms SDI-SSMT500 Small Torus 5 Arms その他 (開発中) 宇宙用コンテナ SDI-SPC Seriese ぷちえこ SDI-PuttiEco SerieseSDI-PuttiEcoTurret100 SDI-PuttiEcoKai100 SDI-PuttiEcoKai100withAI 開発
https://w.atwiki.jp/mcforum/pages/79.html
目次 参考 環境 前提 1.とりあえずUnityにモデルを読み込む。詳細な内容は本項では除外する。 2.とりあえずRigidbodyやcolliderを持ったPlayerの下にモデルを配置。 3.モデルをVRヘッドセット、コントローラーに同期させる 4.モデルの状態確認に便利な鏡を用意する。 5.せっかくなので指も動かしたい 参考 モデル作成からUnityへの取り込みまでhttps //www59.atwiki.jp/mcforum/pages/59.html OculusTouchとモデルを連動させるhttp //megamin.jp/?p=2226 【Unity】Oculus RiftとFinalIKを使ってUnityちゃんになる。https //qiita.com/nyu___nS/items/b4658afc849f8906afb0 Unity3D ライトを特定のオブジェクトのみに当てるhttp //narudesign.com/devlog/unity3d-light-culling-mask/ Oculus TouchでUnityちゃんの指を動かして遊ぼうhttp //eyln.hatenablog.com/entry/2016/12/19/003435 環境 Unity 2019.1.0f2 SteamVR Plugin 2.2.0 Unity VRゲームを作ってみたい/05-SteamVR ものを掴んで投げてみる の続き 前提 有償Assetの FinalIK 利用 Oculusの操作系は無理やりSteamVRのAPIで再実装する 1.とりあえずUnityにモデルを読み込む。詳細な内容は本項では除外する。 1.1.詳細は本wikiのVRChatのページで https //www59.atwiki.jp/mcforum/pages/59.html 2.とりあえずRigidbodyやcolliderを持ったPlayerの下にモデルを配置。 2.1.Cameraとか余計なものがモデルに含まれてたらチェックを外すなりして無効化すること。Colliderとモデルが重なるようにする。 2.2.まずは静止状態のモデルにする2.2.1.AssetStore からIdle MoCapを入手、インポートする 2.2.2.Projectで適当な所に、[Create]→[Animator Controller]を作成 2.2.3.Animator Controllerをダブルクリックなりで開き、ここに [Idle MoCap]→[Animations]の[Idle_Stance_02_MB_v01]あたりをドロップする 2.2.4.ヒエラルキーからモデルを選択し、Animatorコンポーネントを追加。先程作成したAnimator ControllerをControllerに設定する。 棒立ちちゃん 3.モデルをVRヘッドセット、コントローラーに同期させる 3.1.SteamVRのPlayerオブジェクト配下にある[SteamVRObjects]の[LeftHand]と[RightHand]の下にそれぞれ空のオブジェクトを作成し、分かりやすい名前にしておく。 ※なおRightHandやLeftHandのUse Hover Sphereで表示される緑色のワイヤーフレームの球体の位置がコントローラーの中心位置のようなのでここに合わせると良い。 3.2.同様にPlayerが持つ[FollowHead]に空のオブジェクトを作成し、分かりやすい名前にしておく。 3.3.Assetストアからおもむろに有償Assetの FinalIK を導入、インポートする 3.4.モデルに[Assets]→[Plugins]→[RootMotion]→[FinalIK]→[IK Components]の[VR IK]を設定する 3.5.VR IKのインスペクターの設定で、[Spine]と[Left Arm]と[Right Arm]のそれぞれのHead Targetに、先程3.1.と3.2.で作成した空オブジェクトを指定する。 3.6.この時点で概ね動くと思われるが、あとはひたすらオブジェクト間の親子関係と相対位置の調整、カメラ位置の調整などを実施する。手のひらの向きが同期していなかったらLeftHandやRightHandに作成た空オブジェクトのRotateを調整しよう。※もう少し自動でなんとかしてくれる何かがあるような気もするが… 3.7.足の動き周りは、VR IKの[Locomotion]あたりを弄ると若干まともになる・・・・かも。以下の画像は今回試したケースでの値だが、モデルの特性によって異なるはずなので要調整。 4.モデルの状態確認に便利な鏡を用意する。 4.1.適当な鏡にするPlaneを配置 4.2.適当に鏡に写す内容を撮影するカメラを配置 4.3.Projectに適当に[Render Texture]を新規作成、Sizeの値が解像度になるのでちょっと上げておく。 4.4.設置したCameraを選択し、インスペクターの[Camera]の[Target Texture]に先程作成したRender Textureを指定する。 4.5.同じくCameraのインスペクターでAudioListenerを無効化、TargetEyeはNoneにしておく。※VRのカメラと競合するため 4.6.あとはProjectから先程作成したRender Textureを、ヒエラルキーの先程作成したPlaneにドロップで適用して完了。 4.7.光の当たり具合でPlaneに映る映像が暗くなってしまう場合があるので、自分はセットでDirectionalLightを設置し、専用のレイヤーを割り当てて周りには影響しないように設定した。 本当はシェーダー設定でUnlitに設定するらしい 5.せっかくなので指も動かしたい 5.1.参考サイトのスクリプトをお借りして、モデルに適用する Oculus TouchでUnityちゃんの指を動かして遊ぼうhttp //eyln.hatenablog.com/entry/2016/12/19/003435 5.2.なお機能の全容を理解しないままにSteamVRのAPIに変更したため、機能を損ねている可能性が高い…が一応ソースコードを載せておく。 using System.Collections;using System.Collections.Generic;using UnityEngine;using Valve.VR; // OculusFinger Ver.0.21 - zlib License// (C) NISHIDA Ryota, ship of EYLN http //dev.eyln.com // 流用元// -Oculus TouchでUnityちゃんの指を動かして遊ぼう// --http //eyln.hatenablog.com/entry/2016/12/19/003435 // 更にSteamVR2.2.0のInputAPI向けに変更したが、既存機能の理解ができていないため機能を損ねている可能性あり。自分でつくろう(白目) public class FingerController MonoBehaviour{ public SteamVR_Input_Sources handType; public SteamVR_ActionSet myAction; public SteamVR_Action_Single Trigger; public SteamVR_Action_Boolean Trigger_Touch; public SteamVR_Action_Single Grip; public SteamVR_Action_Vector2 JoyStick; public SteamVR_Action_Boolean JoyStick_Touch; public SteamVR_Action_Boolean JoyStick_Click; public SteamVR_Action_Boolean Button_X; public SteamVR_Action_Boolean Button_X_Touch; public SteamVR_Action_Boolean Button_Y; public SteamVR_Action_Boolean Button_Y_Touch; public SteamVR_Action_Boolean Button_A; public SteamVR_Action_Boolean Button_A_Touch; public SteamVR_Action_Boolean Button_B; public SteamVR_Action_Boolean Button_B_Touch; [TooltipAttribute("Awake時に現在のFingerTypeにあわせて自動設定を行うか")] public bool isAwakeAutoSetup = true; [TooltipAttribute("Oculus Touchによるタッチ入力を有効にするか")] public bool isEnableTouchControl = true; public enum FingerType { Custom, // 独自設定 Auto, // Awake時に指の名前から自動的設定 L_Thumb, // 左手親指 L_Index, // 左手人差し指 L_Middle, // 左手中指 L_Ring, // 左手薬指 L_Little, // 左手小指 R_Thumb, // 右手親指 R_Index, // 右手人差し指 R_Middle, // 右手中指 R_Ring, // 右手薬指 R_Little, // 右手小指 } [TooltipAttribute("指のタイプ")] public FingerType fingerType = FingerType.Auto; [HeaderAttribute("Oculus Touch Settings")] [TooltipAttribute("触れると指を半分曲げる近接センサーボタン類")] public List SteamVR_Action_Boolean touchButtonPool; [TooltipAttribute("握ると指を曲げるトリガー(touchButtonPool指定時は半分~最後まで)")] public SteamVR_Action_Single trigger = null; [Range(0, 0.99f), TooltipAttribute("トリガーを使うとき、指を曲げ始める開始位置")] public float triggerStart = 0.0f; [TooltipAttribute("触れていてなおかつトリガーを少し曲げたときに指を半分曲げる近接センサーボタン")] public SteamVR_Action relatedTouchButton = null; [HeaderAttribute("Joint Settings")] [SerializeField, TooltipAttribute("根本から指先につながっていく関節を設定(未指定のときAwakeで自動設定)")] private List Transform jointPool; [SerializeField, TooltipAttribute("各関節が根本の角度に対してどの割合で曲がるかを設定(未指定のときAwakeで自動設定)")] private List float jointLevelPool; private List Quaternion jointBaseRotPool; // 各関節の初期姿勢(Awake時に自動記憶) [HeaderAttribute("Finger Angle")] [TooltipAttribute("指関節の回転軸")] public Vector3 axis = Vector3.up; [TooltipAttribute("現在の回転角度(実行時に動的に変わる)")] public float angle = 0.0f; [TooltipAttribute("最大の回転角度")] public float maxAngle = 90.0f; [Range(0, 1), TooltipAttribute("指を開くときの補間の速さ")] public float openLerpLevel = 0.3f; [Range(0, 1), TooltipAttribute("指を閉じるときの補間の速さ")] public float closeLerpLevel = 0.15f; [TooltipAttribute("親指か(親指を立てられるようにするか)")] public bool isThumb = false; private bool isThumbsUp = false; // 親指を立てているか void Awake() { if (isAwakeAutoSetup) { AutoSetup(); } jointBaseRotPool = new List Quaternion (); foreach (Transform joint in jointPool) { jointBaseRotPool.Add(joint.transform.localRotation); } } // 現在のFingerTypeにあわせて各種設定を自動設定(コンポーネントのメニューからも実行可能) [ContextMenu("Automatic Setup")] void AutoSetup() { AutoSetupJoint(); SetupFingerType(fingerType); } // 指の根本にOculusFingerコンポーネントをつけたとして、その子供の最初にあるものを // 順に関節として、末端の前まで自動設定する(手動設定済みの場合はそのまま) // あわせて、関節を曲げる量も個別に設定可能にする void AutoSetupJoint() { if (jointPool.Count = 0) { Transform t = transform; while (t t.childCount 0) { jointPool.Add(t); jointLevelPool.Add(1.0f); t = t.GetChild(0); } } } // GameObjectの名前が指の名前のとき指タイプとボタンや回転軸を自動設定 void AutoSetupFingerType() { FingerType type = FingerType.Custom; string name = transform.name.ToLower(); string[] typeNames = { "thumb", "index", "middle", "ring", "little" }; int typeIndex = (int)FingerType.L_Thumb; if (name.IndexOf("right") = 0) { typeIndex = (int)FingerType.R_Thumb; } for (int i = 0; i typeNames.Length; i++) { if (name.IndexOf(typeNames[i]) = 0) { type = (FingerType)(typeIndex + i); break; } } SetupFingerType(type); } void Start() { myAction.Activate(SteamVR_Input_Sources.Any); } void Update() { if (!isEnableTouchControl) return; // Oculus Touchの近接センサー付きボタンを指定していて、触れていたら指を半分曲げる float touchLevel = 0.0f; foreach (SteamVR_Action_Boolean touch in touchButtonPool) { if (touch.GetState(handType)) { touchLevel = 0.5f; break; } } // 近接センサーを指定していて、なおかつ(この指の)トリガーを少しでもひいていたら指を半分曲げる bool isRelatedTouch = false; if (relatedTouchButton != null relatedTouchButton is SteamVR_Action_Boolean) { if (((SteamVR_Action_Boolean)relatedTouchButton).GetState(handType)) { if ((trigger != null) trigger.GetAxis(handType) 0.1f) { isRelatedTouch = true; } } } if (isRelatedTouch) touchLevel = 0.5f; // 近接センサーに触れてるか、近接センサーを指定していないとき、トリガーで曲げる if (touchLevel 0.0f || touchButtonPool.Count = 0) { float triggerLevel = 0; if (trigger != null) triggerLevel = (trigger.GetAxis(handType) - triggerStart) / (1 - triggerStart); triggerLevel = Mathf.Clamp01(triggerLevel); if (touchLevel 0.0f) { triggerLevel *= 0.5f; } // 近接センサーを使っているときは残りをトリガーで曲げる touchLevel += triggerLevel; } // 親指のとき、(中指、小指などの)指定のトリガーを引いていて、(親指の)近接センサーから指が離れていたら親指を立てるモードにする isThumbsUp = false; if (trigger != null) isThumbsUp = (isThumb touchLevel = 0.05f trigger.GetAxis(handType) triggerStart); if (isThumbsUp) { touchLevel = -0.5f; } // 指を補間量にあわせて補間 float lerpLevel = (touchLevel = 0.0f) ? openLerpLevel closeLerpLevel; if (touchLevel 0.0f touchButtonPool.Count 0 trigger != null trigger.GetAxis(handType) 0.1f) { lerpLevel *= 0.5f; } // ちょっと近接センサーに触れただけのときはゆっくり補間する angle = Mathf.Lerp(angle, maxAngle * touchLevel, lerpLevel); } void LateUpdate() { if (jointPool.Count != jointBaseRotPool.Count jointPool.Count != jointBaseRotPool.Count) { Debug.LogError("jointData Error."); return; } // 指の角度にあわせて各関節の姿勢を決定 for (int i = 0; i jointPool.Count; i++) { Transform joint = jointPool[i]; float jointLevel = jointLevelPool[i]; if (isThumbsUp) { jointLevel = 0.5f - i * 0.1f; } float rot = angle * jointLevel; Quaternion jointBaseRot = jointBaseRotPool[i]; joint.localRotation = jointBaseRot * Quaternion.AngleAxis(angle * jointLevel, axis); } } // 指タイプにあわせてボタンや回転軸を自動設定 // (キャラクターによって調整が必要な場合は下記内容を書き換えるか、Inspector上で手動設定する) void SetupFingerType(FingerType type) { this.fingerType = type; if (type == FingerType.Custom) return; if (type == FingerType.Auto) { AutoSetupFingerType(); return; } touchButtonPool.Clear(); relatedTouchButton = null; triggerStart = 0.0f; axis = new Vector3(0.8f, 0.1f, 0f); isThumb = false; switch (fingerType) { case FingerType.L_Thumb touchButtonPool.Add(JoyStick_Touch); touchButtonPool.Add(Button_X_Touch); touchButtonPool.Add(Button_Y_Touch); trigger = Trigger; axis = new Vector3(0.4f, 0.5f, 0.5f); isThumb = true; break; case FingerType.L_Index trigger = Trigger; triggerStart = 0.5f; relatedTouchButton = Trigger_Touch; axis = new Vector3(1f, 0.1f, 0f); break; case FingerType.L_Middle trigger = Grip; triggerStart = 0.95f; break; case FingerType.L_Ring trigger = Grip; triggerStart = 0.1f; break; case FingerType.L_Little trigger = Grip; break; case FingerType.R_Thumb touchButtonPool.Add(JoyStick_Touch); touchButtonPool.Add(Button_A_Touch); touchButtonPool.Add(Button_B_Touch); trigger = Trigger; axis = new Vector3(0.1f, 0.5f, 0.4f); isThumb = true; break; case FingerType.R_Index trigger = Trigger; triggerStart = 0.1f; relatedTouchButton = Trigger_Touch; axis = new Vector3(1f, 0.1f, 0f); break; case FingerType.R_Middle trigger = Grip; relatedTouchButton = Trigger_Touch; triggerStart = 0.95f; break; case FingerType.R_Ring trigger = Grip; triggerStart = 0.1f; break; case FingerType.R_Little trigger = Grip; break; } if (jointLevelPool.Count = 3) { float[,] levels = { { 0.05f, 0.5f, 0.9f }, // 親指 { 0.9f, 1.0f, 1.2f }, // 人差し指 { 1.0f, 0.8f, 1.6f }, // 中指 { 1.0f, 0.7f, 1.6f }, // 薬指 { 1.0f, 0.7f, 1.6f } // 小指 }; int fi = (int)fingerType; int levelType = (fi = (int)FingerType.R_Thumb) ? fi - (int)FingerType.R_Thumb fi - (int)FingerType.L_Thumb; jointLevelPool[0] = levels[levelType, 0]; jointLevelPool[1] = levels[levelType, 1]; jointLevelPool[2] = levels[levelType, 2]; } }} 5.3.モデルのbody部を開いていって、各指の根本のオブジェクトに対して作成したControllerのスクリプトを適用する。HandTypeは右手と左手をそれぞれ設定、他は全部アクションを入れとく(これAction系の設定自動で取れないかな・・・取れるよな・・・まぁいいか) とりあえず、なんとなくバ美肉した気分になれる程度にはできたのでこの辺にしておく。 気になるのは、かがむと顔の位置がずれてカメラに写り込んでしまったり、相変わらずプレイエリアごと回転させてるもんで旋回時に位置がずれるのが気になるが・・・ モデルの貫通で何が怖いって、カメラが顔に貫通するのが顔の内側的な意味で怖いな・・・