約 4,392 件
https://w.atwiki.jp/mcforum/pages/94.html
目次 できたもの 前提 素材集め 背景映像を貼りつける クリックした回数を表示するカウンタを実装する仕様 キャンバスとテキストラベルを配置するキャンバスの配置 テキストラベルの配置 TextMeshProを使用する場合の追加作業 テキストラベルの設定 テキストを更新するスクリプトを実装する仕様 ICounterReceiver インタフェース CounterTextController クラス GameController クラス Click クラスの変更点 できたもの 前提 Unity クリッカーゲームを作ってみたい/02-茜ちゃんをクリックしたら葵ちゃんを散らせるの続き 素材集め + 詳細を開く 権利を確認しながら素材を集める。 とりあえず何らかの背景素材 和風なループする背景(ピンクの花柄) https //commons.nicovideo.jp/material/nc149772 利用許可範囲:インターネット全体に許可 営利利用:営利利用可能 あとカウンタ表示にデフォルトのフォントはイマイチな気がしたのでフォントを探してimportしておく。 Selected U3D Japanese Font https //assetstore.unity.com/packages/2d/fonts/selected-u3d-japanese-font-337 License agreement Standard Unity Asset Store EULA https //unity.com/legal/as-terms Extension Asset One license required for each individual user. ベースはM+Fontでreadme/license文書が同梱 https //mplusfonts.github.io/ 背景映像を貼りつける + 詳細を開く ヒエラルキーで VideoPlayer を追加 背景videoは適当にAssetsに入れてあるものとする video playerに背景videoファイルを登録して各種設定を実施 Video Clip Assetのvideoファイルをドロップして登録 Loop ループ素材なのでチェックを入れる Render Mode 背景として流すので"Camera Far Plane" を選択 Camera ヒエラルキーの Main Camera をドロップして登録する Aspect Ratio 画面の縦横サイズが変わっても背景映像以外が映らないよう"Fit Outside"にしておく。 Scene再生ボタンを押して映像が背景に流れていればOK クリックした回数を表示するカウンタを実装する 仕様 + 詳細を開く カウンタは画面左上に配置するものとする。 画面サイズが変更されても同じ位置にあって欲しい。 クリックしたらクリック回数の数値を更新表示する。 キャンバスとテキストラベルを配置する + 詳細を開く キャンバスの配置 まずはヒエラルキーにCanvasを設置する これにより、カメラ(初期設定ではdisplay)に追従するUIの設置場所ができる 初期設定のままでもUI設置は可能だが、設置UIがカメラ座標に追従するよう設定を変更する。 Canvas設定の Render Mode を "Screen Space - Camera" に変更する。 Render Camera に ヒエラルキーから Main Camera をドロップして登録する。 これにより設置UIにColliderをつけた場合にUI以外のオブジェクトとの接触判定が取れるようになる。 ※Canvas上でのColliderは次回利用する テキストラベルの配置 クリック数カウントを表示するテキストオブジェクトをCanvasに設置する ヒエラルキーからCanvasを右クリックしてUIのTextMeshProを追加する。 見た目を弄りたいだけなので、ただのTextでも良い TextMeshPro使用する場合は TMP Importer が表示されるので、Import TMP Essentials ボタンでインポートする。 TextMeshProを使用する場合の追加作業 フォントを変換してTextMeshProで利用できる形式にする UIで通常のTextを使う場合はこの作業は不要 + 詳細を開く メニューから TMP の Font Asset Creator を開く 表示されたCreatorで、変換したいフォントのttfファイルを選ぶ 英数字記号のみ変換する場合はそのまま Generate Font Atlas ボタンを押す このとき元のフォントに含まれていない文字は変換に失敗する(詳細は下部のレポートに表示される) それ以外、例えば日本語等が必要な場合には Charactor Set を "Custom Characters" に変更し、表示されたテキストボックスに変換する文字を全て記入しておく。 Select Font Asset で適当なFont Assetを選択しておくと、既存の他のFontAssetで対応している文字がCustom Character Listにインポートされるので、それに追加で必要な文字を入れていく。なければ手動で必要な物を入れていく。 変換は同様に Generate Font Atlas ボタンを押すこと。 ウインドウサイズを広げると、生成後の文字列が表示される。 生成した文字がぼやけている場合は Atlas Resolution の数値を上げること。 Saveを押すと保存ダイアログが表示されるので、Asset/Fonts 等適当なディレクトリを作成して保存する。 メモ Canvas Scaler の UI Scale Mode を Scale With Screen Size 等に変更すると Canvas に配置した各アイテムが画面サイズに応じて自動でスケールする。 このとき Text Mesh Pro の文字の周りに文字色に近い色で枠ができてしまう事があるが、これはTMPの Face→Dilate を -1 に、Debug Settings の Sharpness を最大値(1)に設定すると改善するが、文字に対するエフェクトが掛からなくなってしまうので注意 Sharpness だけ 1 にして、Dilate を -0.5 ぐらいにすると妥協できるかも テキストラベルの設定 TextのインスペクターからRect TransformのAnchor Presetsを選択する。 今回はCanvas(Camera)の左上に張り付かせたいのでtop/leftを選択する。 これで画面サイズを変更した場合も、テキスト座標は左上を基準に自動で調整される。 初期表示するテキストを配置する テキストボックスに表示文字列を入力する 文字数が増えて幅や高さが大きくなった場合、どの方向に拡張されるかはAlignmentの設定で調整すること。 Font Asset に Font Asset Creator で作成した Font Asset を指定する。 もし通常の Text の場合は Font の設定で ttf ファイル等を選択する Vertex Colot (Textの場合は Color)でフォントの色を指定する。 背景画像や映像を用いている場合は、それにあった色にする。 テキストを更新するスクリプトを実装する + 詳細を開く 仕様 今回はカウンタ値を使用するのはテキストラベルだけであるが、今後カウンタ値を使用する機能が増える事を見越して以下の仕様で実装する。 Sceneを跨ぐ永続オブジェクトにゲーム全体で使用する値(今回のカウンタ値など)を持たせる。 GameController クラス/オブジェクトとし、ヒエラルキーのルートに配置する。 クリックした場合、GameController にカウンタ値のインクリメントを指示する GameController へは public List を用いてカウンタ値を利用するクラスオブジェクトの登録を行う。 ※将来的に動的に登録する関数を設けるかどうかは検討する。 GameController はカウンタ値を利用するクラスオブジェクト全てに更新値を通知する。 ICounterReceiver インタフェースを作成して、GameControllerはリスト管理する。 ICounterReceiver インタフェースを持つクラスは 1 オブジェクト 1 クラスまでとする。(インスペクターのリスト表示がGameObjectで登録するため) ICounterReceiver インタフェースは仮想関数として UpdateCounter 関数を持ち、継承先で実装する。 GameController は通知の際に、リスト保持する全てのオブジェクトの UpdateCounter 関数を呼び出す。 テキストラベルに持たせるクラスは ICounterReceiver インタフェースを実装する CounterTextController クラスとする。 ICounterReceiver インタフェース UpdateCounter 関数定義を持つ。 public interface ICounterReceiver{ public void UpdateCounter(int count);} CounterTextController クラス テキストラベル(Canvasに作成した Text(TMP))にコンポーネントとして登録する。 using UnityEngine;using TMPro; public class CounterTextController MonoBehaviour, ICounterReceiver{ TextMeshProUGUI tmp; void Start() { tmp = gameObject.GetComponent TextMeshProUGUI (); } public void UpdateCounter(int count) { tmp.text = count + " あおい~"; }} GameController クラス ヒエラルキーの最上位の階層に空のオブジェクトを持たせ、本クラスをコンポーネントとして持たせる。 起動時に永続化オブジェクトに設定される シーンを跨いで2つ目が生成された場合には新しい方は破棄するシングルトン構造。 using System.Collections.Generic;using UnityEngine; public class GameController MonoBehaviour{ public static GameController instance; // カウンタの通知を受けるオブジェクトのリスト(インスペクターより登録) public List GameObject counterReceivers; int clickCount; void Awake() { // シーンを跨いでGameControllerがいた場合用にシングルトン実装 if (instance == null) { instance = this; } else { Destroy(gameObject); } } void Start() { // オブジェクトを永続化 DontDestroyOnLoad(gameObject); } public void IncrementCount() { // カウンタをインクリメントして、登録オブジェクト全てに通知 clickCount++; foreach (GameObject obj in counterReceivers) { ICounterReceiver receiver = obj.GetComponent ICounterReceiver (); if (receiver != null) { receiver.UpdateCounter(clickCount); } } }} GameControllerのインスペクターで、カウンタ値の通知先であるテキストラベルのオブジェクトをリストに登録する。 Click クラスの変更点 前の記事からの増分は GameController の保持とインクリメント依頼の行のみ。 using System.Collections;using System.Collections.Generic;using UnityEngine; public class Click MonoBehaviour{ // 生成するprefab を簡単に差し替えできるよう public で外部から変更できるようにしておく public GameObject prefab; // 速度は適切な速度を探れるように、publicで外部から変更できるようにしておく public float prefabSpeed = 1000; public float prefabTorque = 300; Animator anime; GameController controller; void Start() { anime = GetComponent Animator (); controller = GameObject.FindObjectOfType GameController (); } void Update() { if (Input.GetMouseButtonDown(0)) { anime.SetTrigger("click_cancel"); anime.SetTrigger("click"); // prefab からインスタンスを生成 GameObject aoi = Instantiate(prefab, gameObject.transform.position, Quaternion.identity); Rigidbody2D aoiBody = aoi.GetComponent Rigidbody2D (); // 上方向のランダムな方向を決定 Vector2 direction = Random.insideUnitCircle.normalized; direction.y = Mathf.Abs(direction.y); // ランダムな回転速度を決定、整数にしたとき2で割り切れない場合は逆回転にする float torque = Random.value; if ((int)(torque*100) % 2 == 1) { torque *= -1; } // 生み出した葵ちゃんに力を与える aoiBody.AddForce(direction * prefabSpeed, ForceMode2D.Force); aoiBody.AddTorque(torque * prefabTorque, ForceMode2D.Force); // クリック数をインクリメントする controller.IncrementCount(); } }}
https://w.atwiki.jp/mcforum/pages/22.html
派閥について 派閥はメニューのFactionから操作でき、複数人で派閥を作り、他の派閥と同盟を組んだり戦ったり等が可能。 また、派閥の特権として惑星やステーションの拠点登録ができるようになり、他プレイヤーが手出しできない様になるので個人Faction作るのもあり。 最後の画像でBuildBlockについて書いているが、他にもShopModuleやストレージ(倉庫)何かも置くと拠点として大分活用できるようになるはず。 ちなみにShopは設置者の管理下に
https://w.atwiki.jp/mcforum/pages/95.html
目次 できたもの 前提 葵ちゃんが堆積する地面を用意する 葵ちゃんが積もるように壁を用意する 負荷軽減のため壁を貫通または上限に達した葵ちゃんを送還する できたもの 前提 Unity クリッカーゲームを作ってみたい/03-背景とカウンタを用意するの続き 葵ちゃんが堆積する地面を用意する + 詳細を開く 画面は可変サイズとする そこで、画面にスナップしているCanvasを利用する ヒエラルキーからCanvasに対して 2D Object の Sprites → Square を追加する Square を画面外下部少し離した位置に設置し、Scale を X=10000, Y=100 に設定し横に引き伸ばす 更に Polygon Collider 2D コンポーネントを追加する 画面下部との相対位置を維持するよう Rect Transform の Anchor Presets 設定で center/bottom を選択する 以上の設定で葵ちゃんが堆積するように 葵ちゃんが積もるように壁を用意する + 詳細を開く 地面をコピーして Scale を X=100, Y=10000 にして、両側に配置する。 左側の壁の Anchor Presets は left/middle 設定にする 右側の壁の Anchor Presets は right/middle 設定にする 負荷軽減のため壁を貫通または上限に達した葵ちゃんを送還する + 詳細を開く 白い壁と同じ要領で更に外側に赤い壁を作成し、それにぶつかった葵ちゃんは消えるようにする。 Sprite Renderer の Color でスプライト画像の色を変更し赤くしておく。 衝突検知のため、壁の Polygon Collider 2D の Is Trigger のチェックを入れておく。 これにより、Is Trigger 設定された壁はモノがぶつかることは無くなる代わりにScriptから検知が可能になる。 上側の天井は Anchor Presets を center/top にする 葵ちゃんにTriggerを検知して、自身のインスタンスを削除するスクリプトをつける Prefab を選択して作成したScriptをコンポーネント追加する。 Prefab のインスペクター表示した状態でスクリプトをドロップしても良い using UnityEngine; public class TriggerDestroy MonoBehaviour{ void OnTriggerEnter2D(Collider2D other) { Destroy(gameObject); }}
https://w.atwiki.jp/mcforum/pages/80.html
結論から言うと上手く行かなかったので保留 Unity 2019.1.0f2 SteamVR Plugin 2.2.0 Unity VRゲームを作ってみたい/06-SteamVR Humanoid形式のモデルを読み込んでバ美肉してみる の続き 考え:FinalIKのVRIK、自分の場合は頭の位置で自動で歩きモーションっぽいの付くけど、相手の手を自分の手に固定したら似たようなことができないか?
https://w.atwiki.jp/mcforum/pages/56.html
どんなゲーム? 酸素ゲー。 デュプリカント(複製人間)たちに指示を出してコロニーを維持するゲーム。 酸素の製造に始まり、食料の生産、それらを動かすための電力の生産等々を行っていく。 結構難易度高めなのでちょっと気を抜くと壊滅的打撃を受ける。 Steamにて2480円で配信中(執筆時)。 早期アクセスゲーム 現在開発中のゲームであるため、バグや急な仕様変更、最悪開発中止を覚悟してご購入ください。 公式サイト (英語) https //www.klei.com/games/oxygen-not-included Steamストア https //store.steampowered.com/app/457140/Oxygen_Not_Included/ 情報サイト Wiki (英語) https //oxygennotincluded.gamepedia.com/Oxygen_Not_Included_Wiki 日本語の情報サイトは散らばってるっぽいのでぐぐって 何かおすすめサイトあれば追記願います メモとか Oxygen Not Included/食料生産メモ その他 毎月大型アップデートが来る。 新機能や新仕様はうれしい反面、これまで安定してたコロニーが崩壊する恐れもある。 コミカルな絵柄でちょっと愛着がわく。アプデ内容に沿ったアニメもおすすめ。
https://w.atwiki.jp/mcforum/pages/39.html
開発資料 船体サイズ規格 SDI規格 エンハンサ構成 対応船体サイズ 外部規格 ドッキング可能な船の例 (x*y*z) (x*y*z) 0*0*0 7*7*7 SDIS-TC 超小型機 1*1*1 9*9*9 SDI-LC,SDI-LFC 1*1*2 9*9*11 SDIS-TB 超小型艇 1*1*3 9*9*13 SDIS-SC 小型機 3*1*3 13*9*13 1*1*4 9*9*15 1*1*5 9*9*17 こがたてい SDIS-MC 中型機 7*1*7 21*9*21 Isanth-VI 7*7*7 21*21*21 PuttiEco 8*1*8 23*9*23 kmp_F-01,kmp_A-01 SDIS-SB 小型艇 3*3*9 13*13*25 SDIS-LC 大型機 9*3*9 25*13*25 3*3*10 13*13*27 ちゅうがたてい SDIS-MB 中型艇 5*5*20 17*17*47 おおがたてい SDIS-SS 小型艦 9*9*30 25*25*67 こがたかん SDIS-LB 大型艇 16*16*40 39*39*87 SDI-HC SDIS-MS 中型艦 20*20*50 47*47*107 ちゅうがたかん 未定義の規格 SDI-LS 大型艦 参考情報 e ドッキングエンハンサの数 s 船のサイズ s = e * 2 + 7 SDI-HC200 37*21*87 - 適合エンハンサ 15*7*40
https://w.atwiki.jp/mcforum/pages/54.html
ソーラーパネルの消費電力表示、効率表示、あとざっくりとしたバー表示化、ついでに生産20000W以下になったらアラームなるようにした ソーラーパネルの値はまともに取れないので詳細情報から分解して持ってくる必要あり。 この手法、他のモジュールに転用できまくるのでは 復帰値は意味ない。 throw new Exception("異常内容コメ"); で異常終了させたほうが、コントロール画面に出力されて便利だぞ アラームは予め流す音選択して、時間MAXにしてブロックの電源OFFにしておく。 これをコマンドブロックに書いて、タイマーブロックから適当な秒周期で呼び出す。タイマーブロックに自身のタイマーブロックのstartアクション登録しておいてループ化。 作成 ecolight 第二版ソース Timerブロックから、Run指定でProgrammable blockを登録し、カンマ区切りでパラメータを渡してやると動作。 第一パラメタ ソーラーパネル名 第二パラメタ テキストパネル名(LCD,WideLCDも可) 第三パラメタ サウンドブロック名 第四パラメタ 適当な数値。この値以下の出力ワット数以下になった場合、第三パラメタで指定したサウンドブロックをON制御、ワット数以上になった場合はOFF制御する。 -... //------------------------------------------------------------------------------ // Main Function //------------------------------------------------------------------------------ void Main(string argument) { //-------------------------------------------------------------------------- // Config (argument paramater) //-------------------------------------------------------------------------- string[] settings = argument.Split(new string[] {","}, StringSplitOptions.None); // Solar Panel Name string solarName = settings[0]; // 1st param // Text Panel Name string panelName = settings[1]; // 2nd param // Buzzer string soundName = settings[2]; // 3rd param // Alart wat int threshold = int.Parse(settings[3]); // 4th param //-------------------------------------------------------------------------- // Load text panel //-------------------------------------------------------------------------- IMyTextPanel p = GetPanel(panelName); //-------------------------------------------------------------------------- // Get solar power //-------------------------------------------------------------------------- float max = GetSolarMaxPowerByName(solarName); float cur = GetSolarPowerByName(solarName); p.WritePublicText(" [INFO] Solar Power Monitoring\n", false); p.WritePublicText(" [INFO] MAX " + max + " W\n", true); p.WritePublicText(" [INFO] CUR " + cur + " W\n", true); //-------------------------------------------------------------------------- // Power generating efficiency //-------------------------------------------------------------------------- DrawIndicator(p, cur, 120000, "Generating efficiency"); //-------------------------------------------------------------------------- // Power consumption //-------------------------------------------------------------------------- DrawIndicator(p, cur, max, "Power consumption"); //-------------------------------------------------------------------------- // Load sound //-------------------------------------------------------------------------- IMySoundBlock sound = GetSound(soundName); //-------------------------------------------------------------------------- // Threshold alert //-------------------------------------------------------------------------- if (cur threshold) { On(sound); } else { Off(sound); } return; } //------------------------------------------------------------------------------ // Text Panel Cntrol Function //------------------------------------------------------------------------------ public IMyTextPanel GetPanel(string panelName) { // Load TextPanel IMyTextPanel p = GridTerminalSystem.GetBlockWithName(panelName) as IMyTextPanel; // check result if (p == null) { throw new Exception("Panel [ " + panelName + " ] not found." ); } // check type if (!(p is IMyTextPanel)) { throw new Exception("Panel [ " + panelName + " ] is invalid type."); } // result return p; } public void DrawIndicator(IMyTextPanel panel, float cur, float max, string title) { float per = cur / max; int cnt = (int) (per * 10); panel.WritePublicText("*** " + title + " ***\n [ ", true); for (int i = 0 ; i 10 ; i++) { if (cnt i) { panel.WritePublicText(" - ", true); } else { panel.WritePublicText(" = ", true); } } panel.WritePublicText(" ] " + (int)(per * 100) + " %\n", true); } //------------------------------------------------------------------------------ // Solar Panel Cntrol Function //------------------------------------------------------------------------------ public float GetSolarMaxPowerByName(string solarName) { return GetSolarMaxPower( GetSolar(solarName) ); } public float GetSolarPowerByName(string solarName) { return GetSolarPower( GetSolar(solarName) ); } public float GetSolarMaxPower(IMySolarPanel solar) { return GetWat(solar, 1); } public float GetSolarPower(IMySolarPanel solar) { return GetWat(solar, 2); } public IMySolarPanel GetSolar(string solarName) { // Load Solar IMySolarPanel s = GridTerminalSystem.GetBlockWithName(solarName) as IMySolarPanel; // check result if (s == null) { throw new Exception("Solar [ " + solarName + " ] not found." ); } // check type if (!(s is IMySolarPanel)) { throw new Exception("Solar [ " + solarName + " ] is invalid type."); } // result return s; } public float GetWat(IMySolarPanel solar, int line) { var detail = solar.DetailedInfo; string power = detail.Split(new string[] {"\n"}, StringSplitOptions.None)[line].Split( )[2]; string unit = detail.Split(new string[] {"\n"}, StringSplitOptions.None)[line].Split( )[3]; float value = Convert.ToSingle(power); if (unit == "kW") { value *= 1000; } return value; } //------------------------------------------------------------------------------ // Sound Cntrol Function //------------------------------------------------------------------------------ public IMySoundBlock GetSound(string blockName) { // Load Sound Block IMySoundBlock b = GridTerminalSystem.GetBlockWithName(blockName) as IMySoundBlock; // check result if (b == null) { throw new Exception("Sound [ " + blockName + " ] not found." ); } // check type if (!(b is IMySoundBlock)) { throw new Exception("Sound [ " + blockName + " ] is invalid type."); } // result return b; } //------------------------------------------------------------------------------ // Common Function //------------------------------------------------------------------------------ public void On(IMyTerminalBlock block) { block.GetActionWithName("OnOff_On").Apply(block); } public void Off(IMyTerminalBlock block) { block.GetActionWithName("OnOff_Off").Apply(block); } 初版ソース +... int Main(string argument) { //--------------------------------------------------------------------------------------------------- // Load TextPanel 2 IMyTextPanel p2 = GridTerminalSystem.GetBlockWithName("Text panel 2") as IMyTextPanel; // check result for PanelObject if (p2 == null) { return -1; } //--------------------------------------------------------------------------------------------------- // Load Solar IMySolarPanel s = GridTerminalSystem.GetBlockWithName("Solar") as IMySolarPanel; // check result for Thruster if (s == null) { p2.WritePublicText(" [ERROR] Solar Offline", false); return -2; } // check type if (!(s is IMySolarPanel)) { p2.WritePublicText(" [ERROR] invalid Solar", false); return -3; } //--------------------------------------------------------------------------------------------------- float max = GetPanelMaxPower(s) ; float cur = GetPanelPower(s); p2.WritePublicText(" [INFO] Solar Power Monitoring\n", false); p2.WritePublicText(" [INFO] MAX " + max + " W\n", true); p2.WritePublicText(" [INFO] CUR " + cur + " W\n", true); //--------------------------------------------------------------------------------------------------- // Power generating efficiency float per = cur / 120000; int per_i = (int) (per * 10); p2.WritePublicText("\n*** Generating efficiency ***\n [ ", true); for (int i = 0 ; i 10 ; i++) { if (per_i i) { p2.WritePublicText(" - ", true); } else { p2.WritePublicText(" = ", true); } } p2.WritePublicText(" ] " + (int)(per * 100) + " %\n", true); //--------------------------------------------------------------------------------------------------- // Power consumption per = cur / max; per_i = (int) (per * 10); p2.WritePublicText("\n*** Power consumption ***\n [ ", true); for (int i = 0 ; i 10 ; i++) { if (per_i i) { p2.WritePublicText(" - ", true); } else { p2.WritePublicText(" = ", true); } } p2.WritePublicText(" ] " + (int)(per * 100) + " %\n", true); //--------------------------------------------------------------------------------------------------- // Load Sound IMySoundBlock sound = GridTerminalSystem.GetBlockWithName("Sound") as IMySoundBlock; // check result for SoundBlock if (sound == null) { p2.WritePublicText(" [ERROR] Sound Offline", true); return -2; } // check type if (!(sound is IMySoundBlock)) { p2.WritePublicText(" [ERROR] invalid SoundBlock", true); return -3; } //--------------------------------------------------------------------------------------------------- // 20000 W Alert //--------------------------------------------------------------------------------------------------- if (cur 20000) { sound.GetActionWithName("OnOff_On").Apply(sound); } else { sound.GetActionWithName("OnOff_Off").Apply(sound); } return 0; } public float GetPanelMaxPower(IMySolarPanel panel) { var _d = panel.DetailedInfo; string _power = _d.Split(new string[] {"\n"}, StringSplitOptions.None)[1].Split( )[2]; //Checking the MAX Output string _unit = _d.Split(new string[] {"\n"}, StringSplitOptions.None)[1].Split( )[3]; //Checking the MAX Output unit float value = Convert.ToSingle(_power); if (_unit == "kW") { value *= 1000; } return value; } public float GetPanelPower(IMySolarPanel panel) { var _d = panel.DetailedInfo; string _power = _d.Split(new string[] {"\n"}, StringSplitOptions.None)[2].Split( )[2]; //Checking the Output string _unit = _d.Split(new string[] {"\n"}, StringSplitOptions.None)[2].Split( )[3]; //Checking the Output unit float value = Convert.ToSingle(_power); if (_unit == "kW") { value *= 1000; } return value; }
https://w.atwiki.jp/mcforum/pages/29.html
概要 どんなげーむ? W.O.T.(=World of Tanks)の名のごとく、世界中の戦車を乗り回してドンパチウフフするゲーム。 オンラインで対戦可能。仲間で共闘も可能。ただし、戦車は大戦のものに偏っている。 無課金でも遊べちゃう。 公式ページ(アジア向け、日本語) http //worldoftanks.asia/ 情報ページ wiki(日本語) http //wikiwiki.jp/wotanks/ LemonKajuの書いた大雑把な入門ページ https //lemonkaju.net/Game/wargaming/wo/t/start/ チュートリアル ゲームの初回プレイで丁寧にやってくれる。 初回プレイ終わっても何度でもチュートリアルできる。 ざっくりとしたレビュー 悪いところ 他の国で計画倒れになった戦車がいくらでも採用されているのに、日本とロシアのグライダー戦車がない。 カール臼砲がない。 戦闘力が史実の戦果と比例しない。 良いところ それでもマニアックな車両が結構採用されている。 思ったよりも精緻な弾道計算をしている。 ハンスがいないようのでみんな安心して戦車に乗れる。 関連 ハンス・ウルリッヒ・ルーデル 計画のみに終わった兵器
https://w.atwiki.jp/mcforum/pages/89.html
メンバー LemonKaju Astellia など FCサイト Grilled Meats http //jerkychan.s1010.xrea.com/GMS/
https://w.atwiki.jp/mcforum/pages/62.html
モデリング~ボーンの設定までは主にコチラのサイトに従って作りました。わかりやすいのでオススメ(たまにサクッと大変な工程を進められてあたふたするけど) 各工程で躓いたこととかヒントになりそうなことを追記してきましょう。 1.モデリング 2.テクスチャはり 3.ボーン入れ ボーンを動かすと全然関係ないメッシュが引っ張られる ウェイトが微妙にかかってる場合がある。下記サイトを参考に対処してみる。 http //ch.nicovideo.jp/tomb_saikaya/blomaga/ar1013084 4.fbx出力