残したいユーザーブロマガ記事への投票はこちらです
PMDEプラグインの作り方 モーフ操作編2
プラグインとはいえ普通にC#なので記述の仕方はいろいろありますが、わかりやすくするために記述方法に制限をかけています。必ずこのやり方でないといけないわけではありませんのでご注意ください。
前回と同様にこのサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15755)を元に説明しますので必ずDLしてください。
この中にはモーフ操作に必要な機能をあらかじめ入れてあります。説明もそれに沿った形で説明します。また、このプロジェクトファイルの内容を流用してプラグインを作成することは問題ありません。
以下モーフ操作とそのコードを記述します。前回と同様にサンプルプロジェクトファイルにこぴぺすれば動作すると思います。
1.システム予約(隠し)モーフにする。
//まばたきモーフを隠しモーフにしてみます。
//モーフ名
string MorphName="まばたき";
//表示パネル番号
int panel=0;
//モーフオブジェクト
IPXMorph Morph=(IPXMorph)this.PMX.Morph[this.GetMorphIndex(MorphName,1)];
//表示パネル番号を設定する。
Morph.panel=panel;
2.マイナス影響度のモーフを作成する。
//まばたきモーフをマイナス方向に変化するモーフを作成します。
//モーフ名
string MorphName="まばたき";
//グループモーフ名
string GroupMorphName = MorphName + "-";
//モーフIndex
int i = this.GetMorphIndex(MorphName, 1);
//表示パネル番号
int panel = this.PMX.Morph[i].Panel;
//影響度
float Effect = -1.0f;
//グループモーフの追加
this.AddGroupMorph(GroupMorphName, "", panel, i);
//グループモーフ内Itemの追加
this.AddGroupMorphItem(GroupMorphName, MorphName, Effect);
3.プラス影響度のモーフを作成する。
//まばたきモーフをプラス方向に変化するモーフを作成します。
//モーフ名
string MorphName="まばたき";
//グループモーフ名
string GroupMorphName = MorphName + "+";
//モーフIndex
int i = this.GetMorphIndex(MorphName, 1);
//表示パネル番号
int panel = this.PMX.Morph[i].Panel;
//影響度
float Effect = 1.0f;
//グループモーフの追加
this.AddGroupMorph(GroupMorphName, "", panel, i);
//グループモーフ内Itemの追加
this.AddGroupMorphItem(GroupMorphName, MorphName, Effect);
4.頂点モーフを左右分割する。
//まばたきモーフを左右独立して動くモーフに分解します。
//モーフ名
string MorphName="まばたき";
//モーフIndex
int i = this.GetMorphIndex(MorphName, 1);
//モーフオブジェクト
IPXMorph BaseMorph = (IPXMorph)this.PMX.Morph[i];
//左右分割したモーフの入れ物を定義
IPXMorph MCloneR = (IPXMorph)this.PMX.Morph[i].Clone();
IPXMorph MCloneL = (IPXMorph)this.PMX.Morph[i].Clone();
//右側のモーフの名称の変更と中身のクリア
MCloneR.Name = MorphName + "R";
MCloneR.Offsets.Clear();
//左側のモーフの名称の変更と中身のクリア
MCloneL.Name = MorphName + "L";
MCloneL.Offsets.Clear();
//頂点モーフであることを確認
if (BaseMorph.Kind == MorphKind.Vertex) {
//元モーフのオフセット値の検証
for (int j = 0; j < BaseMorph.Offsets.Count; j++)
{
//MorphOffsetItemの生成
IPXVertexMorphOffset item = (IPXVertexMorphOffset)BaseMorph.Offsets[j];
if (item.Vertex.Position.X > 0.0f)
{
//Xの値が正のものを「L」
MCloneL.Offsets.Add(item);
} else {
//Xの値が0ないし負のものを「R」とする。
MCloneR.Offsets.Add(item);
}
}
//モーフの追加
this.UpperInsertMorph(MCloneR, BaseMorph);
this.UpperInsertMorph(MCloneL, BaseMorph);
//表情表示枠に追加
this.AddMorphFrameItem(MCloneR.Name);
this.AddMorphFrameItem(MCloneL.Name); }
5.モーフを複製する。
①モーフ自体を複製
//モーフ名
string MorphName="まばたき";
//モーフIndex
int i = this.GetMorphIndex(MorphName,1);
//モーフオブジェクト
IPXMorph CloneMorph = (IPXMorph)this.PMX.Morph[i].Clone();
//名称を変更
CloneMorph.Name=CloneMorph.Name + "+"; CloneMorph.NameE=CloneMorph.NameE + "+";
//モーフの追加
this.AddMorph(CloneMorph.Name,CloneMorph.NameE,CloneMorph.kind,CloneMorph.Panel,i);
②グループモーフとして複製
//モーフ名
string MorphName="まばたき";
//グループモーフ名
string GroupMorphName = "+" + MorphName;
//モーフIndex
int i = this.GetMorphIndex(MorphName,1);
//表示パネル番号
int panel = this.PMX.Morph[i].Panel;
//グループモーフの追加
this.AddGroupMorph(GroupMorphName, "", panel, i);
//グループモーフ内Itemの追加
this.AddGroupMorphItem(GroupMorphName, MorphName, 1.0f);
次はプラグインの中に何が書いてあるかある程度見ることが出来るツールを紹介します。