ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

英語ボイチャでAmong Usをプレイする際の英文集

先日、英語学習をしているゲーム業界人のコミュニティをDiscordで立ち上げましたが、「英語ボイチャでAmong Usをプレイしよう」というのをメンバーで試してみました。

そして以下のような良い点を感じました。

・議論の時間があるので英会話に持ってこい

・単語の羅列でも伝わる

・特定のフレーズを繰り返すので覚えていきやすい

・ワイワイやるので初対面での英会話の恥ずかしさを軽減できる

・5人以上じゃないとゲームとして厳しいが英会話目的なら4人でもOK


以上により、英会話初心者が英会話に慣れる方法としてとても良い手応えがありました。

ただし、ゲームでの議論の際に伝えたいことがパっと出てこない場面も多かったです。
そこでプレイ時の注意や主な英文をまとめておきたいと思います。

続きを読む

VFXアーティストのスキル自己評価シートを公開しました

前々から作りたいと思っていた、ゲームエフェクトアーティスト向けに自身のスキルチェックができるExcelシートGitHubにアップしました。

ページ右下の Download ボタンからDLできます。
マクロ付きのファイルになるので、Excelを開いたらマクロを有効にしてください。

続きを読む

C# TextBoxを数値専用にする際のTIPS

フォームアプリでユーザーが数値入力だけ行える入力ボックスを用意したい場合に、コントロールを自作したり継承して改造せずに標準機能だけで実現しようと思うと主に2つの方法があるかと思います。

NumericUpDownを使う方法

1つは NumericUpDown コントロールを使う方法です。

f:id:moko_03_25:20200920162740p:plain

こちらは数値入力のみ入力可能なコントロールで、最小値と最大値を指定するプロパティが用意されているため、容易に0の入力を無効にできます。

描画する線の太さや画像サイズなど 0を指定してはいけない場面は多いため便利です。

ただしいくつか面倒な点があり‥横の上下ボタンが不要な場合に非表示にすると背景画くり抜かれたような見た目になったり、数値を変更した際のイベント「ValueChanged」では数値を変更する前の値しか取得できないため変更後の値を取得するのに困ります‥(こちら勘違いだったり簡単な解決法があれば教えてください)

TextBoxを使う方法

そこで TextBox コントロールを数値入力のみ受け付けるようにして利用する場合ですが、今回は1以上の整数値のみ入力可能にしてあげたかったため、下記のような挙動を実装しました。

・TextBoxがアクティブになったら全選択状態にする
・TextBoxでEnterを押した時も全選択状態にする

・TextBoxでEnterやEscapeキーの入力時にビープ音を鳴らさない

・半角0~9 / Enter / Escape / Delete /Backspace の入力のみ受け付ける

・Enterを押した際に入力が0の場合はエラーメッセージを出す
・Enterを押した際にゼロパディングを打ち消す

・フォーカスが移動した際に入力が0の場合はエラーメッセージを出す
 そして元のTextBoxにフォーカスを戻す
・フォーカスが移動した際にゼロパディングを打ち消す


こうして見ると分かるのですがTextBox1つ追加するのにこれだけ手を入れてやらないと快適にならないというのがUIを作る際の非常に面倒臭いところですね。。

フォーム上に TextBoxを2つ並べた形でテストしました。

f:id:moko_03_25:20200920165506p:plain

そして下記のように実装することでうまくいきました。
(フォームデザイナ側で TextBox の ImeMode Disable に設定しています)

using System;
using System.Windows.Forms;

namespace InputNumber
{
	public partial class Form1 : Form
	{
		double d = 0;

		public Form1()
		{
			InitializeComponent();
		}

		// アクティブになったら選択状態
		private void textBox1_Enter(object sender, EventArgs e)
		{
			textBox1.SelectAll();
		}
		private void textBox2_Enter(object sender, EventArgs e)
		{
			textBox2.SelectAll();
		}

		private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
		{
			// EnterやEscapeキーでビープ音が鳴らないようにする
			if (e.KeyChar == (char)Keys.Enter || e.KeyChar == (char)Keys.Escape)
			{
				e.Handled = true;
			}

			// Enterを押したら選択状態
			if (e.KeyChar == (char)Keys.Enter)
			{
				if (textBox1.Text == "0")
				{
					MessageBox.Show("1以上の値を入力してください");
				}
				else
				{
					// ゼロパティングを打ち消す
					string s = textBox1.Text;
					textBox1.Text = s.TrimStart((char)'0');
				}

				textBox1.SelectAll();
			}
			else
			{
				// 0~9と、バックスペース以外の時は、イベントをキャンセルする
				if ((e.KeyChar < '0' || '9' < e.KeyChar) && e.KeyChar != '\b')
				{
					e.Handled = true;
				}
			}
		}

		private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
		{
			// EnterやEscapeキーでビープ音が鳴らないようにする
			if (e.KeyChar == (char)Keys.Enter || e.KeyChar == (char)Keys.Escape)
			{
				e.Handled = true;
			}

			// Enterを押したら選択状態
			if (e.KeyChar == (char)Keys.Enter)
			{
				if (textBox2.Text == "0")
				{
					MessageBox.Show("1以上の値を入力してください");
				}
				else
				{
					// ゼロパティングを打ち消す
					string s = textBox2.Text;
					textBox2.Text = s.TrimStart((char)'0');
				}

				textBox2.SelectAll();
			}
			else
			{
				// 0~9と、バックスペース以外の時は、イベントをキャンセルする
				if ((e.KeyChar < '0' || '9' < e.KeyChar) && e.KeyChar != '\b')
				{
					e.Handled = true;
				}
			}
		}

		private void textBox1_Leave(object sender, EventArgs e)
		{
			if (textBox1.Text == "0")
			{
				MessageBox.Show("1以上の値を入力してください");

				// フォーカスを戻す必要がある
				textBox1.Select();
			}
			else
			{
				// ゼロパティングを打ち消す
				string s = textBox1.Text;
				textBox1.Text = s.TrimStart((char)'0');
			}
		}

		private void textBox2_Leave(object sender, EventArgs e)
		{
			if (textBox2.Text == "0")
			{
				MessageBox.Show("1以上の値を入力してください");

				// フォーカスを戻す必要がある
				textBox2.Select();
			}
			else
			{
				// ゼロパティングを打ち消す
				string s = textBox2.Text;
				textBox2.Text = s.TrimStart((char)'0');
			}
		}
	}
}

 

こちらの記事を参考にさせていただきました。

TextBoxに数字しか入力できないようにする - .NET Tips (VB.NET,C#...)
単一行テキストボックスでEnterやEscapeキーを押した時にビープ音が鳴らないようにする - .NET Tips (VB.NET,C#...)

 

今回、ユーザーが画像を自由に拡大縮小できる機能を追加しようと思ったのですが、「縦横比を固定フラグをONにしていたら片方のサイズが自動で決まるようにしたい」と思いました。

f:id:moko_03_25:20200920171355p:plain

その際には TextChanged イベントでは値を入力している最中にも計算してしまうので、ユーザーがEnterキーを押した際またはフォーカスを別のコントロールに移した際に0が入力されていないか判定した後に実行してあげる方が不具合が起こりにくい気がします。

でもそうして考えると「TextBox を使う方法」ではなく「NumericUpDown を使用して ValueChanged は利用しない」方がスマートかも知れないですね。。

Helix Core(Perforce)の .NET向けAPIの導入方法 ③

前回に引き続き「Helix Core(旧称 Perforce)」を使ったファイルのバージョン管理の操作を、.NET/C# で制作するWindows Forms Application上で行います。

本記事で解説する内容はこちら。

  • ワークスペースの切断
  • ファイルがワークスペースルートに存在するか判定
  • ファイルがバージョン管理されているか判定
  • ファイルがチェックアウト状態か判定
  • 実装方法の調べ方
  • その他の注意点


今回もまたp4miscさんに随所で助けていただきました(ありがとうございます!)

ちなみにワークスペース名の取得に関してはこちらの記事をご覧ください。

続きを読む

P4 Mini Tool をリリースしました!

Helix Core(旧称 Perforce)」でバージョン管理している開発者向けのシンプルでコンパクトなチェックアウト&サブミットツールです。

f:id:moko_03_25:20200914015442g:plain

開発の動機

開発では基本的にはUE4のようなゲームエンジン上やP4V上でアセットの操作を行うと思いますが、ゲームエンジン外の特定のドキュメント(仕様書やガントチャートやアセット管理リストなど)頻繁に編集する人向けにお手軽なツールを作りたいと思ったのがきっかけです。

あと Helix Core(Perforce)の仕組みを理解したかったのもあります。理解できれば、Pythonを使ってMayaやUE4からの操作も自力で可能になりそうだと思いました。

謝辞

今回、Helix Core の概念からP4コマンド・P4Adimin・P4Vの使い方、またC#での実装に至るまで、かなりの知見を p4miscさんにご教授いただきました。p4miscさん無くしてこのツールは完成していません。ありがとうございました!

ダウンロード方法

実行ファイルとソースコードGitHubにアップしています。

binaryフォルダ内にある「P4MiniTool_v100.zip」にツール本体の実行ファイルが入っていますので、こちらをクリックして飛んだ先の「Download」ボタンからDLしてお使いください。

ライセンスは MIT License です。

使い方は各ボタンにカーソルを置くと表示されるツールチップをご覧ください。
不具合があったらtwitter(@moko_03_25)等でお知らせいただけると助かります!

P4関連で言えば、他にもデフォルトチェンジリストに大量にアセットを残したまま帰宅してしまいがちな人向けにPCシャットダウン前にワーニング出したりできないかなあとか密かに思っています。UE4やP4Vを落とすタイミングで表示する感じですかね。。

P4 Mini Tool の特徴


ワークスペースへの接続

・サーバー / ユーザー / パスワード / ワークスペース名を指定
・起動と同時に接続するよう設定可能

●ファイルのバージョン操作

・ドラッグ&ドロップでファイルを1つだけ指定
・ボタン1つでチェックアウト
・ドロップと同時に自動チェックアウトも設定可能
・ボタン1つでリバート
・ボタン1つでサブミット
 テキストボックス内の文章がサブミット時のコメントに反映されます

使用方法


① ツールを起動したらまずは設定ボタンを押します。

f:id:moko_03_25:20200914142150p:plain

② 接続先の情報を入力します。

f:id:moko_03_25:20200914142159p:plain

③ 接続ボタンを押して接続します(緑になったら成功)。

f:id:moko_03_25:20200914142209p:plain

④ 編集したいファイルをツール上にドロップすると編集ボタンが押せるようになります。
※チェンジリスト作成の都合上、まだチェックアウトされていないファイルを放り込んでください

f:id:moko_03_25:20200914142219p:plain

⑤ 編集ボタンでチェックアウトしてからファイルを編集して、編集終わったら更新内容についてコメントを入力してサブミットボタンでサーバーに反映させます。

f:id:moko_03_25:20200914142228p:plain

以上になります。

更新履歴


・2020.09.14 v.1.00 リリース!

 

作者 / 著作権


moko

動作確認済みのOS


Windows10(64bit)

使用条件


本ツールはOSSオープンソース・ソフトウェア・ライセンス)です。
商用・非商用に関わらず(プライベートでもお仕事でも)ご自由にお使いください。
複製、改変、再配布も自由です。

免責事項


本ソフトウェアは予告なく機能を変更することがあります。
本ソフトウェアは動作環境を満たす全ての環境で正常に動作することを期待していますが、保証はできません。
本ソフトウェアの使用により生じたいかなる損害に関して、作者は一切の責任を負いません。

Helix Core(Perforce)の .NET向けAPIの導入方法 ②

前回に引き続き「Helix Core(旧称 Perforce)」を使ったファイルのバージョン管理の操作を、.NET/C# で制作するWindows Forms Application上で行います。

今回は「P4サーバーへの接続」「ファイルのチェックアウト」「サブミット」です。

f:id:moko_03_25:20200905004620g:plain

下記2つの公式ページをそのまま参考にしました。

Creating pending changelists with P4API.NET 公式のP4API.NET導入記事
Introduction 公式のチュートリアル(最下部がチェックアウトとサブミット)

本記事で解説する内容はこちら。

  • GUIの作成
  • 変数の定義
  • ワークスペースに接続する関数の定義
  • ファイルをチェックアウトする関数の定義
  • ファイルをサブミットする関数を定義
  • ボタンクリックイベント
続きを読む

Helix Core(Perforce)の .NET向けAPIの導入方法 ①

Helix Core(旧称 Perforce)」を使ったファイルのバージョン管理の操作を、.NET/C# で制作するWindows Forms Application上で行うための導入についてまとめます。

ツールはサーバー管理者向けのものではなく、クライアント向けを想定しています。

本記事で解説する内容はこちら。

  • .NET向けAPIの入手
  • 新規プロジェクトの作成
  • 2つのDLLの導入
  • デザイナーでボタンを配置
  • ソースコードを記述
  • 実行
続きを読む

P4VとP4コマンドによるクライアントの基本操作

前回Helix Core Server(旧称 Perforce Server)の管理者としてディポを作成したり削除したりといった最低限の手順をまとめましたが‥

今度はクライアント側‥つまり開発者としてストリームを作成したり削除したり、ファイルを追加・チェックアウト・サブミットしたりといったあたりの操作についてまとめました。

目次はこちら。

  • P4Vでの操作
    • ストリームの作成
    • ストリームの削除
    • ワークスペースの削除
    • ファイルの追加・チェックアウト・リバート・削除・サブミット
    • おまけ情報
  • コマンドプロンプトでの操作
    • ユーザーの指定
    • 指定ディポのストリームの確認
    • ストリーム作成
    • ストリーム削除
    • ファイル操作時のコマンドプロンプトの起動
    • ファイルの確認
    • ファイルの追加
    • ファイルのチェックアウト
    • ファイルのリバート
    • ファイルの削除
    • チェンジリストに更新内容のコメントを入力してサブミット


まずはGUIによるクライアントソフト「P4V」での操作を解説して‥
次にコマンドプロンプトP4コマンドを使った操作を解説します。

続きを読む

Helix Core Server 管理の基本操作

この記事では Helic Core Server の管理者として行う最低限の操作についてまとめました。

まずは GUIによる管理ツール「P4Admin」での操作を解説して‥
次にコマンドプロンプトP4コマンドを使った操作を解説します。

今回もまた一通り p4miscさんにお話を伺って自分なりの理解でまとめてみました(p4micsさん今回もまたありがとうございます‥!)

そして例によって私の理解が間違ってる箇所もあるかと思いますので、何か気になる点などありましたらぜひツッコミいただけるとありがたいです。

目次はこちら。

  • P4Admin を使った操作
    • 権限の確認
    • ログの確認
    • ディポの作成
    • ディポの削除
  • コマンドプロンプトを使った操作
    • コマンドプロンプトの実行
    • サーバーやユーザーの確認
    • ディポの一覧
    • ディポの作成
    • ディポの削除
    • クライアント側でユーザーを追加できないようにする


ちなみに私のように何もかも初めての方は下記の記事もどうぞ。

Helix Core (Perforce) の基本構成 
Helix Core(Perforce)の主な要素について

続きを読む