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

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

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

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】