ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

メインコンテンツ目次

●ニュース

Unreal Engine 4UE4)について書いた記事(主にVFX Artist向け)

エフェクトツールを使ってできること
エフェクトのワークフロー

テクスチャのインポートについて
テクスチャのプロパティについて
テクスチャのフォーマットについて

マテリアル作成の基本的な知識
最終マテリアル入力の各ポートについて
パーティクル向けのマテリアルの設定について

BISHAMONについて書いた記事

BISHAMONの最初のステップ
BISHAMON Personal v1.8 の新機能について
BISHAMONへのカメラのインポートについて

●Houdiniについて書いた記事

Houdiniの学習について
Billowy Smokeを使った煙のチュートリアル(前半)
Billowy Smokeを使った煙のチュートリアル(後半)

Mayaについて書いた記事

MELの最初のステップ
MELのウインドウ作成について
MELでシェーダー作成 1
MELでシェーダー作成 2
MELスクリプトのある場所を参照する
MELを配布する時のプロシージャについて
UVの正規化
頂点カラーを別のモデルに転送
テクスチャの色を頂点カラーに転送

Photoshopについて書いた記事

Photoshopのスクリプトを書いてみる

C#やプログラム全般について書いた記事

C#のはじめ方
C# ソリューションの基本的なファイル構成について

C#で正規表現による置換を行う
C# DataGridViewの主なプロパティ

C#で作ったツール一覧

GitHubでのツールやソース公開について(CGアーティスト向け)
ライセンスについてのメモ

●その他の記事

数学が苦手な人向けのCG数学シリーズ

イチオシゲームエフェクトアレコレ

処理速度と処理量のお話 ms(ミリセカンド)について
ドローコールについて

おおまかな開発コストの計算方法
おおまかなゲームソフトの売り上げの計算方法

勉強会開催のすすめ
大阪・京都の貸し会議室メモ

続きを読む

C# タスクをリスト管理するツールの基礎となるサンプルデータを公開

現在、個人向けお気楽タスク管理アプリ「TaskQuest」を製作中で、2018年内にリリースしたいと目論んでいるのですが、”タスクを登録したり完了するとドット絵キャラのレベルが上がってステータスに応じてジョブチェンジする”という要素がウリというものになっています。

しかし、業務で使用したい人に「そんな要素いらないのでオプション設定で非表示にしたい」みたいな要望も出るだろうなあ~と想像しているのですが、その代わりになるかは分かりませんが、私のようにC#初学者で同じようなツールを作ろうと思っている方向けにタスク登録してリスト管理するツールのベースになるサンプルをGitHubにアップしました。

こちらを用意した元々の理由は、TaskQuestの制作を進めるにつれリスト操作周りのコードがごちゃごちゃして不具合を修正しにくくなっていき、実装したいいくつかの機能がうまく動作しない状態になってしまっているので、その道のプロの方にスマートな実装方法を聞くために用意したデータになります。。

なのでそれらの実装周りが一通りうまくいったらまた記事にまとめたいと思っています。

ちなみに見た目はこんな感じです。

f:id:moko_03_25:20181108020032j:plain

ボタンによるタスク追加・タスク複製・タスク削除と、タスク追加時の優先度と進捗をプルダウンから選べる要素、そしてDataGridViewコントロールを使用したリストのフィルタを実装した状態のものになっています。

最低限の部分しか設定していない状態になっていて、凝ったことをしないならこちらを元に編集していくと作成が楽なのではと思います。

ひとつ注意なのは、DataGridViewへのDataTableのバインディングや各列のデフォルト設定はフォームデザイナ上で行っており、Form1.cs上にそのあたりのコードはほとんど書いていないという点です。

デザイナ上だと具体的にどういった設定手順になるかはこちらに記載しています。

なので調べ物をする際にサンプルが出て来にくい、どういった設定をしているのか把握し辛いというのがネックになってしまっているとは思います。

それでも、何かしらの一助になれば幸いです!

C# DataGridViewの列の値に0から始まる番号を入力する

DataGridViewに「No」という列があったとして、

 

// 行数をカウント
int count = RowsCount();

// Noを振り直す
for (int i = 0; i < count; i++)
{
    dgv[0, i].Value = i;
}


とか、もしくは‥

// Noを振り直す
int i = 0;
foreach (ar item in dgv.Rows)
{
    dgv[0, i].Value = i;
    i++
}


とかで可能な訳ですが、これはあくまでDataGridVIew上の並び順で値を0から入力していきます。

例えば列ヘッダーをクリックして昇順ソートした状態で実行すると、ソートされた並び順で番号が入力されていってしまいます。

つまり、内部データである DataTable での並び順と一致しなくなってしまいます。

なので DataTableの行情報にアクセスして値を書き替えてあげる必要があります。

このような感じ。

// Noを振り直す
int i = 0;

foreach (DataRow r in taskDataSet.taskDataTable.Rows)
{
    r["No"] = i;
    i++;
}


といった感じで実行することで、うまくいきました。

C# DataGridViewにDataTableをデザイナでバインドしている際のフィルタのサンプル

Visual Studioデザイナはコントロールの作成やプロパティの設定などをGUIを通して直感的に作業でき、ほとんどコーディングせずに制作できてしまうのでプログラム初心者には大変ありがたい機能です。

しかしその反面、何か困った時にデザイナを使った場合の解説がなかなか見つかりません。

例えば DataGridView に DataTable をバインドした場合のケースです。

こちら詰まったのでメモっておきたいと思います。

続きを読む

C# DataGridViewの表示がおかしくなった時の対処法

Visual StudioDesigner(デザイナ)を使用して DataGridView を作成&編集していると、DataTableの列ヘッダー情報を更新しても表示に反映されなかったり、突然 DataGridView そのものが表示されなくなったり、列ヘッダーをクリックして昇順・降順ソートをした際の▼マーク(グリフ)が表示されなくなったりと、表示の不具合が色々と起こります。

DataGridViewコントロールやプロパティを全てコードで記述している場合には起こらない、Designer使用時ならではの不具合のような気がします。

そんな時の対処方法についてメモっておきたいと思います。

続きを読む

C# DataGridViewのソートとフィルタのサンプル

WindowsFormでのDataGridViewのソートとフィルタのサンプルです。

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

【C#入門】DataTableの使い方(Select、Sort、Compute、LINQも解説) | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

DataGridコントロールで並び替え順やフィルタを指定するには?:.NET TIPS - @IT


外観はこんな感じ。

f:id:moko_03_25:20181004002856j:plain

コードはこんな感じ。

Formpublic partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // データセットを作成
    DataSet dataSet = new DataSet("タスク管理");

    // データテーブルを作成
    DataTable table = new DataTable("Table");

    private void Form1_Load(object sender, EventArgs e)
    {
        // データテーブルに列を追加 table.Columns.Add("カテゴリ");
        table.Columns.Add("内容");
        table.Columns.Add("優先度");
        table.Columns.Add("進捗");

        // データセットにデータテーブルを追加
        dataSet.Tables.Add(table);

        // テーブルにデータを追加
        table.Rows.Add("要望", "レベル", "低", "進行中");
        table.Rows.Add("バグ", "固まる", "高", "進行中");
        table.Rows.Add("追加", "ボタン", "中", "未着手");
        table.Rows.Add("要望", "入力欄", "高", "完了");
        table.Rows.Add("バグ", "止まる", "中", "進行中");
        table.Rows.Add("バグ", "落ちる", "低", "未着手");
        table.Rows.Add("追加", "設定済", "高", "完了");
        table.Rows.Add("要望", "最前面", "中", "完了");

        // データグリッドにテーブルを表示する
        this.dgv.DataSource = table;
    }

    // ボタン「Sort」を押す
    private void button1_Click(object sender, EventArgs e)
    {
        // ソートの指定
        table.DefaultView.Sort = "カテゴリ ASC";
    }

    // ボタン「Filter」を押す
    private void button2_Click(object sender, EventArgs e)
    {
        // フィルタの指定
        table.DefaultView.RowFilter = "進捗 <> '完了'";
    }
}

 

「Sotr」ボタンを押した場合。カテゴリ欄が昇順でソートされました。

f:id:moko_03_25:20181004002900j:plain

「Filter」ボタンを押した場合。進捗が完了のもの以外を表示しました。

f:id:moko_03_25:20181004002905j:plain

ひとまずメモでした!

C# カラー管理クラスを考える

Formのコントロールの各色をRGB値でカラー指定したいという場合に「カラー管理クラスを作った方が良さそうだな」と思い、色の値を扱うプロパティを試してみました。

テストで作成したのはこちら。

f:id:moko_03_25:20180927012732g:plain

コードはこちらのような感じ。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // ボタン1クリック
    private void button1_Click(object sender, EventArgs e)
    {
        MyColor mc = new MyColor();

        // 配列の場合
        this.panel1.BackColor = Color.FromArgb(mc.c[0], mc.c[1], mc.c[2]);
    }

    // ボタン2クリック
    private void button2_Click(object sender, EventArgs e)
    {
        MyColor mc = new MyColor();

        // カラーインスタンスの場合
        this.panel1.BackColor = mc.col;
    }
}

// カラー管理クラス
public class MyColor
{
    // 配列を扱ったプロパティ
    public int c { get; set; } = { 200, 120, 70 };

    // カラークラスを使ったプロパティ
    public Color col { get; set; } = Color.FromArgb(70, 150, 200);
}


配列のプロパティとColorクラス型のプロパティのどちらも大丈夫そうですね。

カラー値を取り出す際にはColorクラス型の方が楽ですが、値を設定ファイルに保存して次回起動時に反映させるのは配列型の方が楽ですかね。。

ということは、配列のプロパティとそのプロパティを利用してColorオブジェクトを生成するメソッドを用意するのが良いのかな?

という訳で下記のような感じで試してみたところ、こちらも問題ないようでした。
これなら呼び出すのは楽。。

▼呼び出し側 ボタンクリックイベント
this.panel1.BackColor = mc.MakeRGB();

▼クラス側
// 配列を扱ったプロパティ
public int color { get; set; } = { 200, 120, 70 };

// Colorオブジェクト生成メソッド
public Color MakeRGB(int i)
{
    Color c = Color.FromArgb(i[0], i[1], i[2]);
    return (c);
}

 
また、こんな風に set は配列だけど get は Color型‥みたいな書き方はできないのかな?
まだ知らないだけでできそう。

// set は配列だけど get はColor型‥はダメでした
public int c
{
    get { return (Color.FromArgb(this.c[0], this.c[1], this.c[2])); }
    set { this.c = value; }
}


何か分かったら追記予定。