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

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

【Unity8】ユニティちゃんが攻撃!SetTrigger, Instantiate【ユニティちゃん横スクロール5】

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


スポンサーリンク

Unity5.1.0f3 Personal(2015年6月)

f:id:hiyotama:20150618122504p:plain


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

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

前回の続きです〜今回はユニティちゃんに攻撃させます〜


【目標】ユニティちゃんに攻撃させる

①Bulletの作成
まずは攻撃した時に出す弾を作りましょう〜以下の画像をSpritesフォルダにImportして下さい〜

f:id:hiyotama:20150615115535p:plain
bullet.png


Inspectorの設定は以下の通りです〜


f:id:hiyotama:20150615115823p:plain


Sprite Editorの設定は以下の通りです〜


f:id:hiyotama:20150615115919p:plain


2枚のSprite画像が完成したら、Hierarchyビューへドラッグ&ドロップし、更にPrefabsフォルダへ移してPrefab化します〜Prefab化が完了したら、Hierarchyビューのbulletは削除して下さい〜


f:id:hiyotama:20150615120428p:plain
Prefab化し、元のオブジェクトは削除 Prefabの名前は「Bullet」に変更

BulletにはRigidbody2Dコンポーネントを付け、


Prefab化できたら、BulletScriptを作成したプレファブBulletに取り付けます〜以下ソースです〜

using UnityEngine;
using System.Collections;

public class BulletScript: MonoBehaviour {
	
	private GameObject player;
	private int speed = 10;
	
	void Start () {
		//ユニティちゃんオブジェクトを取得
		player = GameObject.FindWithTag("UnityChan");
		//rigidbody2Dコンポーネントを取得
		Rigidbody2D rigidbody2D = GetComponent<Rigidbody2D>();
		//ユニティちゃんの向いている向きに弾を飛ばす
		rigidbody2D.velocity = new Vector2 (speed * player.transform.localScale.x, rigidbody2D.velocity.y);
		//画像の向きをユニティちゃんに合わせる
		Vector2 temp = transform.localScale;
		temp.x = player.transform.localScale.x;
		transform.localScale = temp;
		//5秒後に消滅
		Destroy(gameObject, 5);
	}
}

BulletScript.cs


まずはユニティちゃんに「UnityChan」という名前のタグを付けて下さい〜

f:id:hiyotama:20150615121448p:plain
File > Project Settings > Tags & Layers からタグの追加


f:id:hiyotama:20150615121550p:plain
タグを付ける


※※※2015年11月14日追記※※※
このままだとBulletが重力の影響を受けてしまうので、
BulletについているRigidbody2DのIs Kinematicにチェックを入れるか、
Gravity Scaleを0にするかして下さい!
コメントありがとうございました〜!
※※※※※※※※※※※※※※※※※※※※※※


スクリプトの流れとしては、
①ユニティちゃんのオブジェクト情報を取得
②ユニティちゃんの向いている方向に弾を飛ばす

ユニティちゃんが右を向いている時はlocalScale.xが1に、左を向いている時はlocalScale.xが-1になっているのを利用しています〜

③ユニティちゃんが向いている方向に弾の向きを変える
④5秒後に弾を消滅(Destroy)させる


という風になっています〜


②弾を撃つアニメーションの作成
それではユニティちゃんに、新たに弾を撃つアニメーションを追加していきましょう〜


HierarchyビューでUnityChanを選択した状態でAnimationビューを開き、Create New Clipを実行して下さい〜アニメーションの名前は「Shot@Player」です〜


f:id:hiyotama:20150615122241p:plain
Create New ClipでShot@Playerアニメーションを作成する


続いてAdd Property > Sprite Renderer > Spriteを選択し、Samplesを16、アニメーション位置0.0にユニティちゃん_待機_SHOT_0、0.1の位置にユニティちゃん_待機_SHOT_1を配置して下さい〜


f:id:hiyotama:20150615122724p:plain
SHOTアニメーションを配置


続いてアニメーターの設定をしていきます〜Animatorビューを開くとShot@Playerのアニメーションが追加されているので、Wait@Playerの右に配置し、Make Transitionにて相互に矢印で結びます〜


f:id:hiyotama:20150616110007p:plain


続いてアニメーター内にTrigger型の変数Shotを作成します〜


f:id:hiyotama:20150616110138p:plain


次にWait@PlayerからShot@Playerへ向いている矢印をクリックし、Inspectorビューの設定をしていきます〜
Trigger変数Shotがtrueになった時にShot@Playerを再生したいので、Has Exit Timeはfalse、Transition Durationは0、ConditionsにTrigger変数Shotを設定します〜


f:id:hiyotama:20150616110505p:plain


Shot@PlayerからWait@Playerへ向いている矢印のInspectorも設定します〜こちらは、1回実行して戻ればいいのでHas Exit Timeはtrue、Exit Timeは1、Transition Durationは0にします〜


f:id:hiyotama:20150616110814p:plain


③実際に弾を撃たせてみる
それではPlayerScriptに追記していき、実際に弾を撃たせてみましょう〜以下ソースです〜

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {
	
	public float speed = 4f;
	public float jumpPower = 700;
	public LayerMask groundLayer;
	public GameObject mainCamera;
//********** 開始 **********//
	public GameObject bullet;
//********** 終了 **********//
	
	private Rigidbody2D rigidbody2D;
	private Animator anim;
	private bool isGrounded;
	
	void Start () {
		anim = GetComponent<Animator>();
		rigidbody2D = GetComponent<Rigidbody2D>();
	}

	void Update ()
	{
		isGrounded = Physics2D.Linecast (
		transform.position + transform.up * 1,
		transform.position - transform.up * 0.05f,
		groundLayer);
		if (Input.GetKeyDown ("space")) {
			if (isGrounded) {
				anim.SetTrigger("Jump");
				isGrounded = false;
				rigidbody2D.AddForce (Vector2.up * jumpPower);
			}
		}
		float velY = rigidbody2D.velocity.y;
		bool isJumping = velY > 0.1f ? true:false;
		bool isFalling = velY < -0.1f ? true:false;
		anim.SetBool("isJumping",isJumping);
		anim.SetBool("isFalling",isFalling);
//********** 開始 **********//
		if (Input.GetKeyDown ("left ctrl")){
			anim.SetTrigger("Shot");
			Instantiate(bullet, transform.position + new Vector3(0f,1.2f,0f), transform.rotation);
		}
//********** 終了 **********//
	}
	
	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


まずはpublic変数のbulletにPrefabのBulletを設定してあげましょう〜


f:id:hiyotama:20150616112028p:plain
ドラッグ&ドロップ!


左のcontrolキーを押した時にアニメーターのTrigger変数Shotをtrueにし、InstantiateにてBulletを生成しています〜生成位置はユニティちゃんの足元からY軸方向に1.2上に調整しています〜


【結果】


f:id:hiyotama:20150616112336p: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】