Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity8】ユニティちゃんがジャンプ!Input.GetKeyDown, AddForce【横スクロールユニティちゃん4】

いつもひよこのたまごをご利用下さいましてありがとうございます!
おかげ様でチュートリアル数も10ゲーム目となりました!
チュートリアル一覧は
こちら からどうぞ!


スポンサーリンク

Unity5.1.0f3 Personal(2015年6月)

f:id:hiyotama:20150618122504p:plain


このコンテンツは、『ユニティちゃんライセンス』で提供されています

ユニティちゃんライセンス

前回の続きです〜
今回は、ユニティちゃんをジャンプさせようと思います〜

【目標】ユニティちゃんをジャンプさせる

①ジャンプアニメーションを作成する
それではまずは、ジャンプアニメーションの作成からいきましょう〜
アニメーションについては以下エッセンスをご参照下さい〜


hiyotama.hatenablog.com


Hierarchyビューでユニティちゃんを選択した状態で、Animationビューを開き、Create New Clipを選択します〜
アニメーション名は「Jump1@Player」として下さい〜

f:id:hiyotama:20150615090247p:plain
Create New Clip


次に、Add Property>Sprite Renderer>Spriteを選択します〜また、Samplesを8に変更しておきます〜


f:id:hiyotama:20150615090846p:plain
Sprite作成 Samplesは8に


続いてSpriteを配置していきます〜ユニティちゃん_ジャンプ_0を0.0地点、ユニティちゃん_ジャンプ_1を0.1地点に配置します〜


f:id:hiyotama:20150615091421p:plain


同じ要領で、以下の設定で他のアニメーションも作成していきます〜

名前: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を開き、軽くアニメーションの配置を整頓しましょう〜


f:id:hiyotama:20150615101900p:plain
アニメーション配置の整頓


続いてアニメーター内に新たに変数を3つ作成します〜1つはTrigger型のJump変数、もう1つはBool型のisJumping変数、最後にBool型のisFalling変数です〜

Jumpはジャンプしたかどうかの判定、isJumpingはジャンプ中に下から上へ移動しているかの判定、isFallingはジャンプ中に上から下へ移動しているかの判定を行います〜

ちなみにTrigger型変数は1回だけtrueを実行し、1回実行するとすぐにfalseとなる変数です〜


f:id:hiyotama:20150615102314p:plain
新たに変数を作成


変数の作成が終わったら、アニメーション遷移の設定を行いましょう〜まずはWait@PlayerからJump1@PlayerへMake Transitionし、InspectorビューをHas Exit Timeをfalse、Transition Durationを0、ConditionsにJumpを設定します〜

f:id:hiyotama:20150615102836p:plain
Wait@PlayerからJump1@Playerへ

f:id:hiyotama:20150615102947p:plain
Inspectorビューの設定


また、Dash@PlayerからJump1@PlayerへもMake Transitionを行います〜Inspector内容はWait@PlayerからJump1@Playerのものと全く同じです〜

f:id:hiyotama:20150615103104p:plain
DashからJump1へ Inspector内容はWait→Jump1と同じ


それでは同じ要領で、以下のInspectorビュー画像を参考にJumpアニメーションの遷移設定をしていきしょう〜


f:id:hiyotama:20150615103458p:plain
Jump1→Jump2


f:id:hiyotama:20150615104046p:plain
Jump2→Jump3


f:id:hiyotama:20150615103743p:plain
Jump3→Jump4


f:id:hiyotama:20150615103950p:plain
Jump4→Jump5


f:id:hiyotama:20150615104339p:plain
Jump5→Exit


アニメーター上でExitまでいくと、Entryへ戻ります〜
Entryに戻った時点で左右どちらかのボタンを押していた時はWait@Playerを挟まずにDash@Playerへ遷移してほしいため、EntryからDash@PlayerへもMake Transitionを行います〜また、InspectorビューのConditionsにはDash=trueの時遷移する条件を設定しておきます〜


f:id:hiyotama:20150615104554p:plain
Entry→Dash

f:id:hiyotama:20150615104927p:plain
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を追加し、


f:id:hiyotama:20150615111930p:plain
「Ground」追加


public変数であるgroundLayerに作成したGroundレイヤーを設定します〜


f:id:hiyotama:20150615112147p:plain


また、用意したPrefab全てにGroundレイヤーを設定します〜


f:id:hiyotama:20150615112413p:plain
まとめてGroundレイヤーを設定


それではスクリプトに入っていきます〜流れとしては、


①Linecastで足元にGroundレイヤーがあるか判定

Sprite Editorで画像の中心をBottomに設定したため、足元を基準として、足元から上へ+1した位置から足元から-0.05した位置へ線を引き、その線がGroundレイヤー付きのオブジェクトとぶつかっていればisGrounded=true、ぶつかっていなければisGrounded=falseとしています〜


f:id:hiyotama:20150615112512p:plain
線を引いて、Groundレイヤーとの衝突判定


②Jumpアニメーションの実行
③AddForceにて上方向へ力を加える
④上昇していればisJumpingをtrue、下降していればisFallingをtrueにしアニメーションの切替


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


最後に、このままだとユニティちゃんが高くジャンプしすぎてしまうので、Rigidbody2DのGravity Scaleを3に変更しましょう〜

f:id:hiyotama:20150615115212p:plain


【結果】


f:id:hiyotama:20150615113454p:plain


ユニティちゃんがジャンプしてくれるようになりました〜


今回はここまでです〜

ありがとうございました〜


【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】

【Unity開発8】タイトル・ステージ紹介・ゲームオーバー・ゲームクリアー画面を作る【横スクロールユニティちゃん13】

【Unity開発8】バーチャルパッドを付けてモバイル対応する【横スクロールユニティちゃん14】