7080 + 1

ゲームプログラミングの記事を書いてます。

質問サイトをコピペして機械翻訳しただけのサイトを検索から除外する

最近プログラミング関連の言葉を日本語で検索すると、おそらく英語の質問サイトにあるものを丸々コピペして機械翻訳しただけのようなサイトがトップに出てくることが出てきました。
こんな感じです。
f:id:atori708:20201019105540p:plain

何と一番最初のページ以外はすべてそれに該当します。
特に StackOverrun というのをよく見る印象です。
検索する上で邪魔でしかない存在です。

対策

Google検索は、検索バーに 「-site:xxx」と入れるとそのサイトを検索結果から除外してくれます。
適用すると以下になります。
f:id:atori708:20201019110138p:plain

はてなブログなどよく知るサイトがトップに来るようになりました。
平和なインターネットです。

常に除外するサイトを登録しておくアドオンもあるみたいです。(Chrome)

【Unity】Inspector のプロパティを日本語で表示する

デザイナーやプランナーが Unity を触るとき、英語に不慣れなことが多く、日本語にできないかという要望がありました。
新しく PropertyAttribute、PropertyDrawer を実装することで、以下のようにすることができます。

public class Example : MonoBehaviour
{
    [SerializeField, Label("数字を入れてね")]
    int value = default;
}


実装

LabelAttribute の中身は以下になります。
Editor フォルダに入れる必要はないです。

【Unity】特定のフォルダ以下にある特定の Object をリストで取得する

久しぶりの更新です。
よく書く割に地味に書き方を忘れるので、自分用のメモ代わりに書きます。
System.IO を使えば結構簡単にできます。
directoryPath 以下にある T型を持ったアセットをすべて取得してきます。

IReadOnlyList<T> FindAllAsset<T>(string directoryPath) where T : UnityEngine.Object
{
    List<T> assets = new List<T>();
    var fileNames = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories);

    foreach (var fileName in fileNames)
    {
        var asset = AssetDatabase.LoadAssetAtPath<T>(fileName);
        if (asset != null)
        {
            assets.Add(asset);
        }
    }

    return assets;
}

※LoadAllAssetsAtPath() は使っていないので、ネストになってるアセットまでは取得できません。

【VSCode】おすすめ拡張一覧

お久しぶりです。更新しなさすぎて広告が出るようになってしまったので久しぶりに更新します。
VSCodeのおすすめ拡張をズラリと列挙します。
これは絶対入れるべき!というのばかりなのでぜひ試してみてください。
おすすめ順で列挙します。

多分誰にでもおすすめ拡張

  • Trailing Semicolon

神。待ってた。Ctrl+;でその行の最後にセミコロンを打つor削除してくれるだけの拡張。
地味だけど一番使用頻度は高い。

  • jumpy

最強。マウスをあまり使わずにいろんな場所に飛べる。
キーボードから手を離す時間を極力なくすことで作業速度を上げるのです。

  • Multiple clipboards for VSCode

クリップボードの拡張。Ctrl+Shift+Vで昔のコピー履歴を辿れる。
コピペのショートカットはよく押し間違えるので重宝する。

  • Trailing Spaces

不要な箇所にあるスペースやタブをハイライトしてくれる上に、削除もしてくれる。
"trailing-spaces.trimOnSave": trueにすると保存時に削除してくれるので必要ならどうぞ。

  • GitLens

Git用拡張。誰がいつこの行を変更したかをいつでも見れる。他にもGit関連の機能がいろいろあるみたい?

  • ExcelViewer

ExcelCSVが見れちまうんですよ!

ローカルで履歴を管理してくれる。
バージョン管理使ってても極稀にやらかしてしまった時の最終手段に。

  • TODO Parser

// TODO とコメントしておけば、フッターにTodoをタスク表示してくれる

Unity・C#使い向け拡張

C#使うなら必要かなと。

  • C# XML Documantation Comments

コメントのスラッシュを3回打つと<summary>が打てるようになる。

  • Mono Debug
  • Unity Tools
  • Debugger for Unity

Unity使うなら必要かなと。

  • ShaderLabVSCode

UnityのShader用拡張。確かシンタックスハイライトとインテリセンスに対応する拡張。

蛇足

拡張じゃないけど毎回インストールする度にいじってる設定を書いておく。

  • "editor.codeLens": false,

reference数の表示設定。うざいので消してる。

  • "editor.showFoldingControls": "always"

コード折りたたみの表示設定。デフォルトはマウスオーバーで表示になってる。

  • "csharp.suppressDotnetInstallWarning": true

起動時に.NET CLIがどうたらって言ってくるの無視

最後に

拡張独自の設定もあるので、ちょっと変えたいなとか思った時は拡張のリファレンスを見るべし。
セミコロンが必要な言語だったらTrailing Semicolonは入れるべき。入れて。

【Unity】ImageEffectを使わずにポストプロセス処理をする

始めに

ImageEffectを使うと、オリジナルのポストプロセスを書けるのはUnityの機能として以前からありました。私もポストプロセスでステンシルバッファを使った描画処理をやっていたのですが、Unity2017.3にアップデートした途端に挙動がおかしくなってしまったのです...。

色々と調べてみた結果、ImageEffectを使わずにポストプロセスをする方法を思い付いたので記事にします。

ちなみに、ステンシルバッファをImageEffectでは使えないのかというと、そんなことはないです。Unity2017上でもちゃんと動く方法はありますが、今回の本筋からは外れるので、別記事にします。そのうち書こうと思うで、少々お待ちください。

では、ImageEffectを使わずにどうやってポストプロセスをするのか、書いていきます。

実装

結論を言葉だけで説明すると、

  • uGUIのImageでカメラを覆って、GrabPassを使って描画する。(RenderQueueは一番最後になるように設定)

になります。具体的に説明します。

・用意するもの
ポストプロセスで使うシェーダ
uGUIのImage

以上になります。
まず、uGUIのImageをシーン内に置いてください。これ用のCanvasの設定が必要なので、新規Canvasの子で作ったほうがいいかもです。
で、Canvasの設定を以下のようにしてください。
f:id:atori708:20180325000903p:plain

RenderCameraはポストプロセスをかけたいカメラです。
PlaneDistanceは他のオブジェクトより絶対前になればどこでもいいですが、カメラのnearプレーンのすぐ近くにしておけば安心だと思います。今回はMainCameraのnearと同じ数値にしています。
これでカメラがImageを一番前面にして描画するようになります。
また、Imageはカメラを覆うようにWidth,Heightともにstreachにし、Materialにポストプロセス用の奴を適用します。
f:id:atori708:20180325001239p:plain

次にシェーダの方です。この記事を見ている皆さんには、恐らくImageEffectで適用していたシェーダがすでにあると思います。それを少し編集するだけでいいです。
編集するのは2箇所になります。

  • RenderQueueをとにかくでかい数値に
  • GrabPass{}を追加する

RenderQueueは大きいほど後に描画されます。とにかくでかくすることで、他の全ての描画が終わった後に描画を走らせます。
そしてGrabPassにより、_GrabTextureに描画後の結果が入ってきます。なので、_GrabTextureをシェーダでいじってやれば、ポストプロセスで処理することができる。というわけです。

一応ものすごくシンプルなシェーダを、ImageEffectと今回のパターンの両方載せておきます。
色を反転するポストプロセスシェーダです。変化している場所を見比べてください。


この方法だとImageEffectに比べて、カメラのMSAAをONにしててもステンシルバッファを取得出来るというメリットがあります。ただ、Unityが推奨しているポストプロセスのやり方ではないので、なにか予期せぬことが起きるかもしれません。実機等でちゃんとテストしてみてください。

なんかわからんけどImageEffectうまく動かねえって人は今回の方法を試してみてはいかがでしょうか。

【Unity】Redoのショートカットを変えた~い【Windows】

※これはWindowsのUnityだけの話です。

事始め

UnityのショートカットはUndoがCtrl+ZRedoCtrl+Yになっています。この2つは昔からショートカットで定番となっており、ほとんどのソフトウェアで使えるものだということは、皆さんご存知のとおりです。

しかし、ここ数年のWindowsのソフトでは、Ctrl+Shift+ZでもRedoが出来るものが増えてきています。これはCtrl+Yよりも指を動かす量が少ないのでとても快適です。私の場合、一度慣れるとCtrl+YRedoをすることはほとんどなくなりました。
Ctrl+Shift+Zに対応していないソフトはその瞬間に使う気力をなくします。手を大きく広げてYに指を伸ばす事の醜さったら目も当てられないですね。

恐ろしいことにUnityはCtrl+Shift+Zに「未だに」対応していません。これはWindowsユーザにだけ与えられた特別な足枷です。ショートカットキーを変更することすら許されていません。Unity Technologiesは一体何を考えているのでしょうか?

...前口上が長くなりました。Unity最高!

本題

Unityはエディタ拡張を書くことでショートカットキーを増やすことができます。指定したメソッドを呼び出すので、自分で書いた処理をショートカットキーで呼び出すことも可能です。
で、今回のRedoのショートカットを増やす拡張がこちら。

単純なので説明するまでもないですね。メニューにRedoが追加されちゃいますけど、まあ気にならないと思います。
これで明日から快適なUnityライフを送れますね!

【Unity】リッチテキストを使うためのstring型の拡張メソッドを書きました

Unityで表示される文字(ConsoleログやuGUIのテキストなど)はリッチテキストに対応しています。
タグを付けると、色を変えたりサイズを変えたり出来るんですね。

f:id:atori708:20180304201234p:plain

ちなみに対応してるのは色・サイズ変更、ボールド、イタリックの4種類みたいです。
いちいちタグを着けるのは面倒くさいので、拡張メソッドを書きました。

100%車輪の再発明だけど気にしない。