やってるゲームとかの雑記



4:ステートコントローラーとトリガー

; Taunt

; CNS difficulty: easy

[Statedef 195]

type = S

ctrl = 0

anim = 195

velset = 0,0

movetype = I

physics = S

sprpriority = 2


[State 195, 1]

type = CtrlSet

trigger1 = Time = 40

value = 1


[State 195, 2]

type = ChangeState

trigger1 = AnimTime = 0

value = 0

ctrl = 1


さて、前回の講座でステート定義は攻略済みですね。

ざっと見て何が定義されているかわかりますか?

わからなかったら前回の講座をチラ見しなおしましょう。


今回はそのひとつ下にあるこれを攻略します。


[State 195, 1]

type = CtrlSet

trigger1 = Time = 40

value = 1


注目すべきはまずここです。


[State 195, 1]


前回は[statedef 195]でしたね。

今回はdefがありません。

なぜでしょうか?


はい、そうです。既に定義(statedef)されているので、もう定義しなくていいのです

このブロックは「ステート定義」に対して「コントローラー(ステートコントローラー)」と呼ばれます。

このコントローラーの書式は、


[state ○○,コメント]


と書くのがお作法です。

というか、[statedef ○○]とまた書くとステート定義になってしまってエラーになるので

以下のことをよーく頭に叩き込んでください。


・ひとつのステートにステート定義は一個!コントローラーはいくつあってもいい!


定義がいくつもあると、MUGENさんが混乱してエラーを出します。


さて、ここだけの話をしますと195番のステートを定義したら必ずコントローラーは


[state 195,コメント]

と書かなければいけないわけではありません。

実は、こんな風にもかけちゃいます。


[state a,コメント]


・・・実は、ステートコントローラーの番号は飾りです。

ただ、ぱっと見たときにわかりづらくならないように、ステート番号を同じ番号を

つけておくのが慣例化しているだけで、別に無理に番号付けをする必要はないのです。

多くのステートで流用する記述の場合こういう風に書くことが多かったりします。


まあ、わかりづらくならないよう通常は番号をつけておきましょうね。




さて、次に下を見て行きましょう。


type = CtrlSet


このtype = っていうのはそのステートコントローラーに何をさせるかを決定します

この項目に設定できる値は、ものすごい膨大な数があって私からはとても説明しきれません。

というのも、MUGEN上で行われる処理はほぼこれによってなされているのです!

ズバリ、これがMUGEN世界の核心なのです!m9(`・ω・´)ズバッ


ここに設定されているコントローラーが何者なのかを知りたいときは

「ステートコントローラー辞典」を参照してみましょう。

答えと設定できるパラメータが掲載されています。


ここで使われているCtrlSetはCtrlをsetするというそのまんまーなステートコントローラーで、

設定できるパラメータはvalueのみというシンプルなものです。

効果は「Ctrlの可否を変更する。」

つまり、ここでは


value = 1


というパラメータを設定することでCtrlを可能にしています。

多くのコントローラーで設定できるパラメーターにvalue = という形を取っています。


 


次に、ここを見てみましょう。


trigger1 = Time = 40


こいつはトリガーといいまして、ステートコントローラーに必ずひとつ必要

「そのステートコントローラーが実行される条件」を指定するものです。

要するに、拳銃のトリガー(引き金)と同じで、トリガーが引かれるとコントローラーが動く、ということですね


コントローラーにひとつないと、エラーが落ちてMUGENが落ちます

必ずひとつ入れようね!お兄さんとの約束だ!


では複数の条件を定義し、満たされたときにそのコントローラーが

実行されるようにしたいときはどうすればいいのでしょうか。


trigger1 =

trigger1 =


こういう風にすると、両方の条件が満たされたときに実行されます。


trigger1 =

trigger2 =


こういう風にすると、1か2の条件のどちらかが満たされたときに実行されます。

では、trigger1とtrigger2で共通するトリガーを使いたいときはどうすればいいのでしょうか


triggerall =

trigger1 =

trigger2 =


このようにすると、triggerallの条件とtrigger1の条件、

triggerallの条件とtrigger2の条件が満たされたときに

このコントローラーが有効となり、実行されます。




確実にそのステートコントローラーを実行させたいときは以下のように書いてください。


trigger1 = 1


こう書くことで、このトリガーに強制的に1の値を返し、必ず実行されます。

ちょっと余計な話をしますと、MUGENのトリガーというのは成立していると1(真)の値を返し、

成立していないときは0(偽)の値を返します。この帰ってきた答えが1の時のみ実行されるので

必ず実行したいときは1、絶対に実行したくないときは0(時々デバッグのときとかに使います)と

書けばOKです。


よく使うコントローラー、よく使うトリガーなどは後ほど説明します。

今回はとりあえずこのステートを見ていきましょう。


次のコントローラーを見てみましょう。


[State 195, 2]

type = ChangeState

trigger1 = AnimTime = 0

value = 0

ctrl = 1


これはChangestateというコントローラーをAnimTime = 0をトリガーにしています。

Changestateというのは、現在のステート番号からvalueで指定したステート番号に

移行するコントローラーで、実行されると即時ステートが変更されます。

基本的にステートコントローラーの優先順位は上から順番なので、

同一のトリガーもしくは後に満たされる条件のトリガーを設定していた場合

それらの内容が実行されることはありません(違うステートに移行してしまうので)


ここで使っているトリガーのAnimTimeは「アニメ終了からの時間経過(F数)」を返すトリガーです。

AnimTime=0とした場合は、「アニメが終わってから0F経過したら」、つまり

「アニメが終了した瞬間」を示す条件になります。


ctrl = 1は移行後コントロールを可能にするというオプションです。

ステート0(立ちステート)に移行させた後に動かせないとそのキャラクターが

操作不能になってしまうので、ここではctrl = 1を設定しています。


つまり、このコントローラーは「アニメが終了したらステート0に戻ってコントロール可能に」という

意味を持つコントローラーになっています。


このChangeStateコントローラーはかなり重要で、各アクションの最後につけてやらないと

その動作をしたあとキャラクターはコントロール不能になり動かせなくなってしまいます。

そうなってしまうとゲームが成立しませんので、必ず入れるようにしましょう




まとめ



このステートの流れをおさらいすると


・アニメ195番に変更



・40F経過したらコントロール可能



・アニメが終了したらコントロール可能の状態でステート0に


という流れになっています。

以上の内容が、CNSを読んで理解できたら完璧です。


スポンサーサイト

3:ステート定義

さて、前回のキャラクターの性能を定義する部分から少し下にスクロールしていきましょう。

こんなのが出てくると思います。


; Taunt

; CNS difficulty: easy

[Statedef 195]

type = S

ctrl = 0

anim = 195

velset = 0,0

movetype = I

physics = S

sprpriority = 2


[State 195, 1]

type = CtrlSet

trigger1 = Time = 40

value = 1


[State 195, 2]

type = ChangeState

trigger1 = AnimTime = 0

value = 0

ctrl = 1


これの読み方を見ていきましょう。

基本的に、ステートは上から順番に読んでいきます。




まず最初に、これは「ステート定義」です。

[Statedef 195]

type = S

ctrl = 0

anim = 195

velset = 0,0

movetype = I

physics = S

sprpriority = 2


このステート定義は、そのステート(アクション番号)がどういうアクションなのか、

そのアクションでどういうアニメを使うのかを示します。

注釈を見てみると、Tauntと入っています。これはKFMの挑発のステートです。


ステート定義の内容を上から順番に見ていきましょう。


[Statedef 195]


これは「ステート○○番を定義します」という意味を持ちます。

これにもコメントを入れることができ、


[Statedef 195,挑発]


という風に書くことでぱっと見たときにそのステートが何に使われているかわかりやすくなるので

可能な限りどんどん入れていくのがオススメです。


当然、ここで定義するステート番号は自由ですが、

前回紹介したコモンステートとかぶる番号にするとそのコモンステートが上書きされてしまいます。

基本的に新規に作る場合は1000~10000を使います。

(もちろん、それ以下それ以上の値も設定できますが。)


次を見てみましょう。


type = S


これは「このステート実行中、キャラはどういう状態か」を示すものです。

ステート定義には必ず必要です。


設定できる値には以下のものがあり、それぞれ該当した状態であることを示します。

・S:立ち状態

・C:しゃがみ状態

・A:空中

・L:転倒中


MUGENでは動作中に攻撃を受けた場合の処理はここで見ているので、

ここの設定を間違えているとしゃがんでいるのに攻撃を食らうと立ち上がってしまったり、

空中に居るのに地上くらいが発生して地上くらい終了後に空中に立ってしまったりして

非常にかっこ悪いので必ずステートの状態に合致したステータスを定義しましょう


次はコレです。


ctrl = 0


これはコントロールの可否を示すものです。

0でコントロール不可、1で可能です。

1にすると、動作中にキーを入れると該当した動作に移行します(コントロール可能なので)。

一部の特殊なステートを除いてはここは0を指定することが多いです。

ここで0を指定すると、

「このステート実行中はプレイヤーの操作(AIの操作)を受け付けない」という意味になります。




お次はコレ。


anim = 195


これはアニメ番号の設定です。

airで設定してある該当番号のアニメが再生されます。

もちろんairに存在しないアニメ番号を指定することも可能ですが、

そうすると姿が消えてしまうので、きちんとairに存在している番号を指定しましょう。

このステートに突入した瞬間に設定されているアニメに変更されます。


次のコレ。


velset = 0,0


これは速度の設定です。

ここに値を設定してやると、ステート開始時に設定した速度でキャラが動きます。

このステートは挑発のステートなので必要ありませんが、

突進技や移動する技のときはここに値を設定します。


次。


movetype = I


これは現在の動作の種類を示すものです。typeとややこしいですが、

・type:キャラクターの立ちやしゃがみ状態などを管理する

・movetype:キャラクターの攻撃/やられの状態などを管理する

と覚えればOKです。


設定できる値は以下の通りです。

・A:攻撃動作中

・H:やられ動作中

・I:どちらでもない状態


KFMの挑発は攻撃能力を持っていないのでIを設定します。


攻撃を作るときは、必ずAを使ってください

後述しますが、Aを設定していないときに当たり判定のボックスとhitdef(攻撃判定の定義)をして

攻撃を繰り出しても相手に当たることはありません
。私もよくやります。


お次。


physics = S


これは、キャラクターの物理状態を指定します。

「物理状態ってなんだよ!?」って思うかもしれませんが、

簡単に言うと重力とか摩擦とか物理のお勉強っぽいことに関係します。


設定できる値は以下の通りで、それぞれ対応した物理的な力がかかります

・S:立ち状態。stand.frictionで設定した摩擦力を受ける。

・C:しゃがみ状態。crouch.friction で設定した摩擦力を受ける。

・A:空中。yaccelで設定した重力を受ける。

  また、これを設定したステートに居るときに地面に近づくと勝手に着地してくれる。

・N:どれでもない状態。突進技など、摩擦力や重力の影響を受けたくないときに使う。

KFMの挑発は立ち状態なので、Sを指定しています。


そして最後。


sprpriority = 2


これは一見何かわかりませんが、sprのpriority、つまりスプライトの重ね順を指定します。

通常の立ち状態のアニメを0ぐらいとして、優先度の高いほうから低いほうまでで

4~-4ぐらいの範囲で指定します。

この数字が大きいほうが前に表示され、少ないほうが後ろに表示されます。

相手との重ね順をこちらが前にしたいときは大きく、こちらが後ろにしたいときは小さく設定しましょう。




ここに登場していませんが、


poweradd =


というのを書くこともできます。

このステートが成立した瞬間にこの数値増減が成立するため、攻撃を空振りしてもゲージがたまる場合、

ゲージ技を使ったら1000パワー(MUGENでは1000パワーが1ゲージ。)減らしたいときに記述します。


poweradd = 50 ;50パワー増加

poweradd = -1000 ;1000パワー消費




また、


juggle =


というのもたまに書かれます。

このステートで繰り出される攻撃で必要になるジャグル値の記述です。

前回長々と説明したジャグル値を設定することができます。




ちなみに、今紹介した設定を全部書く必要はまったくありません。

最小限の記述はこんな感じです。


[Statedef 180]

type = S


ただし、こう設定するとアニメも変化しませんし、どういう状態なのかも変化させられませんから

よほどのことがない限り


[Statedef 195,挑発]

type = S

ctrl = 0

anim = 195

velset = 0,0

movetype = I

physics = S

sprpriority = 2


のように書きます。




一度に色々言われて頭がパーン☆って感じでしょうが、

無理に全部覚える必要はありませんw

使うたびに忘れちゃったググればいいのです。便利な時代になりましたねー。




次回はステートコントローラーの作り方と読み方を見て行きましょう!




まとめ

・[Statedef ○○,コメント] でステートを定義することができる

・パラメータは最低限はtype =のみだが、可能ならほかのものを書くのが好ましい。




2:ステータスを見てみよう

ぐだぐだ説明するよりも、実物を見ながら話したほうが早いと思うので実際にCNSを開いてみましょう。


CNSは右クリック→編集で、テキストエディタで開くことができます。

CNSを開くと一番上にこういうのが出てきます(先に変数表がついている場合もありますが)



[Data]

;Amount of life to start with

;体力ゲージの初期値

life = 1000

;Amount of power stocks to have (divided by 1000). Defaults to 3000

power = 3000

;attack power (more is stronger)

;攻撃ダメージ

attack = 100

;defensive power (more is stronger)

;体力パワー

defence = 100

;Percentage to increase defense everytime player is knocked down

fall.defence_up = 50

;Time which player lies down for, before getting up

liedown.time = 60

;Number of points for juggling

airjuggle = 15

;Default hit spark number for HitDefs

sparkno = 2

;Default guard spark number

guard.sparkno = 40

;1 to enable echo on KO

KO.echo = 0

;Volume offset (negative for softer)

volume = 0

;Variables with this index and above will not have their values

;reset to 0 between rounds or matches. There are 60 int variables,

;indexed from 0 to 59, and 40 float variables, indexed from 0 to 39.

;If omitted, then it defaults to 60 and 40 for integer and float

;variables repectively, meaning that none are persistent, i.e. all

;are reset. If you want your variables to persist between matches,

;you need to override state 5900 from common1.cns.

IntPersistIndex = 60

FloatPersistIndex = 40


[Size]

xscale = 1           ;Horizontal scaling factor.

yscale = 1           ;Vertical scaling factor.

ground.back = 15     ;Player width (back, ground)

ground.front = 16    ;Player width (front, ground)

air.back = 12        ;Player width (back, air)

air.front = 12       ;Player width (front, air)

height = 60          ;Height of player (for opponent to jump over)

attack.dist = 160    ;Default attack distance

proj.attack.dist = 90 ;Default attack distance for projectiles

proj.doscale = 0     ;Set to 1 to scale projectiles too

head.pos = -5, -90   ;Approximate position of head

mid.pos = -5, -60    ;Approximate position of midsection

shadowoffset = 0     ;Number of pixels to vertically offset the shadow

draw.offset = 0,0    ;Player drawing offset in pixels (x, y)


[Velocity]

walk.fwd  = 2.4      ;Walk forward

walk.back = -2.2     ;Walk backward

run.fwd  = 4.6, 0    ;Run forward (x, y)

run.back = -4.5,-3.8 ;Hop backward (x, y)

jump.neu = 0,-8.4    ;Neutral jumping velocity (x, y)

jump.back = -2.55    ;Jump back Speed (x, y)

jump.fwd = 2.5       ;Jump forward Speed (x, y)

runjump.back = -2.55,-8.1 ;Running jump speeds (opt)

runjump.fwd = 4,-8.1      ;.

airjump.neu = 0,-8.1      ;.

airjump.back = -2.55      ;Air jump speeds (opt)

airjump.fwd = 2.5         ;.


[Movement]

airjump.num = 1      ;Number of air jumps allowed (opt)

airjump.height = 35  ;Minimum distance from ground before you can air jump (opt)

yaccel = .44         ;Vertical acceleration

stand.friction = .85  ;Friction coefficient when standing

crouch.friction = .82 ;Friction coefficient when crouching


【重要】

「;」より右に記述された文字列は「コメント」として扱われます。

コメントとして書き込まれた記述はCNSを読み込んで実行する際に無視されるので、

例外的に日本語やコントローラー以外の記述を行えます。

コメントを利用して記述をわかりやすくしていくのがCNSを理解する第一歩になります。




CNSの最初に書いてあるのはデータやキャラクターのパラメータの定義です。

各パラメータの詳しい意味は下記のCNSのコメントに書き込んであるので参考にしてください。

(下記のCNSは私が実際に作ったキャラのCNSです。)


[Data]                     ;[キャラクターの基本性能を決めるところです。]

life = 1100            ;体力のデフォルト値

power = 10000    ;ゲージの限界値

attack = 110         ;攻撃力のデフォ値

defence = 120     ;防御力のデフォ値

fall.defence_up = 50 ;ダウン中に加算される防御力

liedown.time = 60 ;ダウン時間(F)

airjuggle = 15  ;ジャグル値

sparkno = 2  ;デフォルトのヒットスパークナンバー

guard.sparkno = 40 ;デフォルトのガードスパークナンバー

KO.echo = 0  ;KO時のボイスにエコーをかけるか否か

volume = 0  ;音量(弄ると音割れするので、弄らない方がよかです)

IntPersistIndex = 0,59 ;持ち越すvar(整数型変数)の範囲

FloatPersistIndex = 40 ;持ち越すfvar(小数型変数)の範囲




[Data]のブロックでは、キャラクターの基本性能を記述していきます。

fall.defence_upとliedown.timeの値は特に必要がなければ放置でOKです。


airjuggleは「ジャグル値」を定義するためのステータスです。

ジャグル値というのは「空中での無限コンボを防ぐためのシステム」です。

簡単に言うと、各攻撃にジャグル値を設定しておき、空中コンボをするとそのジャグル値が累積。

累積値がここで設定したairjuggleのポイントを超えると判定があたっていても攻撃が空振りし、

それ以上の追撃が強制的にできなくなります。


具体例を挙げると、airjuggleに「15」を設定したキャラに、


・ジャグル値5の打ち上げ攻撃(なんでか知らないけど打ち上げ攻撃には5を設定することが多いです)

・ジャグル値2の攻撃A

・ジャグル値4の攻撃B

・ジャグル値5の攻撃C


を当てようとすると、


・15-5=10 ジャグル値残:10 ヒット

・10-2=8 ジャグル値残:8 ヒット

・8-4=4  ジャグル値残:4 ヒット

・4-5=-1 ジャグル値残:-1 空振り


という処理になり、最後の攻撃Cは空振りしてしまいます。

そして、食らう側は無事地面へ・・・ということに。




では、

・最後の攻撃Cをやめて攻撃Aをもう一度出したらどうなるのでしょうか?

・最後の攻撃Cをやめて攻撃Bをもう一度出したらどうなるのでしょうか?


正解は、両方ヒットします。


技の性能にもよりますが、ジャグル値的にはBなら2回、Cなら1回当てることができますね。

残っているジャグル値より大きな数値の攻撃を当てることはできません。


もともと永久を防止するための仕様なのですが、最近は無視されがちです

何せ空中コンボの多い世の中ですので・・・。


とはいえ、いまだに永久防止の処理をこのジャグル値に頼っている製作者さんも多いので

一応設定しておきましょう。

「でもこれっていくつ設定すればいいの?わからないよ!」って言う場合は

デフォ値の15を設定しておきましょう。


当然ながら、このairjuggleのステータス、「(airjuggleの数値-その攻撃のjuggle値)>0」でないと

攻撃があたりませんので「0」を指定してやれば一切の空中コンボを受けないキャラなんかも作れます。

(まあ普通のキャラでそんな処理をすることはめったにありませんが・・・。)


逆に、打ち上げ攻撃に設定するジャグル値を0にしておけば相手が空中受身を取らない限り

ジャグル値を勘定する上では永久に当て続けることができますね。

通常の場合、どちらも1以上を設定しておくことを推奨しております。




そして、IntPersistIndexとFloatPersistIndexはラウンドをまたいだ際に

次のラウンドに持ち越される変数の範囲を示します。Int~が整数型、Float~が小数型です。

持ち越したい変数があるときは0,59のように書くと0~59までが持ち越されます。

変数についての詳しい説明はあとでやります。




[Size]   ;[キャラクターのサイズ関係を弄るところです。]

xscale = 0.5            ;X方向の倍率(0.5倍)

yscale = 0.5            ;Y方向の倍率(0.5倍)

ground.back = 12      ;地上に立っている時の中心線~背中の距離

ground.front = 12     ;地上に立っている時の中心線~前の距離

air.back = 12         ;空中での(ry

air.front = 12        ;空中での(ry

height = 60           ;身長(当たり判定とは関係ないですが、飛び越し処理に関係)

attack.dist = 160     ;attack distの設定

proj.attack.dist = 90  ;projectilesへのattack dist

proj.doscale = 0      ;projectilesの拡大縮小をするか(0=no 1=yes)

head.pos = -5, -90    ;頭の位置

mid.pos = -5, -60     ;胴体の位置

shadowoffset = 0      ;影のオフセット(触る必要は特にないです)

draw.offset = 0,0     ;描画オフセット(触る必要は特にないです)


次にこの[size]の部分はキャラの描画サイズや物理的なサイズを定義する部分です。


まず一番上のxscaleとyscale。

これはx(横)方向とy(縦)方向のスプライトの拡大・縮小率を決める部分です。

このステータスは倍率表示ですので、1.0とすれば原寸です。

なぜ0.5にしているのかというと、キャラをD4化するためです。

1.0倍で通常の表示をするキャラクターをD0といい、

0.5倍にして表示するキャラクターをD4といいます。


では、このD4にはどんな意味があるのでしょうか?

簡単に言うと、2ドットが1ドット分に縮小されて描画されるため、

ドットの密度が2倍になります。ドットの密度が2倍になるということは2倍の描写ができるということですね。

この倍解像度化をすることによって、より滑らかな表示が可能になります。

D4キャラを作る際は2倍の大きさで書いて0.5に設定しましょう。

別にD4じゃなくてもいいやー、って言う場合はデフォルト状態の1.0で構いません。


次にground.backとground.frontです。これはキャラクターの前後への物理的な大きさを示します。

キャラクターのあたり判定とは関係がありません。

相手キャラクターと向き合って押し合ったときに、キャラクターの中心軸から見て

このドット数がキャラクターの押し合い判定の際に用いられます。

この値は結構大事で、間違った値を設定していると相手がキャラクターの中にめり込んでしまったり

逆に触れていないのに押し合ったりするなどの不具合が起こりますので、

できるだけ見た目と当たり判定を見てぴったりの数値になるように設定しましょう。

相手を押したときに、なぜか相手がガタガタしてしまうときはこの数値がきちんと設定されていない

(当たり判定から大きくはみ出ている)事が原因の場合が多いです。


air.backとair.flontは空中に居るときの押し合い判定です。同じくきちんと設定してやりましょう。


heightはキャラクターの物理的な高さの設定・・・ですが、身長と同じドット数だけ設定する必要はありません。

背の高いキャラクターの場合、スプライトの身長と同じドット数に設定してしまうと

ジャンプ力の低いキャラクターが飛び越えることができなくなるので、

場合によっては身長と同程度ではなくキャラクターの腰ぐらいの高さに設定しておくと良いです。


attack.distはこちらが攻撃したときに、相手がガードポーズを取る距離です。

簡単に言うと、自分の攻撃が届く最長距離の事です。

攻撃の記述をするときに個別に記述することができますが、

何も記述しないと自動的にこの値が用いられます。

attack.distの値が小さく設定されすぎていると、MUGEN標準のAIはガードすることができず

CPU戦時になぜか相手が攻撃をガードしない・・・ということになってしまいますので

大きめの値を設定しておきましょう。

よくわからないときはKFMと同じ160を設定しておけばOKです。




head.posとmid.posはキャラクターの頭の位置と中心(腰)の位置です。

なんのこっちゃわからないと思いますが、たまにトリガーとして参照されることがあるので

きっちりと値を設定しておきましょう。


shadowoffsetとdraw.offsetはそれぞれ影とキャラの描画のオフセットの調整です。

オフセットってなんぞや?って感じですが、ここに数値を記述すると

記述した数字のぶんそれぞれの描画がずれます。基本的には使いません。




[Velocity]  ;[キャラクターの移動性能を決める部分です。]

walk.fwd  = 0.9       ;前に歩く速度

walk.back = -0.9      ;後に歩く速度

run.fwd  = 5.0, 0     ;前にダッシュする速度

run.back = -4.5,-3.8  ;バックステップの速度

jump.neu = 0,-8.0     ;垂直ジャンプの速度

jump.back = -3.25     ;後ジャンプの速度

jump.fwd = 3.5        ;前ジャンプの速度

runjump.back = -2.55,-8.1  ;ダッシュジャンプ(後)の速度

runjump.fwd = 4,-8.1       ;ダッシュジャンプの速度

airjump.neu = 0,-8.1       ;二段ジャンプですが、このキャラには関係ないです

airjump.back = -2.55       ;同上。

airjump.fwd = 2.5          ;同上。


次に[Velocity]の部分はキャラクターの動作関連を決める部分です。

ここはお好きな値を設定してください。

各項目の意味はコメントのまんまです。




[Movement]  ;[空中ジャンプ、摩擦、重力等の設定]

airjump.num = 0       ;空中ジャンプの回数です。いらないので0です。

airjump.height = 35   ;空中ジャンプに必要な最低の高さです

yaccel = .44          ;このキャラクターにかかる重力です

stand.friction = .85   ;立ち状態のときの摩擦力です(押し合ったときに関係)

crouch.friction = .82  ;しゃがみ状態の時の摩擦力です


[Movement]は動作の設定です。

多段ジャンプの設定や、摩擦力を設定します。


yaccelはキャラクターにかかる重力を設定します。

基本的にデフォルト値からいじる必要はありませんが、ジャンプをふんわりさせたい時などは

この値を小さく設定してみてください。


摩擦力は相手のキャラに押されたときにどれぐらいすべるかを示します。

体重が重たいキャラはこの値を大きく、軽いキャラや浮いているキャラはこの値を小さく設定すると自然です。


 


以上で、CNSファイルのステータス定義部分は終了です。

この部分はキャラクターの基本動作にかかわる重要な部分なのでよく考えて設定しましょう。




まとめ

・CNSの最初に書いてあるのはキャラのパラメータを決める部分。

 


「キャラ製作に興味はあるけど、何をどうすればいいのかわからない!」

「CNSの読み書きの解説がググっても出てこない!」

という声にお応えするための超テキトーかつテキトーな「よいこのためのCNS入門」。

最後まで読めば基本的なCNSの読み書きができるという感じになるといいですね(願望)。


書いてる人がテキトーなのでかなりテキトーです。

サイキョー流ぐらいのレベルだと思ってくれれば大丈夫です。


1:CNSってなんだ?

CNSファイルはMUGENキャラクターの動きを定義した情報を書き込んでいくファイル、

わかりやすく言うとキャラクターという俳優を動かすための台本です。

キャラクターは台本に書いてある内容しか演技ができません。

基本的にキャラクターは台本に書いてある内容を100%正確に実行しますが、

一切のアドリブは行いません


ただし、例外的に「全ての俳優が共通で演ずる必要がある部分」はMUGEN側で

「コモンステート」(common:共通の)として用意されており、

キャラクター製作者が1から全て台本に書き込まなくても勝手にやってくれます。

(「必須スプライト」はこのコモンステートで使う絵です。)


では、その共通の動作(例:歩く・走る・ジャンプ・くらい動作)が変わった動きをするキャラクターは

どういう風に作ればいいのかお分かりでしょうか?


・・・はい。

自分で台本に「こういう動きをしろ」というのを書き込めばOKです。


例として、ダッシュをラン(キー入力すると地上を走る)ではなく

ステップ(小ジャンプして一定距離を進む)にしてやりたい場合は

CNSファイルの中に100番のステートとしてステップをする記述をしてやれば

ランタイプのダッシュでなくステップが出ます。




まとめ

・CNSはキャラを動かすのに必要な台本

・必ず必要な動作は「コモンステート」として既に定義されている

・コモンステートは新たに記述することで上書き可能。