⑧時間の管理について(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に戻る というスクリプトができました。

 

f:id:loveyama1976:20150425121729p:plain

 これがパンチ受けた1発目で0.36秒タイムが増えているのがわかります

f:id:loveyama1976:20150425121815p:plain

これが何発か敵の攻撃をうけて、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 できないわけです。

無限ジャンプを回避しているわけですね。 

f:id:loveyama1976:20150223063252p:plain

ジャンプ成功!

 

衝突判定の注意は、3Dの物体と2Dの物体はぶつからないということです。

Collision2D とCollision は当たらない。不便だ…どうにかならないかな。

 

ではまた!

 

⑤Unity2Dのアニメーションを作りました!

主人公のアニメーションがやっとできました!1か月かかった…

Animatorタブを開けば、そのキャラのすべてのアニメーションが見れます。

f:id:loveyama1976:20150205200200j:plain

これがすべてです。

ものすごい複雑化しましたが、このunityアニメーション設定は非常にシンプルで

面白い。

 

まず、緑のAnyState は、どのような状態からでも、アニメーションへ移れる

というものです。

 

例えば、敵から攻撃をうけて、dmageのステートになっていても、Panchはだせる

といった感じです。

また、昇竜拳などの必殺技中でも、当たらない!と判断したら、パンチをだせば

昇竜拳がキャンセルできる「キャンセル技」にも適応できます。

 

オレンジはデフォルトステートで、トリガーなどの命令がない場合は、ここに

自動的になります。今回は 待機 をデフォルトにしています。

要は「黙ってボタンを押さなければ、立っている」 という状態になります。

 

青のステージはその中にひとかたまりのアニメーションが入っています。 影走りの術とか!

 

AnyState からでている ”→” をダブルクリックするとtransition(推移)設定

になります。

f:id:loveyama1976:20150205201107j:plain

ここで関係するのは一番上の赤丸 Atomic これは、他のトリガーがあっても、必ず

実行される というもの。

例えば 歩いていても、Fire1を押したら、パンチがでます!

 

二個目の赤丸は 推移のブレンド設定。

今回は素早いパンチを出したいので、ブレンドは ”0秒” 

0.05秒 に ブレンドラインを設定しました!

これが 例えば1秒 にブレンドラインをすると、

パンチ 遅! ってなっていらいらするのです。

 

三個目の赤丸はconditions で、これが トリガーやBool を設定するところです。

前回設定した、パンチのトリガー

C#でFire1を押すと、PANCHの引き金が引かれる)

をセット。

 

これで パンチが完成! Fire1を押すと パンチでた!

f:id:loveyama1976:20150205205114j:plain

 

特殊攻撃もつくれます。stateを2こ用意して、

Fire2 で1個Runstateへ移動 また Fire2 で1個影走りstateへ移動

f:id:loveyama1976:20150205205320j:plain

 

忍法「影走りの術」 完成! 敵から瞬時に逃げれます!

f:id:loveyama1976:20150205205615j:plain

他に、敵を吹き飛ばす「気功術」 や 「影火の術」 や 「手裏剣」

などのアニメーション推移もできました!

 

次回は、地味ですが "設置判定" をど素人が説明します! 


Unityランキングへ

④主人公の動きの スクリプト(C#)を作りました!

 

ついにプログラムに手を出しました。

unityには C# と Javascript と Boo がありますが、

だいたい最後には C♯に落ち着くようです。

 

まずAdd ComponentからNew Script をクリック!

f:id:loveyama1976:20150117105320p:plain

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種類あり、

  1. Input.GetButtonDown("Fire2") はボタンが押されたらという意味
  2. Input.GetButton("Fire2") はボタンが押されつづけたらという意味
  3. Input.GetButtonUp("Fire2") はボタンが離されたらという意味

 

です。

また、アニメーションへの伝達は今回2つ使っています。

  1. myAnimator.SetTrigger("Panch)はイベントを発生させるためのもので、ボタンが押されたら、パンチの条件イベントが発生する という意味です。
  2. 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);}

 

といった使い方です。

 これはジャンプでも使用できますが、地面との設置判定が必要なので、次回にジャンプなどに使用する、”設置判定” について説明します。

 

(結果)

f:id:loveyama1976:20150117113934p:plain

アニメーションの設定をして“パンチ”と“防御” 成功!!

(アニメーションについても後から説明します)

 

今日はここまでにします!

 

 

 

 


Unityランキングへ

③プレーヤーのRigidbody2D、Collider2Dの設定

 

前回までで、主人公のアニメーションは設定しました。

しかし、このままでは、

・浮いてしまう

・地面をすり抜けてしまう

・動かない

という問題が。

 

そこでこの画像を参照してください。

f:id:loveyama1976:20150112113912p:plain

では①から。

浮かないようにするには、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キーで角(頂点)の削除が できます。

画像のように。主人公に実体を追加しました!

 

再生してみると・・・f:id:loveyama1976:20150112120710p:plain

 

着地成功!!!

次回はついにプログラムにど素人が手を出します。こうご期待

 


Unityランキングへ