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

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

C# 英単語を覚えるためのツール「English Words Check Tool」を公開しました!

英語の学習を始めたので、勉強のためにツールを作成しました。
(下図の例文は旺文社の「英単語ターゲット1400」より引用させていただいています)

f:id:moko_03_25:20190720023808g:plain

すでに便利なスマホアプリが色々あるようで、私自身も書籍「英単語ターゲット1400」を購入するとともに、アプリでは「タゲ友1400」を使っているのですが、自分で覚えたい単語や文章を登録したり、覚えた単語は表示させないフラグを立てて出題数をどんどん減らしていくことができるツールが欲しいと思ったので作ってみました。

ツールは GitHub にアップしています。

binaryフォルダ内の「EnglishWordsCheckTool.zip」にツール本体の実行ファイルと単語登録作業用のエクセルファイルと、ツールに読み込むためのテキストデータが入っていますので、こちらをクリックして飛んだ先の「Download」ボタンからDLしてお使いください。

ライセンスは MIT License です。

使用方法


① テキストデータに単語を登録する

同梱している「WordsSet.xlsx」にまずは単語・例文・和訳を記入してから、記入した部分を範囲選択して Ctrl + C でクリップボードへコピーします。

f:id:moko_03_25:20210207151444p:plain

次に「WordsSet01.txt」を開いて Ctrl + A で全選択して Ctrl + V で貼り付けてください(将来的にはエクセルをそのまま利用するようにしたいとは思っています)

f:id:moko_03_25:20210207151553p:plain

※最後に空行が複数入らないようご注意ください

② ツールを起動、テキストデータを読み込む

参照ボタンを押してテキストデータを読み込みます。
デフォルトのテキストデータで良い場合はそのまま③へ進んで大丈夫です。

f:id:moko_03_25:20190720025330j:plain
③ 「日本語訳チェック」か「英訳チェック」を選んで開始ボタンを押す

このタイミングでテキストデータをツール内部に読み込みます。

f:id:moko_03_25:20210207151717p:plain
④ 「答えを見る / 次の問題」ボタンを押して単語チェックを行う

ボタンを押すたびに「訳を表示>次の単語を出題」を繰り返します。

f:id:moko_03_25:20210207152547p:plain

・次回から表示しないで欲しい単語は下部のチェックボックスをONにしてください
・「チェック終了」ボタンでチェックを中断できます
・「音声確認」ボタンでGoogle翻訳が開き、そこで音声が確認できます
・「画像検索」ボタンでGoogle画像検索が開き、単語のイメージが確認できます

省略フラグが保存されるタイミング

・ひととおり単語チェックが終了したとき
・「チェック終了」ボタンを押したとき
・ツール本体を閉じたとき

 

更新履歴


・2019.7.20 v.1.00 リリース!
・2019.7.20 v.1.01
 出題時にシャッフルするかどうか選択可能にしました。
 出題数と現在の数を表示対応。
 英単語と英語の例文はマウスドラッグで選択できるよう対応。
・2021.2.7 v1.02
 Google画像検索を表示するボタンを追加。

 

作者 / 著作権


moko

動作確認済みのOS


Windows10(64bit)

使用条件


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

免責事項


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

英語の学習をはじめてみた1(アラジン編)

文法をひらすら覚えるのでは続かないと思い、そちらは通勤時に中学英語を復習しつつ‥一方で「Disney Deluxe」というディズニーアニメ配信サービスに加入して、英語音声・英語字幕でアニメ視聴を開始しました。

子供向けのアニメが豊富で大人でも楽しめて自分も好きなものとなるとディズニー・ピクサーになるかなと思ったので。


最初はアラジンから視聴開始。
A whole new world」の歌唱シーンが久々に観たくなったからです。

劇中で英語字幕が表示される度に一時停止して、分からない単語や言い回しがあればGoogleで調べて音声もチェックして似た感じになるよう発声して、その単語は「List Fusen2」に書き留める(What a useful tool ! )‥という感じで進めました。

最初はブラウザ2枚にして英語字幕と日本語字幕を並べて、意味を調べた後に日本語訳もチェックしていましたが、それぞれ再生して同じ場所を見るのがあまりに面倒なのと、その場で字幕設定を日本語>英語に切り替えてチェックする方が楽じゃんと気づいて途中から1枚に戻しました。願わくば5秒巻き戻し機能が欲しいけど‥その需要があるのは英語学習してる日本人だけなのかしら。

さて、始めてみて痛感したのは自身の単語のあまりにもの知らなさっぷりです。

ほぼすべての字幕で分からない単語が登場します。。
ヒューマンドラマとかではなくディズニーアニメで。。
「海外の小学生くらいの子ってこれ分かるのかな?」っていう単語も結構あって。
うすのろ・間抜け系の名詞が7種類くらい出てきたりして、使い分けが全く分からない‥

でもって冒頭から15分に達するのに90分以上かかる感じでしたが、1日2~3時間の視聴を1週間くらいかかけてようやく90分の本編を一通り観終えることができました。2/3の時点でA whole new worldが流れる場面になりますが、そこに辿り着くのでさえ長い道のりでした。。

ですが文法をひたすら勉強するのとは違ってモチベーションが全く低下せず、続きの話が気になって最後まで根気よく進められました!

折角なので、書き留めた単語を列挙しておきたいと思います。
これだけ知りませんでしたよという恥ずかしい思いもありますが。。

名詞


名詞だけでメモったのが110単語。。

ammunition 弾薬
appearance 見た目・見栄え
arrest 逮捕
asset 資産
behalf 代わり
betrayer 裏切者
bout 試合・勝負・手合わせ
brass 真鍮・黄銅
cause 原因・動機
chump がらくた・とんま
clown ピエロ・田舎者
concern 心配
course 方向・経路・コース
days 昼・日々
deal 対処・引き合い
defeat 負け・打破
dip へこみ・傾斜
disaster 災厄
doom 運命
dunes 砂漠
essencial 必需品
esteem 尊敬
evil
exchange 交換
excuse 言い訳
fact 事実
fakir 苦行僧
fault 過ち・決定
feast ご馳走・祭り(フェスティバル)
fee 費用・料金
flaw 欠点・汚点
flea ノミ
flock 群れ
flunky 八方美人
freebie 景品
fries フライドポテト
fulfilment 履行・成就
grave
guard 警備・護衛
guess 推測・想像
hairball 毛玉
harm 害・危害・被害
horde 悪党仲間
humiliation 屈辱
idiot バカ・間抜け
infidel 不信心・不届き者
insult 侮辱・誹謗・悪口
issue 問題
kitty 子猫ちゃん
liege 嘘つき
limitation 制限・制約・禁止
lout うすのろ
loyalty 忠誠心・忠義
mammal 哺乳類
matter 問題・事象
measure 計測・手段
menagerie おとぎ話・動物園
merchandise 商品
mess めちゃくちゃ
moron 間抜け
mythology 神話
outfit 服装・衣装
outrage 激怒
outside 外・表面
parcel 小包
patience 我慢・根気・辛抱
patient 患者・病人
pedigree 血統・家柄・由緒
physique 体格・骨格
pipsqueak つまらない人(物)
pleasure 喜び・娯楽・快楽
polly オウム
popsicle アイスキャンディ
possibility 可能性
praise 称賛
prospect 見通し・展望
provisos 但し書き
purpose 目的
refunds 払い戻し
reward 報酬・謝礼
scoundrel 悪党(スキャンドロ)
sentence 文章・宣告・判決
servants 使用人・従者
servitude 奉仕・自由の束縛
shame
shrew ガリネズミ・じゃじゃ馬
sight 視力
sinister 罪人
slowpokes のろま
slumber 眠り
stroll 散歩
substitution 代用・交換
suitor 求婚者
tale 物語
terminal 最後・末期・終着
throats
traitor 裏切者
transportation 交通手段・輸送
trouble 悩み・迷惑
universe 宇宙・天地
urchin ウニ・悪たれ小僧
urge 衝動
valet 従者
venue 会場
whim 気まぐれ・移り気
whole 全体・全て
wisdom 知恵
worth 価値
worthless 役たたず
youth 青春・若者・青年

 

動詞


メモったのは93単語。

afford 与える・もたらす
allow 許可する・許す
apologize 謝る・詫びる
appreciate 感謝する・認める
assure 保証する
become ~になる
behead 首をはねる
blame 責める
bloom 咲く
blush 赤面する・恥じらう
brat ガキ・悪ガキ
bring 持ち運ぶ・持ってくる
calm 鎮める
cause 引き起こす・及ぼす
chill 冷やす
choke むせる・ふさぐ
choose 選ぶ
con 騙す
confound 困らせる・うろたえさせる
conquer 征服する
consider 考える・案ずる
contain 含む・封じ込める
court 言い寄る・挑む
cower 震える・ちじこまる
dare あえて~する・勇気をもって~する
deceive 欺く・騙す
decide 決める
deem みなす
deserve 値する・ふさわしい
dig 掘る・小突く
disappear 無くす・隠れる・姿を消す
discuss 相談する
disturb 邪魔をする・妨げる
exceed 上回る
except 除く
expect 期待する・待つ
explain 説明する
fetch 読み込む・取ってくる
fooled 騙す・ふざける
forbid 禁ずる
forcing 強制する
freewheeling 気ままに・自由に
galloping 駆ける・疾走する
grant 与える・承認する・叶える
grovel 屈服する
guess 推測する(~と何となく思う)
hail 評価する・呼び止める・歓迎する・称賛する
happen 起こす・及ぼす
hurt 傷つける・損なう
illuminate 照らす
imitate 真似る・倣う
impress 印象付ける・心をとらえる
improvise 即興で作る・アドリブでやる
intercede 仲裁する・取りなす
mourn 嘆く(モーン)
prepare 準備する・備える・仕立てる
pretend ふりをする・見せかける
proceed 進む・出向く
prove 証明する
provide 提供する(プロバイダー)
puff プっと吹く
pursure 追及する・求める
realize 気付く・理解する・叶う
reduce 減らす・引き下げる・削る
refuse 拒む・断る
relieve 解放する・軽減する
require 要求する・必要とする
reveal 明らかにする・表す
rewarded 報いる・応える
rid 除去する
roam 歩き回る(ローミング
rub こする・撫で回す
ruminate 反すうする
seem 見える・思える
sentencing 判決を言い渡す・宣告する
serve 仕える・務める
settle 片づける・済ます
shimmering 煌めく・光り輝く
shove 押す・突き出す
soar 舞い上がる
spit つばを吐く
squeeze 絞る
stare 凝視する・見つめる
stuff 詰め込む
suppose 思う・見受ける・察する
tumble 転がる・宙返りする
twit なじる・あざける
unravel ほどく・(計画を)潰す
upset ひっくり返す・慌てさせる
wager 賭ける
warble さえずる
wed 結婚する
whack 強打する・ぴしゃりと打つ

 

形容詞


名詞を修飾するもの。
モノがどんな感じなのかを説明する。

メモったのは90単語。

abject 浅ましい・情けない・みじめな
adequate 十分な・適切な
amorous 色っぽい
appointed 決められた
awful ひどい
barbaric 野蛮な(バーバリアン)
brilliant 輝かしい・鮮やかな
broke すっからかん・貧乏
calm 穏やかな・静かな
certified 保障された
close 近い・親しい・密接
commonplace ありふれた・普通の
concerned 心配している・心配そうな
confident 自信がある
cowardly 臆病な
crummy 下等な・つまらない
dazzling 眩しい
dearest 最愛の
deciding 決定的な
delighted 喜んで
desperate 絶望的
disgusting おぞましい・苦々しい
doubt 疑う・怪しむ(ダウト)
due 正当な・真の
dumb まぬけな
ecstatic 恍惚とした
embarrassed 恥ずかしい
exact 正確な・詳しい・寸分違わない
fabulous 素敵・素晴らしい
faraway 遥か遠い
farther より遠い
filthy 汚い・不潔な・汚らわしい
finer 細かい
finest 細かい・素晴らしい・立派な
fond 優しい
forbidden 禁じられた
foul 汚い(ファウル)
galore 豊富な・沢山の
generous 寛大な・太っ腹・気前の良い
glorious 輝かしい・素晴らしい
gracious 優しい
hairy 毛だらけの
hasty せっかち
horrible 恐ろしい
hot 活気のある、好調
humble 卑しい・つつましい
immense  巨大
incredible 素晴らしい
indescribable 言葉にならない・言い表せない
intact 無傷
intense 激しい・きつい
interested 興味がある
less より少ない・足りない
lousy お粗末な
lowly 卑しい・みすぼらしい
marvelous 素晴らしい
messy 汚い・ふしだらな
mighty 力強い
miserable 悲惨な・惨めな
moldy カビの生えた
necessary 必要
obvious 明らか・明白
ordinary 普通の・日常の
outrageous とんでもない
phenomenal 驚異的な・素晴らしい
picky うるさい
precious 貴重な
prosperous 繁栄している・盛大な
punctual 時間に正確な
pungent 辛い・ピリっとくる
ragged ぼろぼろの
rare 貴重・珍しい・レア
remarkable 注目すべき・素晴らしい
ridiculous バカバカしい
rotten 腐った
sheepish 愚かな・恥ずかしい
spectacular 壮観な・華々しい
splendid 素晴らしい
such そのような・あんな・こんな
sudden 突然・急・不意
suitable 相応しい
tasty 美味しい
terrible 恐ろしい・ひどい
tragic 悲劇的な
ugly 醜い
unimpeachable 信頼できる
upstanding 正直な
vile 卑劣な
weird 変な・不気味な
worthy ふさわしい

 

副詞


名詞以外
を修飾
するもの。
いつ・どこで・どんな・どれくらい‥など。

メモったのは31単語。

~forth ~以後・前へ・先へ
absolutely 絶対に・断じて
actually 実は・まさに
afar 遥かに・遠くに
almost ほとんど
anymore もう
aside ~は別にして
at last ようやく・遂に・やっと
at least 少なくとも
certainly もちろん・必ず・正に
certainly 確かに・もちろん
definitely 絶対に・必ずや
desperately 必死に・一生懸命
else 他の
even ~さえ
ever 今まで・いつか
exceedingly 極めて・誠に
exceptionally 非常に
frightfully 恐ろしく・ひどく
maybe 多分・あるいは
merely 単に・たった
nearly ほとんど
obviously 明らかに
often よく
otherwise あるいは・さもないと
perhaps 多分・恐らく
probably 多分・あるいは
quite かなり・すっかり
rather かなり・どうやら
somehow どうにかして・なんとなく
still それでも・未だに

 

代名詞


人やモノを曖昧に表す言葉。

メモったのは10単語。

all of you みなさん
anyone / anybody 不特定多数の誰か(bodyの方がカジュアル)
someone / somebody 知らない誰か・少人数の中での誰か(bodyの方がカジュアル)
something 何か
whoever 誰でも(主語になる)
whomever 誰でも(目的語になる)
majesty・your highness 陛下

 

前置詞


モノとモノの関係を表す。
代表的なものにfor・to・from・in・on・at・of・by‥など。
http://www.langland.co.jp/english/column/english-column15.php

メモったのは10単語。

against ~に対して
along ~に沿って
besides ~のさらに・その上
until ~まで
within ~以内

 

接続詞


文と文を繋げる言葉。

メモったのは5単語。

~here どれどれ・さて
and then そして
either どちらか
except ただし・ということが無ければ
whilst その間に

 

言い回し


メモったのは65種類。

a couple of 一対の
ain't = am not / are not / is not / has not / have not
as usual いつものように
at once すぐに
be able to = can できる
be fond of~ ~が好き
be yourself 素直になれ・あなたらしくなれ
bless my soul  まさか
bona fide 本物の
bona fide 誠実な
bow to me 私に服従する
brand new 新品・本当に新しい
come on down こちらへどうぞ・お入りなさい
dolled up おしゃれする・ドキドキする
each other お互いに
everyone else 1つを除いて他のもの全て
face it 現実を見ろ
feel left out がっかりした
finders keepers 落とし物は拾い得(拾ったものは自分のものにすることができるが、失くしたら泣きをみる)
get outta = get out of 出ていく
gettin' = getting ~になってきている
go nuts クレイジーになる
gonna = going to ~する予定
good way お楽しみ
gotcha = I got you わかった・捕まえた
gotta = have to (got to) ~しないといけない
greater than ~より大きい
hang on 少し待つ・注意して聞く・によって決まる
hang on to ~に捕まる
hit the ~ 熱心に
hit the load 旅に出る
hittin' = hitting  
How dare you はあああ?・よくもまあ
I got it = I understood 理解した
i'm history さようなら
I'm off 行ってきます
It’s not gonna happen それは起こらない
itty bitty ちっちゃい
jot down 書き留める
Let's get real 現実になろう
made you look ほーら見ちゃった
My best wishes 上手く行くよう願ってるよ
no matter~ どんなに~でも
no way 無理・あり得ない
nothing more than に過ぎない
now then さて
oh my goodness (oh my godでの神の呼称を避ける言い回し)
ought to ~するべき
out of my face 俺の前から失せろ
outta = out of ~から外に
prizes to be won 当たった景品
Psst. ~~ (内緒話の最初に音を立てて注意を引く)
quid pro quos ラテン語で見返り
red-letter 記念日(カレンダーの赤い文字)
rest of the~ ~の残り
set you free 君を自由にする
storm out 怒って出ていく(嵐のように)
such a thing そんなこと
wanna = want to ~したい
watch out  注意して
What’s the matter? どうしたの?
What’s wrong? どうしたの?
whatever どうでもいい(スラング
You got it 了解した
You got it? 分かった?
your very own 完全にあなただけの

 

劇中に1度しか出てこなかったものは即座に忘れる訳ですが、worth(価値)・suitor(求婚者)なんかは頻繁に登場したので覚えることができました。

そんな感じで、10作~20作と観ていけば自ずと話し言葉や単語は覚えていくだろうと気楽に思っています。

あとは「一億人の英文法」という書籍を買ってお風呂の時に読んだりしてます。

こちらの書籍はシンプルに分類した分かりやすい説明と、図を豊富に用意してイメージで覚える話し言葉というコンセプトがとても良い感じなので、少しずつ読んでいきたいと思います。。

一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)

一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)

 

『フォトリアルなインテリアビジュアライズはどう制作されているのか』メモ

こちらの勉強会に参加してきました!

建築・エンタープライズ系ビジュアライズや、ゲームエンジンを用いたコンテンツ制作をされている方向けの勉強会で、主催はmozさん(@momomo_moz)。
今後は大阪と東京と年に1回ペースで開催予定ということですっ。

今日は3つの講演がありどれもとても良かったのですが、その中でも植村さんの発表をみっちりメモったので記事にしておきたいと思います(掲載許可も頂きましたっ)。

続きを読む

C# UE4のフォルダカラーを設定するリストを作成するツール

UE4のコンテンツブラウザのフォルダに色を設定することができますが、設定はユーザーごとに下記の ini ファイルに保存されます。

プロジェクト名\Saved\Config\Windows\EditorPerProjectUserSettings.ini


しかし texture フォルダが100個あるような場合、自前でリストを用意するのは大変です。
そこで、上記 ini ファイルに貼り付けるためのリストを生成するツールを作りました。

GitHubトップにあるbinaryフォルダ内の「UE4_MakeFolderColorList.exe」をクリックした先のページで「Download」ボタンを押してDLしてお使いください。

ツールを使ったフォルダカラー設定の流れ


起動した際の画面はこちら。
一通り設定を終えたら「リストアップ」ボタンを押すと右側のパネル内に一覧します。

f:id:moko_03_25:20190619230457j:plain

そちらを先ほどの ini ファイル内にペーストします。

一度でもフォルダカラーを設定していれば [PathColor] という項目があるのでその下に貼り付けます。項目が無ければ項目ごと貼り付けます。

f:id:moko_03_25:20190619230506j:plain

UE4でプロジェクトを開けばこの通り、フォルダカラーがバッチリ適用されています。

f:id:moko_03_25:20190619230514j:plain

 

実装部分についてのメモ


ツールのカラーダイアログで設定した値は各チャンネル 0~255 の 8bit です。
それを 0~1 の値に収めるために 255 で割りますが、それだけではダメで Math.Pow(x, 2.2) でガンマ補正分暗くしてやる必要があります。

こちらの処理を入れておかないと明るく表示されてしまいました。
フォルダカラーはリニアスペース扱いなのだと思います。

C# タスクスケジューラへタスクを登録するツール

作ってみました!

時間とユーザー名だけ自由に指定できるようにしたものです。
ログイン時のユーザー名も取得して表示しています。

f:id:moko_03_25:20190618012949j:plain

元々Windowsのタスクスケジューラで設定するタスクはXMLファイルでインポート/エクスポート可能なので、XMLをインポートする形にします。

タスク追加の実装


まずVisual StudioWindowsフォームアプリのプロジェクトを開始したら、ソリューションエクスプローラーの「参照」で右クリック、「参照の追加」でダイアログを開き、「COM」を選択して検索欄に「task」と入力。

すると「TaskScheduler 1.1 Type Library」が出てくるのでチェックをONにしてからOKボタンを押します。

次にUsingディレクティブに「TaskScheduler」を追加します。

ここまでが準備になります。

あとはこちらの記事の「XMLからインポートすることでタスクを登録する」の項目を参考に実装すればOKです。

最後に実行者がタスクをチェックできるように、タスクスケジューラを起動したい場合はusingディレクティブに「System.Diagnostics」を追加して、下記のように記述すればOK(ちなみに私の環境はwindows10です)。

Process.Start(@"C:\WINDOWS\system32\taskschd.msc");

これでうまくいきました!

ちなみに同じパス&名前のタスクがある場合は上書きされるだけでエラーにはなりません。

XMLの書き換えについて


おまけです。

XMLの特定のタグの値を書き換えるには、下記の方法が一番楽でした。
Usingディレクティブに「System.Xml」を追加するのをお忘れなくっ。

// 関数:XMLの置換
// 引数「path」はxmlの場所で「name」と「value」はXML内の <name>value</name>
private void WriteSettings(string path, string name, string value) { XmlDocument xml = new XmlDocument(); xml.Load(path); XmlNodeList xns = xml.GetElementsByTagName(name); foreach (XmlNode xn in xns) { xn.InnerText = value; } xml.Save(path); }

以上、これでタスクを登録するようなツールを作ってチーム内に配布できますね!

お試しあれ!

2019.6.19 追記:
自宅では登録できるのですが、会社で使ってみて登録できなかったので調査中‥
また、ログインユーザー名を入力できるようにしてますが意味が無かった模様。。

フリーの3Dモデリングソフト「XISMO2」の導入と基本操作

無料で商用利用可能で簡単なポリゴン編集ができてFBXで出力してUE4にもっていける3Dソフトは無いかなと思ったのですが、 GNU General Public License の「blender」の他に「XISMO2(キスモ)」という非商用 / 商用ともにフリーで利用できるソフトをゆーとさん(@yutoVR)に教えていただきました!(ありがとうございます!)

こちらは起動時のスプラッシュウインドウ。

f:id:moko_03_25:20190616230701j:plain

下記の公式サイトからツール本体をDL可能です。
インストーラーによるインストールも必要なく、DLしてすぐ起動できます。

前身であるバージョン1の正式版は2016年4月8日にリリースされたようです。

バージョン2は2018年12月24日にリリースされたようですね。
2になってFBXに対応された模様です。

製作者の方のTwitterこちら

まだ公式サイトのWikiに情報があまりありませんが、バージョン1の解説動画が沢山上がっていて、若干UIが違いますがそちらでカバーできる感じです。

軽く触ってみましたので、ざっくりと基本操作についてメモしておきたいと思います。

XISMO2の概要


●公式の解説動画
xismo講座 第0回~概要 - YouTube

3Dモデリングソフトで読み方はキスモ。
「分かりやすく」「使いやすく」がコンセプトとのことです。

f:id:moko_03_25:20190616230417j:plain

また、3dsMaxのようにモディファイヤをスタックしていけるのが特徴のようです。

カメラ操作


・カメラの回転  マウス右ドラッグ
・カメラのパン  マウス中ドラッグ
・カメラのズーム マウス右 + 左ドラッグ ホイール
・カメラの画角  Shift + マウス中ドラッグ

メニュー上部の「カメラ」ボタンで平衡投影とパースをトグルできる。

プリミティブ


モデルの形状が決まったプロパティの値で定義された状態。

ポリゴン化


頂点・辺・面といった各要素を編集する場合は「ポリゴン化」する。
メニューの「ノード処理>ポリゴン化(Ctrl + E)」

メニュー上部の頂点・辺・面のアイコンのON/OFFは選択可能な要素。

ビュー上で各要素を選択するとハンドルが表示される。
・中央の水色の球をドラッグするとXYZ軸の移動
・Shift + ドラッグするとXYZ軸の拡大になる

UV展開


●公式の解説動画

xismo講座 UV展開 その1 - YouTube

初めて触ってみた際にまずはプリミティブモデルを作成してUVを編集してみたかったのですが、UVを編集する画面を表示しようと思ってメニューの「パネル」「表示」「UV」をざっと見て探せず仕舞いだったのですが、ビューを二画面にすると出てきます。

画面を分割した際にそれぞれ表示したいものを選ぶ方法が分かりませんでした。
二画面にして、片方はパース、片方は正面とかはできるのでしょうか?

また、二画面にした直後はUVを選択しようとUVビュー内をドラッグしても矩形選択のラインが表示されず困りましたが、ビュー上部のUV移動・拡大・回転のアイコンを一度でも押せば選択可能な状態になります。

UV編集周りはまだ快適ではありませんが、今後に期待です。

モデルの結合


現状は複数のモデルを1つにマージする方法を見つけられていません。

一応、ポリゴン化して頂点等を全選択して「選択部処理>コピー」、別のポリゴン化したモデルを選択して「選択部処理>追加ペースト」で1つのモデルにできました。

こちらを最初に試してUE4にもっていった際にはエラーが出てダメでしたが、もう一度同じ手順で試してみたところ正常に読み込めました。

FBXで出力


メニュー「ファイル>エクスポート>.fbx」でOKです。

プリミティブの状態で出力するとUE4でインポートした際にエラーが出る模様です。
ポリゴン化した場合はFBX出力オプションを色々変更しても正常にインポートできました。
ちなみにUE4のバージョンは4.22.1です。

UE4での実験のためにプリミティブモデルをちょこっと変形させてUVを編集した程度のモデルが欲しい場合がちょくちょくあるのですが、非常に便利っ!

リスト管理できるテキストエディタ「List Fusen」がバージョン2になりました!

1年半ほど前に「List Fusen」をリリースしましたが、不具合や使いづらい部分があったりご要望を頂いていたりしたので、一から作り直してバージョン2になりました!

f:id:moko_03_25:20190615205822j:plain

GitHubにアップしています。
ListFusen2.zip」にツール本体の実行ファイルと設定ファイルが入っていますので、こちらをクリックして飛んだ先の「Download」ボタンからDLしてお使いください。

ライセンスは MIT License です。

ちなみに起動時に「.NET Framwork 4.6 が無いけどDLする?」とダイアログが出る場合はお手数ですが「はい」を選んだ先のランタイムをDLしてインストールしてください。

バージョンアップの大きな特徴


「List Fusen 2」の大きな特徴をピックアップしました。

●ツリー構造に対応
 フォルダ機能を望む声が多かったので、リストをツリー構造にしました。
 階層に制限を入れていないので無限に入れ子にできます。

●最小化に対応
 付箋紙ツールと謳っていましたが最小化できないと不便なので対応しました。

●スクロールバーの位置の記憶
 メモを切り替えても以前に見ていた時の位置を表示します。
 かなり便利になったと思います。

●起動時に前回終了時に閲覧していたメモを表示
 メモが増えてくるとこちらが無いと不便なので対応しました。

●文字数制限の引き上げ
 デフォルト設定の3万2767文字だと到達する可能性があるので20万文字に変更。

●自動バックアップに対応
 PCのクラッシュでメモが全て吹き飛んだというご報告を受けて対応しました。
 間隔は「1日」「1週間」「1ヵ月」から選べます。

●デザインを少し改変
 すっきりとした見た目になるようにしました。
 アイコンも見やすく修正しました。
 よく表示されるメッセージは専用のデザインのものにしました。

●メモの内容をXMLファイルで保持(data.xml
 ただしXMLファイルの改変は正常に読み込めなくなる可能性があるので非推奨です。

●ツールの設定をテキストファイルで保持(settings.txt)
 起動時にツールが画面外にいってしまったりした際などに書き換えられます。
 書き換え時には扱えない値を記入しないようご注意ください。
 初期設定に戻すにはファイルを削除するか設定ウインドウで初期化可能です。

●不具合の修正
 ツールを使っているうちにUIの表示が崩れる不具合を修正しました。
 (分割バーの位置・リストやメモ部分の表示領域が崩れることがありました)

●コードの最適化
 無駄が多くてひどいコードだったのが多少マシになったかと思います。

ご使用いただく際にひとつご注意があります。

デバッグが全然足りていない状態です。不具合が頻発する可能性があります。

もしも何かおかしな挙動に遭遇しましたら、作者のTwitterまたはメール<moko.vfxgmail.com>までお知らせいただけるとありがたいです。

既知の不具合

・メモに垂直タブが含まれていると保存に失敗する
 こちらのサイト記事の「TEXT▯TEXT」をメモにコピペして保存すると確認できます。
 https://letitride.hatenablog.com/entry/20120319/1332149944

今回諦めた実装

・親子関係を超えたメモの上下移動
 子も含めたカット&ペースト機能を追加して対応するかも知れません

・起動時に前回終了時のツリーの個々の開閉状態を復元

更新履歴


・2019.6.15 v.2.00 リリース!

・2019.6.16 v.2.01
 オートバックアップの出力パスの不具合を修正。

・2019.6.16 v.2.02
 オートバックアップ時に前回のバックアップ日時を更新するよう修正。
 設定ファイル読み込みエラー時に初期値を入れるよう修正。

・2019.6.16 v.2.03
 Ctrl+Sで保存した際に直前に編集したテキストを保存に反映するよう修正。

・2019.6.16 v.2.04
 対象の.NET Framworkを4.7.2から4.6に変更。

・2019.6.16 v.2.05
 .NET Framwork 引き下げにより Ctrl + A の全選択が不可になっていたので修正。

・2019.7.4 v.2.06
 多重起動を禁止にしました。
 最小化時に終了すると次回起動時に画面外に表示されてしまう不具合を修正。

・2019.7.15 v.2.07
 最小化直前にツールの位置や大きさ等を記憶するよう修正。
 終了時にツールの位置や大きさ等が不正な値だった場合に対応。
 フォントの設定が保存されず次回起動時に再現できていなかったので修正。

 

作者 / 著作権


moko

動作確認済みのOS


Windows10(64bit)

使用条件


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

免責事項


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

C# 初心者の次のステップ

まったくのプログラム初心者が .NET + C# の最低限の文法を使って簡単なWindowsフォームアプリを作れるようになってくると「コードの中身をもうちょっとうまく作れないかな」「便利な機能をもう少し知りたいな」と思うようになってきます。

そこで、そうした際に手を出すと良さそうな次のステップをメモしておきます

Visual Studio での F12 と Shift + F12

クラスや関数や変数が呼び出されている場所で名前を選択してF12を押すと、宣言している場所に一発でジャンプしてくれます。違うドキュメントでも関係なくジャンプし、標準で組み込まれているクラスや関数でもジャンプしてくれるため、中身を調べる時に非常に便利です。

逆に、宣言している場所で名前を選択して Shift + F12 を押すと使用先をリストアップしてくれて、リストをダブルクリックでジャンプしてくれます。

どちらも非常に便利で必須です。

Visual Studio のステップ実行とウォッチリストの利用

初心者であっても、この2つはデバッグに必須になります

Visual Studio のプロジェクトのプロパティの利用

ツールの設定などを自前でテキストファイルやXMLjsonファイルで読み書きするような実装をしなくても、Visual Studio の機能でプロパティを定義しておけば、実行ファイル名 + exe.config というファイル名でツール本体と同じ場所に勝手に保存してくれます。中身はXML形式で記述されているようです。

Fontの情報をstringに変換してファイルに読み書きしたいと思っても、専用のコンバータ関数の利用がうまくいかなかくてこちらに頼ったりしました。

●ソリューション内に複数のプロジェクトを追加して切り替える

同じような機能をテストする場合などにいちいち新しいソリューションを作らずにプロジェクトを追加して、切り替えて実行するのが便利です。

ソリューションエクスプローラーのソリューションで右クリック>追加>プロジェクトで追加して、ソリューションで右クリック>プロパティでプロジェクトの並び順を変えたり実行するプロジェクトを指定できます。

●複数のクラスを扱う

1つのcsファイル内に複数のクラスを書いてnewして使ってみたり、1つのプロジェクトに複数のcsファイルを作ってnewして使ってみたり。

●ライブラリを導入してみる

NuGetから有名で初心者でも扱えそうなライブラリを入れて使ってみたり。

●英語と日本語が切り替えできるよう試してみる

フォームデザイナを使って環境に応じて変える方法と、言語設定を判断する変数を用意してツールチップやメッセージボックスの文章を全てifで分岐させる方法の両方とも試してみたり。

●一般的な設定ファイルを試してみる

「ini」「json」「xml」「yml」などがあります。
インポート / エクスポートの解説記事も探すとすぐ見つかります。

●テキストのバイナリファイルでの出力や暗号化

設定ファイルをユーザーが触れないようにしたい場合などに試してみると良いです。

●プロパティ

最初は「変数(フィールド)と何が違うのかよく分からん」という気持ちになりますが、それでも覚えるためにあえて使ってみると良いと思います。

定番な形として、変数はprivateで定義しておき実際にはpublicにしたプロパティで変数に対して値をget / setできるように記述しても良いですし、プロパティだけいきなり書いて利用してみるのでも良いと思います。

便利な点としては「getのみ」「setのみ」といった制限を与えられることと、getやsetの際に値を好きに加工することができる点かと思います。

●アクセス修飾子static

ツールの設定などを格納しておくためのクラスを作った際に、newせずに直接 get・set したい場合があります。値をメモリに常駐しておいていつでもアクセスできるようにする感じです。

●参照渡し

何かの関数の引数に変数の値だけを渡すのではなく、変数そのものを渡したい時が出てきます。そういう時に参照渡しを利用すると「あ、こういうことか」と理解できます。

●列挙体

よく例に挙げられるのは曜日ですが、monday~sundayといった汎用的に使う固有名詞の綴りをstring型で書いて渡すのは不便ですし綴りのミスを修正しようと思って探すような場合にも不便です。

そこで列挙体で定義しておいて登録順のindexで渡すという使い方ができます。

●構造体

色んな型のフィールドの集まりをまとめておくのに使います。

元々はそれだけの機能だったようですが、メソッドも定義できるようになったりしてクラスとの違いが初心者にはよく分からない感じになっています。「構造体 クラス 違い」みたいな単語で検索すると処理速度の違いとか細々とした仕様の違いについての解説が出てきますが、初心者の段階ではそこまでは知らなくて良いのかなと思ったりもします。

ジェネリック

色々な型をまとめて定義できるもの、とだけ覚えておくのでも良いと思います。

●イベントの自作

ボタンクリックイベントなどは何気なく利用していたと思いますが、イベントを自分で定義して使いたい場面が出てきます。

そうすると、理解しないといけないことが色々とあります。
例えばこちら。

・デリゲート
 コールバック
・匿名メソッド

こちらが参考になります。


ラムダ式

煩雑な記述を簡素化するスタイルですが、この存在だけでも知っておかないと調べものの際に「突然、謎の記述に遭遇した」ように見えて混乱します。

こちらの記事がとても分かりやすいと思いました。

ただ、ベテランプログラマな方に聞いても「書く側は楽で良いものの見る側にとっては可読性が悪い」ということでした。

LINQ

コレクションから簡単に望むものを取り出したり、中身を入れ替えたりと、コレクションに対して楽に柔軟に編集が可能になるもののようです。

調べものをするとたまに出てきて、ラムダ式で書かれていたりしていてよく分からないままコピペで利用することが多くなってきます。なのでラムダ式から学ぶと良さそうです。

LINQの記述が分かると、データベースとのやり取りやXMLとのやり取りがスマートに書けるようです。私の場合はこのあたりはまだちゃんと理解できていないまま使っていたりします。。

●非同期処理

ツールで何か時間のかかる処理を行っている間ツールが固まってしまい他の操作ができなくなります。それが長く続くと、ユーザーがツールをクリックした際に「応答がありません」と表示されて終了を促される状態になってしまいます(実際にはちゃんと処理を続けていて終了待ちだったとしても)。

そこで、固まらないようにしてプログレスバーを表示したり、処理中も触って問題ない他の機能を使えるようにしたりすると良さそうです。

そのために非同期処理が必要になってきます。

※随時更新

C# TreeViewの親子階層内で指定のノードを選択する

TreeViewで指定のノードを楽に選択する方法が用意されていない感じがします。

FullPathを使う方法


ノードのプロパティ FullPath で、例えば選択中のノードのフルパスを取得できます。

そうしてあらかじめ保存しておいた FullPath 情報を利用して、後からまたそのノードを選択する際に FullPath が利用できます。

ただし、同階層に同じ名称のノードがあると破綻するようです。

なので FullPath が利用できるのは、Windowsエクスプローラーのように同階層に同じ名前を許さない条件下に限られそうです。

Index を使う方法


ノードのプロパティ Index を使って順番を記憶しておいて、それを使って選択する方法です。

しかしそもそもTreeViewの仕様上、ノード自身とその1つ上の親か1つ下の子供しかアクセスできないようで、階層を辿っていくには再帰処理を自前で組んでやる必要があります。

うーん面倒。。

単純に階層関係無しにノードをツリー最上段から順に数えていって何番目かをGETして、それを使って選択できたりすると非常に楽なんですが‥例えば下図で選択中のノードは「6つ目のノード」という感じで。

f:id:moko_03_25:20190613142627j:plain

仕方ないので、再帰処理で実現したいと思います。

まずは選択中のノードのIndexと、親ノードのIndexを取得してみます。

private void GetSelNodeIndex()
{
	// 選択中のノードを取得
	TreeNode tn = treeView1.SelectedNode;

	// 選択中のノードのIndexを取得
	int i = tn.Index;

	// 親のノードを取得
	TreeNode tnP = tn.Parent;
	int iP;
	// 親がある場合
	if (tnP != null)
	{
		// 親のノードのIndexを取得
		 iP = tnP.Index;

		MessageBox.Show("選択中のノードのIndex: " + i.ToString() + "\r\n" +
					"親ノードのIndex: " + iP.ToString());
	}
	else
	{
		MessageBox.Show("選択中のノードのIndex: " + i.ToString() + "\r\n" +
					"親ノードのIndex: " + "なし");
	}
}

// GET
private void Button1_Click(object sender, EventArgs e)
{
	GetSelNodeIndex();
}

親が存在しないと例外が発生するので対処しておきます。

実行してボタンを押すとこんな感じ。

f:id:moko_03_25:20190613143215j:plain

次のステップとして、こちらを再帰処理にしてindexをコレクションに格納します。

// 変数
List<int> listNodeId = new List<int>();

// 選択ノードのIndexを取得
private void GetSelNodeIndex()
{
	// リストとラベルを空にする
	listNodeId.Clear();
	label1.Text = "";

	// 選択ノードを取得
	TreeNode tn = treeView1.SelectedNode;

	// 選択ノードのIndexを取得してListに格納
	listNodeId.Add(tn.Index);

	// 親ノードを取得
	TreeNode tnP = tn.Parent;

	// 再帰処理
	GetSelNodeRecursive(tnP);

	// ラベルに表示(とりあえず雑に)
	foreach (var item in listNodeId)
	{
		label1.Text += item.ToString() + " ";
	}
}
// 再帰処理
private void GetSelNodeRecursive(TreeNode tnP)
{
	// 親がある場合
	if (tnP != null)
	{
		// 親ノードのIndexを取得してListの先頭に挿入
		listNodeId.Insert(0, tnP.Index);

		// さらに親に対して実行
		GetSelNodeRecursive(tnP.Parent);
	}
}

うまくいきました。

f:id:moko_03_25:20190613150654g:plain

次は、GETで保存しておいたノードを後から選択します。

先ほどと逆に再帰処理でリストから順に親から子へIndexを辿っていくようにします。

// 最終的に選択したいノードを宣言
TreeNode selNode;

// 選択ノードのIndexを取得
private void SetSelNodeIndex()
{
	// リストからトップ階層のノードを取得
	TreeNode tnP = treeView1.Nodes[listNodeId[0]];
	// 最終的に選択したいノードに一旦指定
	selNode = tnP;

	// リストのIndex指定用
	int i = 1;

	// リストに子のIndex情報がある場合
	if (listNodeId.Count > i)
	{
		SetSelNodeRecursive(tnP, i);
	}

	treeView1.Focus();
	treeView1.SelectedNode = selNode;
}
// 再帰処理
private void SetSelNodeRecursive(TreeNode tnP, int i)
{
	// リストから1つ下の子ノードを取得
	TreeNode tnC = tnP.Nodes[listNodeId[i]];
	// 最終的に選択したいノードに指定
	selNode = tnC;

	// カウントアップ
	i++;

	// リストに子のIndex情報がある場合
	if (listNodeId.Count > i)
	{
		SetSelNodeRecursive(tnC, i);
	}
}

これで当初やりたかった「指定したノードを選択する」ことができるようになりました!

f:id:moko_03_25:20190613153657g:plain


しかし‥もっと良い方法がある気がします。

ご存じの方いらっしゃったらご教授ください。。