Unity5.1.0f3 Personal(2015年6月)
今回は、ユニティちゃんをジャンプさせようと思います〜
【目標】ユニティちゃんをジャンプさせる
①ジャンプアニメーションを作成する
それではまずは、ジャンプアニメーションの作成からいきましょう〜
アニメーションについては以下エッセンスをご参照下さい〜
Hierarchyビューでユニティちゃんを選択した状態で、Animationビューを開き、Create New Clipを選択します〜
アニメーション名は「Jump1@Player」として下さい〜
Create New Clip
次に、Add Property>Sprite Renderer>Spriteを選択します〜また、Samplesを8に変更しておきます〜
Sprite作成 Samplesは8に
続いてSpriteを配置していきます〜ユニティちゃん_ジャンプ_0を0.0地点、ユニティちゃん_ジャンプ_1を0.1地点に配置します〜
同じ要領で、以下の設定で他のアニメーションも作成していきます〜
名前:Jump2@Player, Samples: 8, 0.0: ユニティちゃん_ジャンプ_2, 0.1: ユニティちゃん_ジャンプ_3
名前:Jump3@Player, Samples: 8, 0.0: ユニティちゃん_ジャンプ_4, 0.1: ユニティちゃん_ジャンプ_5
名前:Jump4@Player, Samples: 8, 0.0: ユニティちゃん_ジャンプ_6, 0.1: ユニティちゃん_ジャンプ_7
名前:Jump5@Player, Samples: 8, 0.0: ユニティちゃん_ジャンプ_8, 0.1: ユニティちゃん_ジャンプ_0
②ジャンプアニメーターを設定する
それでは続いてアニメーターの設定をしていきます〜まずはAnimatorControllersフォルダのPlayerを開き、軽くアニメーションの配置を整頓しましょう〜
アニメーション配置の整頓
続いてアニメーター内に新たに変数を3つ作成します〜1つはTrigger型のJump変数、もう1つはBool型のisJumping変数、最後にBool型のisFalling変数です〜
Jumpはジャンプしたかどうかの判定、isJumpingはジャンプ中に下から上へ移動しているかの判定、isFallingはジャンプ中に上から下へ移動しているかの判定を行います〜
ちなみにTrigger型変数は1回だけtrueを実行し、1回実行するとすぐにfalseとなる変数です〜
新たに変数を作成
変数の作成が終わったら、アニメーション遷移の設定を行いましょう〜まずはWait@PlayerからJump1@PlayerへMake Transitionし、InspectorビューをHas Exit Timeをfalse、Transition Durationを0、ConditionsにJumpを設定します〜
Wait@PlayerからJump1@Playerへ
Inspectorビューの設定
また、Dash@PlayerからJump1@PlayerへもMake Transitionを行います〜Inspector内容はWait@PlayerからJump1@Playerのものと全く同じです〜
DashからJump1へ Inspector内容はWait→Jump1と同じ
それでは同じ要領で、以下のInspectorビュー画像を参考にJumpアニメーションの遷移設定をしていきしょう〜
Jump1→Jump2
Jump2→Jump3
Jump3→Jump4
Jump4→Jump5
Jump5→Exit
アニメーター上でExitまでいくと、Entryへ戻ります〜
Entryに戻った時点で左右どちらかのボタンを押していた時はWait@Playerを挟まずにDash@Playerへ遷移してほしいため、EntryからDash@PlayerへもMake Transitionを行います〜また、InspectorビューのConditionsにはDash=trueの時遷移する条件を設定しておきます〜
Entry→Dash
Inspectorビュー設定
③スクリプトを編集しジャンプさせる
それでは前回までに作成しておいたPlayerScriptを編集し、ユニティちゃんをジャンプさせていきましょう〜以下ソースです〜
using UnityEngine; using System.Collections; public class PlayerScript : MonoBehaviour { public float speed = 4f; //********** 開始 **********// public float jumpPower = 700; //ジャンプ力 public LayerMask groundLayer; //Linecastで判定するLayer //********** 終了 **********// public GameObject mainCamera; private Rigidbody2D rigidbody2D; private Animator anim; //********** 開始 **********// private bool isGrounded; //着地判定 //********** 終了 **********// void Start () { anim = GetComponent<Animator>(); rigidbody2D = GetComponent<Rigidbody2D>(); } //********** 開始 **********// void Update () { //Linecastでユニティちゃんの足元に地面があるか判定 isGrounded = Physics2D.Linecast ( transform.position + transform.up * 1, transform.position - transform.up * 0.05f, groundLayer); //スペースキーを押し、 if (Input.GetKeyDown ("space")) { //着地していた時、 if (isGrounded) { //Dashアニメーションを止めて、Jumpアニメーションを実行 anim.SetBool("Dash", false); anim.SetTrigger("Jump"); //着地判定をfalse isGrounded = false; //AddForceにて上方向へ力を加える rigidbody2D.AddForce (Vector2.up * jumpPower); } } //上下への移動速度を取得 float velY = rigidbody2D.velocity.y; //移動速度が0.1より大きければ上昇 bool isJumping = velY > 0.1f ? true:false; //移動速度が-0.1より小さければ下降 bool isFalling = velY < -0.1f ? true:false; //結果をアニメータービューの変数へ反映する anim.SetBool("isJumping",isJumping); anim.SetBool("isFalling",isFalling); } //********** 終了 **********// void FixedUpdate () { float x = Input.GetAxisRaw ("Horizontal"); if (x != 0) { rigidbody2D.velocity = new Vector2 (x * speed, rigidbody2D.velocity.y); Vector2 temp = transform.localScale; temp.x = x; transform.localScale = temp; anim.SetBool ("Dash", true); if (transform.position.x > mainCamera.transform.position.x - 4) { Vector3 cameraPos = mainCamera.transform.position; cameraPos.x = transform.position.x + 4; mainCamera.transform.position = cameraPos; } Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0)); Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1)); Vector2 pos = transform.position; pos.x = Mathf.Clamp(pos.x, min.x + 0.5f, max.x); transform.position = pos; } else { rigidbody2D.velocity = new Vector2 (0, rigidbody2D.velocity.y); anim.SetBool ("Dash", false); } } }
PlayerScript.cs
まずはEdit > Project Settings > Tag & Layers LayersからLayersにGroundを追加し、
「Ground」追加
public変数であるgroundLayerに作成したGroundレイヤーを設定します〜
また、用意したPrefab全てにGroundレイヤーを設定します〜
まとめてGroundレイヤーを設定
それではスクリプトに入っていきます〜流れとしては、
①Linecastで足元にGroundレイヤーがあるか判定
Sprite Editorで画像の中心をBottomに設定したため、足元を基準として、足元から上へ+1した位置から足元から-0.05した位置へ線を引き、その線がGroundレイヤー付きのオブジェクトとぶつかっていればisGrounded=true、ぶつかっていなければisGrounded=falseとしています〜
線を引いて、Groundレイヤーとの衝突判定
②Jumpアニメーションの実行
③AddForceにて上方向へ力を加える
④上昇していればisJumpingをtrue、下降していればisFallingをtrueにしアニメーションの切替
という流れになっています〜
最後に、このままだとユニティちゃんが高くジャンプしすぎてしまうので、Rigidbody2DのGravity Scaleを3に変更しましょう〜
【結果】
ユニティちゃんがジャンプしてくれるようになりました〜
今回はここまでです〜
ありがとうございました〜
【Unity開発8】ユニティちゃんを表示させる【横スクロールユニティちゃん1】
【Unity開発8】ユニティちゃんを歩かせる【横スクロールユニティちゃん2】
【Unity開発8】カメラにユニティちゃんを追いかけさせる【横スクロールユニティちゃん3】
【Unity開発8】ユニティちゃんをジャンプさせる【横スクロールユニティちゃん4】
【Unity開発8】ユニティちゃんバスターで攻撃する【ユニティちゃん横スクロール5】
【Unity開発8】走っている時やジャンプ中にも弾を撃つ【横スクロールユニティちゃん6】
【Unity開発8】弾を当てて敵を倒す【横スクロールユニティちゃん7】
【Unity開発8】uGUIでライフを作り、ダメージを実装する【横スクロールユニティちゃん8】
【Unity開発8】ダメージを食らった時、一定時間無敵状態にする【横スクロールユニティちゃん9】
【Unity開発8】アイテムを取得して体力回復する【横スクロールユニティちゃん10】
【Unity開発8】敵キャラを倒した時にアイテムを落とさせる【横スクロールユニティちゃん11】
【Unity開発8】Main Cameraに映るまで敵キャラを待機させておく【横スクロールユニティちゃん12】