⑨unity2D アクション サラリーマン忍者 2人目キャラの動画
2人目キャラ「忍者谷口」できました…めちゃくちゃ疲れた。
コメントで意見いただけると嬉しいです。
⑧時間の管理について(Time.deltaTime関数を超わかりやすく!)
Time.deltaTimeは直近のフレームからの経過時間を示す
となっていますが、ど素人で全くわからなかったので、解析しました。
超分かりやすく説明します。
要は、よーいスタート! という関数でした。
①敵のBukiのtagの攻撃をうけたら、ダウンする(トリガー指定)を作る。
これは衝突判定であるOnCollisionStay2Dを使用します。
使い方は簡単。1回目、2回目と敵のパンチがあたったら、timeが増えて行って、合計1秒以上攻撃を受けたら、ダウンするというトリガーを出す関数をつくりました。
まず、スクリプトの上ので
public float time = 0;
を指定します。
public に指定すると、timeが増えていく所が画面のInspector で目でみて確認可能!
void OnCollisionStay2D(Collision2D collision)
{ if (collision.gameObject.tag == "Buki" )
{ time = time + Time.deltaTime; if( time >= 1.0f )
{ Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Down");
//そして、ダウンしたら、timeをゼロに戻す
time = 0; }
}
}
これで、敵のパンチを受けたらtimeがたまっていき、1秒を超えたらダウンする。
そしてtimeが0に戻る というスクリプトができました。
これがパンチ受けた1発目で0.36秒タイムが増えているのがわかります
これが何発か敵の攻撃をうけて、timeが1秒を超え、ダウンして、timeが0に戻ったところです。
②ため攻撃を作る。
Update関数ただTime.deltaTime関数 を入れると、画面のInspector timeがずっと増え続けるだけです。
これは、スタートしてからの経過時間を使うのに使えます。
ため攻撃はボタンを押してる時だけtimeをふやしたいので、
Update関数にif分で条件をつけます。
//Fire1を押している間、timeが増え続ける
if( Input.GetButton("Fire1")
{
time = time + Time.deltaTime;
//3秒を超えたら、強烈殴打攻撃トリガーをだす
if( time >= 3.0f ) { Animator myAnimator = GetComponent<Animator>(); myAnimator.SetTrigger("kyoretsuouda");
//そして、timeをゼロに戻す time = 0; }
}
アニメーションで通常攻撃より3倍とか強力な攻撃を作り、
kyoretsuoudaのトリガーで推移するようにすれば、
”ため攻撃”の完成です!
時間管理 分かりやすかったでしょうか…ではまた!
⑥unity2Dの衝突判定について 無限ジャンプしないために
みなさまおはようございます。5時53分です。
月曜日はいやですね…本当に会社めんどくさい。あああ…
って言ってないで、やる気出すためにブログを更新しようかと
衝突判定ですが、簡単にメモします
地面との衝突判定
public class kihon : MonoBehaviour {
public bool ground = false; //と通常はfalseとしておいて
//2Dの物体がground Tag に接していると、
void OnCollisionStay2D(Collision2D collision)
{
if (collision.gameObject.tag == "ground" || collision.gameObject.tag == "Mono")
{
ground= true;
}
}
//2Dの物体がGround Tag から離れると
void OnCollisionExit2D(Collision2D collision)
{
{Animator myAnimator = GetComponent<Animator>();
myAnimator.SetBool("Grounded", false);}
if (collision.gameObject.tag == "ground" || collision.gameObject.tag == "Mono" )
{
jump = false;
}
}
と ground に OnCollisionStay2D (2Dの物体がふっついているとき)
”true” とする という内容です。はい。余裕でみなさん知っていますね。
ただ、ブログでこれを外すわけにもいかないので(笑)
で、これをどうつかうかというと、
//ジャンプ
public class kihon : MonoBehaviour {
public float jumpPower = 300f;
//guoundに接しているときにJumpぼたんを押すと
if(Input.GetButtonDown("Jump") && ground ) ←ここでつかいます!
void Update () {
{
// jumpPower 分 上に力をあたえる
rigidbody2D.AddForce(Vector2.up * jumpPower );
Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Jump");
}
}
}
と ground に接しているときじゃないとJump できないわけです。
無限ジャンプを回避しているわけですね。
ジャンプ成功!
衝突判定の注意は、3Dの物体と2Dの物体はぶつからないということです。
Collision2D とCollision は当たらない。不便だ…どうにかならないかな。
ではまた!
⑤Unity2Dのアニメーションを作りました!
主人公のアニメーションがやっとできました!1か月かかった…
Animatorタブを開けば、そのキャラのすべてのアニメーションが見れます。
これがすべてです。
ものすごい複雑化しましたが、このunityアニメーション設定は非常にシンプルで
面白い。
まず、緑のAnyState は、どのような状態からでも、アニメーションへ移れる
というものです。
例えば、敵から攻撃をうけて、dmageのステートになっていても、Panchはだせる
といった感じです。
また、昇竜拳などの必殺技中でも、当たらない!と判断したら、パンチをだせば
昇竜拳がキャンセルできる「キャンセル技」にも適応できます。
オレンジはデフォルトステートで、トリガーなどの命令がない場合は、ここに
自動的になります。今回は 待機 をデフォルトにしています。
要は「黙ってボタンを押さなければ、立っている」 という状態になります。
青のステージはその中にひとかたまりのアニメーションが入っています。 影走りの術とか!
AnyState からでている ”→” をダブルクリックするとtransition(推移)設定
になります。
ここで関係するのは一番上の赤丸 Atomic これは、他のトリガーがあっても、必ず
実行される というもの。
例えば 歩いていても、Fire1を押したら、パンチがでます!
二個目の赤丸は 推移のブレンド設定。
今回は素早いパンチを出したいので、ブレンドは ”0秒”
0.05秒 に ブレンドラインを設定しました!
これが 例えば1秒 にブレンドラインをすると、
パンチ 遅! ってなっていらいらするのです。
三個目の赤丸はconditions で、これが トリガーやBool を設定するところです。
前回設定した、パンチのトリガー
(C#でFire1を押すと、PANCHの引き金が引かれる)
をセット。
これで パンチが完成! Fire1を押すと パンチでた!
特殊攻撃もつくれます。stateを2こ用意して、
Fire2 で1個Runstateへ移動 また Fire2 で1個影走りstateへ移動
忍法「影走りの術」 完成! 敵から瞬時に逃げれます!
他に、敵を吹き飛ばす「気功術」 や 「影火の術」 や 「手裏剣」
などのアニメーション推移もできました!
次回は、地味ですが "設置判定" をど素人が説明します!
④主人公の動きの スクリプト(C#)を作りました!
ついにプログラムに手を出しました。
unityには C# と Javascript と Boo がありますが、
だいたい最後には C♯に落ち着くようです。
まずAdd ComponentからNew Script をクリック!
script名を入力するとinspectorに作成されるので、
script名をダブルクリックすると、MonoDevelopが起動します。
scriptは2つの処理が代表的なものになっています。
1つ目はvoid Start()で、
開始直後に行われる処理になります。
たとえば、忍者が上から下りてくるときに右手をあげているポーズ(トリガー)
を登録しておけば、スタートの時だけ、そのポーズをとります。
例:
void Start ()
{ Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Jump"); }
これは、スタート直後はJumpというトリガー(引き金)をセットするという
プログラムです。
2つ目は、毎回更新されるvoid Update ()です。
たとえば、パンチをだしたい!ってときには、Fire1ボタンを押したら
パンチのトリガーがセットされるというものです。
ちなみに、ダブルスラッシュの後にメモが書けます。
//○○~ でメモっておくことで、自分の書いたスクリプトを忘れずにすみます。
例:
void Update () {
//Fire1を押したらパンチのトリガーをセットする
if( Input.GetButtonDown("Fire1"))
{ Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Panch") ; }
//Fire3とFire2を押し続けたら、防御のboolをセットする
if(Input.GetButton ("Fire3") && Input.GetButton ("Fire2") )
{Animator myAnimator = GetComponent<Animator>();
myAnimator.SetBool("Bougyo", true );}
else {Animator myAnimator = GetComponent<Animator>();
myAnimator.SetBool("Bougyo", false);}
//Fire2またはFire3を押し続けたら、Runをトリガーする。
if(Input.GetButton ("Fire3") || Input.GetButton ("Fire2"))
{Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Run");
}
//Fire2またはFire3が押されていないときはTaikiをトリガーする。
else {Animator myAnimator = GetComponent<Animator>(); myAnimator.SetTrigger("Taiki");}
//(忍術に使用)発動条件1 Fire2がおされたら、発動条件1をトリガーする
if(Input.GetButtonDown("Fire2") )
{ Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Hatudou");
}
//(忍術に使用)発動条件2 Fire3がおされたら、発動条件2をトリガーする
if(Input.GetButtonDown("Fire3") )
{ Animator myAnimator = GetComponent<Animator>();
myAnimator.SetTrigger("Hatudou2");
}
ボタンを押すと発動するプログラムは3種類あり、
- Input.GetButtonDown("Fire2") はボタンが押されたらという意味
- Input.GetButton("Fire2") はボタンが押されつづけたらという意味
- Input.GetButtonUp("Fire2") はボタンが離されたらという意味
です。
また、アニメーションへの伝達は今回2つ使っています。
- myAnimator.SetTrigger("Panch)はイベントを発生させるためのもので、ボタンが押されたら、パンチの条件イベントが発生する という意味です。
- myAnimator.SetBool("Bougyo", true )はmyAnimator.SetBool("Bougyo", False )とセットで使うもので、Falseが命令されるまでは、trueの命令が続きます。
たとえば、ボタンが押されている間は防御される(true)
if(Input.GetButton ("○○"))
{Animator myAnimator = GetComponent<Animator>(); myAnimator.SetBool("Bougyo", true );}
で離れたら防御をやめる(false)
else {Animator myAnimator = GetComponent<Animator>();
myAnimator.SetBool("Bougyo", false);}
といった使い方です。
これはジャンプでも使用できますが、地面との設置判定が必要なので、次回にジャンプなどに使用する、”設置判定” について説明します。
(結果)
アニメーションの設定をして“パンチ”と“防御” 成功!!
(アニメーションについても後から説明します)
今日はここまでにします!
③プレーヤーのRigidbody2D、Collider2Dの設定
前回までで、主人公のアニメーションは設定しました。
しかし、このままでは、
・浮いてしまう
・地面をすり抜けてしまう
・動かない
という問題が。
そこでこの画像を参照してください。
では①から。
浮かないようにするには、Rigidbody2D(重力設定)を主人公につけます。
Add Component → Physics → Rigidbody2D を選択
・Massは重力の強さ(地球は9.8)を設定。
主人公は忍者なので、ふわっとさせるため1を設定。
・2つのDragは抵抗力(風など)なので0を。
・GravityScaleは重力の影響力なので、ここで動きをみて、微調整を。
・FixedAngleは主人公が倒れないための設定。2Dではほぼチェックを入れる。
・Is Kinematicは他のキャラクターの力をうけない という設定。
うごかない壁とか、山のフドウのようなキャラには使います。
以上で設定終了!Rigidbodyはunityの優秀なエンジンなのです。
②は主人公の動きのscript(プログラム)です!。これは次回に。
次は③を説明
主人公の実体を作ります。これを設定しなければ、床はすり抜け敵もすり抜け
お化け状態。
Collider2Dの設定です。
Colliderには、四角型のBOXCollider 丸型のCircleCollider種類がありますが、
今回は、主人公の形に合わせたいので、
Add Component → Physics → Polygon Collider2D を選択!
shiftキーで、角(頂点)の追加が。 ctrlキーで角(頂点)の削除が できます。
画像のように。主人公に実体を追加しました!
再生してみると・・・
着地成功!!!
次回はついにプログラムにど素人が手を出します。こうご期待