UnityのMecanimを使ってアニメーションさせる

前回で忍者が移動できるようになったので
今回は歩いたりジャンプしたりしたときに
アニメーションするようにしたいと思います。

UnityのMecanimというのを使うとアニメーションさせることができるようです。

1.
ヒエラルキービューでstandを選択して
ツールバーの Window → Animation

2.
アニメーションウインドウが出てくるのでCreateボタンをクリック。
Walkという名前で保存する。

3.
AddProperty → Sprite Renderer → Sprite +

4.
デフォルトでは1秒のアニメーションになってるので
↓この部分をdeleteキーで削除する。

5.
アニメーションさせたい画像をプロジェクトビューからD&D。
0.07秒ごとに違う画像を配置しました。

6.
タイムラインの0.28秒を選択して右クリック → Add Keyframe
で再生時間を0.28秒に設定。

7.
今度はスクリプトのNinjaMoveに記述して忍者が動くようにする。

MonoBehaviour の下に以下を追加。

Animator accessAnim; //AnimatorコンポーネントにアクセスするAnimator型変数accessAnimを宣言。

8.
Start関数内で

this.accessAnim = GetComponent(); //Animator関数にアクセスして実体化

9.
Update関数内で

//アニーメーション速度調整
this.accessAnim.speed = WSPD / 2.0f;

10.
実行してみる

忍者が走る!
だいぶゲームっぽくなってきたかも ^0^

////////////////////////////////////////
ー広告ー



UnityでRigidbodを使ってキャラを左右に動かす

前回は忍者をジャンプさせることができたので
今回は左右に移動できるようにしたいと思います。

前回のスクリプトに追加していきます。

1.
MonoBehaviourの下に以下を記述。

float walkPow = 40.0f; //歩く力を設定。
float maxWSPD = 3.0f; //スピードの最大値を設定。

2.
Update関数内に以下を追加。

int key = 0; //キー状態を保存する変数keyを宣言

if (Input.GetKey(KeyCode.RightArrow))
{
key = 1; //右が押されたらkey=1
}

if (Input.GetKey(KeyCode.LeftArrow))
{
key = -1; //左が押されたらkey=-1
}

//歩くスピードを設定。
//Mathf.Abs()は絶対値を返す。
//velocityには速度が入っている。
//したがってWSPDには速度の絶対値が代入される。
float WSPD = Mathf.Abs(this.access2D.velocity.x);

//キーを離してもすぐに停止しないで慣性の法則でしばらくそのまま動いてしまうので
//キーを離したらすぐに停止する処理。
if (Input.GetKeyUp(KeyCode.RightArrow))
{
this.access2D.velocity = Vector2.zero; //停止させる命令
}

if (Input.GetKeyUp(KeyCode.LeftArrow))
{
this.access2D.velocity = Vector2.zero; //停止させる命令
}

if (WSPD < this.maxWSPD) //マックススピード以下なら移動を加速させる。 { this.access2D.AddForce(transform.right * key * this.walkPow); }


//動く方向にキャラが向くように画像を反転させる処理
if (key != 0)
{
transform.localScale = new Vector3(key, 1, 1);
}



3.
実行してみる。

縦横無尽に駆け巡る忍者。
ブロックに飛び乗ることもできるようになりました! ^0^

////////////////////////////////////////
ー広告ー



UnityでRigidbodを使ってキャラを動かす

今回はキャラをジャンプさせたり左右に移動させたりします。

足場がブロック1個では移動できないので
ブロックのPrefabを作って配置します。

ヒエラルキービューからblockをプロジェクトビューにD&Dして
名前をblockPrefabにしました。
これをシーンビューにD&Dして配置していきます。

1.
スペースキーで忍者をジャンプさせるスクリプトを書く。
プロジェクトビュー内で右クリック → Create → C#Script
名前をNinjaMoveにする。

2.
MonoBehaviour の下に

//Rigitbody2DコンポーネントにアクセスするRigitbody型変数access2Dを宣言。
Rigidbody2D access2D;

//ジャンプの高さを設定。
float jumpPow = 430.0f;

3.
Start関数内に

//Rigidbody2D関数にアクセスして実体化
this.access2D = GetComponent();

4.
Update関数内に

//スペースキーが押されたら
//上方向にジャンプパワーをかけて動かす

if (Input.GetKeyDown(KeyCode.Space)) {
this.access2D.AddForce(transform.up * this.jumpPow);
}

5.
プロジェクトビューのNinjaMoveを
ヒエラルキービューのStandにD&Dしてアタッチする。

6.
インスペクタビューのGravity Scaleを2にして
少し落ちるスピードを速くする。

7.
実行してみよう

よしよし
スペースキーを押すとちゃんとジャンプしているな^-^
えらいぞ忍者。

////////////////////////////////////////
ー広告ー



Unityで横スクロールアクションゲームっぽい何かを作る

—————————————————————–
最短4週間!オリジナルのゲームアプリを開発しよう!
—————————————————————–

Unityで横スクロールアクションゲームっぽい何かを作ります。

キャラクターのアニメーションや当たり判定など
Unityの基本を勉強したいと思います。

忍者が好きなので忍者ゲームにしてやろう。ウハハ!

足場ブロック、背景の空、ジャンプアニメーション用画像3枚、普通の立ち絵1枚を用意。
プロジェクトビューのAssetsにD&Dします。

今回はPhysicsという物理エンジンでキャラを動かしたいと思います。
Rigidbodyというコンポーネントでキャラに重力の法則に則った動きをさせます。

1.
プロジェクトビューから立ち絵の画像をD&D。

2.
Add Component → Physics 2D → Rigidbody 2D

3.
実行してみる。

あっはっは
どこまでも落ちていくw

下に足場ブロックを置いてそこに着地できるようにしたい。
そこでキャラと足場ブロックに当たり判定を設定します。
当たり判定を扱うコンポーネントはCircle Collider 2Dを使うようです。

4.
Add Component → Physics 2D → Circle Collider 2D

5.
キャラが緑の円に囲まれますがこれが当たり判定になります。
Radiusは円の半径、Offsetは円の中心をどれだけずらすかを設定します。
Radius=0.15 , Offset=0,-0.3 に設定しました。

ConstraintsのFreeze Rotation にチェックをいれておくと
キャラが不用意に転倒するのを防止できるそうなのでチェックを入れておく。

6.
足元の当たり判定ができたので次は上半身の当たり判定を設置する。
上半身は四角い箱状のものを使用します。
Add Component → Physics 2D → Box Collider 2D

7.
四角の大きさを調整します。
Sizeを 0.3 , 0.6 にしました。
これでキャラが当たり判定にきれいに収まりました。

8.
次に足場になるブロックを配置します。
プロジェクトビューからブロックの画像をD&D。

9.
ブロックにもキャラと同じように
RigidbodyとBox Colliderを設定します。

Add Component → Physics 2D → Rigidbody 2D

ブロックは固定なので重力計算いらんやろ 思うたけど
衝突する両方のオブジェクトにそれぞれRigidbodyとColliderが必要らしい。
で、ブロックが下に落下するのを防ぐために
Body Type で Kinematic を選択しておく。

10.
次にブロックの当たり判定Colliderの設定。
キャラと同じように
Add Component → Physics 2D → Circle Collider 2D

これは何もしなくても当たり判定がブロックにフィットしてたので
楽ちん ^^v

11.
では実行してみよう~

やったー
立った 立った! 忍者が立ったー! ヘ(゚∀゚*)ノ

////////////////////////////////////////
ー広告ー



Unityでセーブしたりロードしたりする

今作ってるシューティングゲームの自機HPを保存したり
読み込んだりしてみたいと思います。

セーブするには
PlayerPrefs.SetInt(“SVhp”, myhp);

こんな風に書くようです。
“….”この部分に保存する名前を書きます。
ロードするときはこの名前で呼び出します。
,の後ろにセーブする変数を書きます。

ロードするときは
int myhp = PlayerPrefs.GetInt(“SVhp”,3);

こんな風に書くようです。
“….”の部分にセーブしたときにつけた名前を書きます。
,の後ろはもしセーブしたデータが無いならこの数値が代入されます。

1.
監督スクリプトのHPkantoku に記述していきます。
start関数の下に書きます。
セーブする関数名をSaver
ロードする関数名をLoader にしました。

//セーブサブ
public void Saver() {

PlayerPrefs.SetInt(“SVhp”, myhp);

}

//ロードサブ
public void Loader()
{

int myhp = PlayerPrefs.GetInt(“SVhp”,3);

//現在のHPを表示して返す。myhpは数値型なのでToStringで文字列に変換。
this.HPdamege.GetComponent().text = myhp.ToString(“D5”);

}

2.
セーブとロードの2つのボタンを作る。
ヒエラルキービューのcreate → UI → Button

3.
ボタンのtextにそれぞれセーブとロードと入力。
ボタンの名前をSVbutton,LDbuttonにしました。

4.
まずセーブボタンから。
インスペクタビューのOnclickの + をクリック。
None って欄にヒエラルキービューのHPkantokuをD&Dして
さっき書いた関数にアクセスできるようにする。

5.
No Function → HPkantoku → Saver()
これでセーブボタンとSaver関数が繋がりました。

6.
同じようにロードボタンもLoader関数と繋げてやります。

7.
さて、実行してみよー

最初のHPは3でした。
1発被弾してHPを2にしてセーブボタンを押します。


さらに被弾してHPがー6になりました。
ここでロードボタンをクリック。


おおー
HPが2に戻りました!
ちゃんとセーブできているようですな!

一旦デバッグを終了してもう一回実行しても
ロードボタンを押すとちゃんとHPが2になりました。

うんうん。
セーブとロードは割とすんなりできた気がする!
やった! ^0^

///////////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //UI使うのに必要

public class HPkantoku : MonoBehaviour {

GameObject HPdamege; //現在のHPを表示するテキスト用のgameobject型変数、HPdamegeを宣言
int myhp = 3; //自分のHPの初期値を宣言

// Use this for initialization
void Start () {

this.HPdamege = GameObject.Find (“HPtext”); //UIのHPtextを見つけてHPdamegeに代入、実体化

//float myhp = 3.0f; ここで宣言してもダメらしい
}

//ダメージ表示サブ
public void DMGsub() { //他のオブジェクトからアクセスできるようにpublicで記述

this.myhp -= 1; //ダメージ受けたらHP減らす

//現在のHPを表示して返す。myhpは数値型なのでToStringで文字列に変換。
this.HPdamege.GetComponent().text = myhp.ToString(“D5”);

}

//セーブサブ
public void Saver() {

PlayerPrefs.SetInt(“SVhp”, myhp);

}

//ロードサブ
public void Loader()
{

int myhp = PlayerPrefs.GetInt(“SVhp”,3);

//現在のHPを表示して返す。myhpは数値型なのでToStringで文字列に変換。
this.HPdamege.GetComponent().text = myhp.ToString(“D5”);
}

// Update is called once per frame
//void Update () {

//}
}

////////////////////////////////////////
ー広告ー



Unityでボタンの押しっぱなしを検知する

前回はシューティングゲームにボタンを配置して
プレイヤーが動かせるようにしましたが
ボタンを押しても一マスしか動かせず。

今回はボタンを押している間は自機が動くようにしたい!
→ Event Trigger というのを使うと出来そう?

1.
インスペクタビューの下のAdd Component → Event → Event Trigger

2.
Add New Event Type → PointerDown を選択
Add New Event Type → PointerUP を選択

3.
スクリプト shipmoveにボタンを押しているときと離しているときを検知する関数を書く。
最初にEvent Trigger用 bool型変数を宣言しておく。

bool Lnow = false;

Lぼたんが押されると Lnow = true になる。
Lボタンが離されると Lnow = false になる。
ゲーム開始時はボタンが離されているから bool Lnow = false;

4.
次にstart関数の下にボタンを押したときに呼び出される関数を書く。
押したら Losita 関数
離したら Lhanasita 関数

void Start () {
}

//Lボタン押した
public void Losita()
{
Lnow = true;
}

//Lボタン離した
public void Lhanasita()
{
Lnow = false;
}

5.
update関数内に 
Lボタンが押されている (Lnow = treu) の時
自機を 0.1f 左に移動させる処理を書く。

void Update () {
if (Lnow == true) {
this.sx = -0.1f;
transform.Translate (this.sx, 0, 0);
}
}

6.
インスペクタービューのPointer Downの + をクリック。
Noneって欄にヒエラルキービューからship1をD&D。
関数にアクセスできるようにする。

7.
No Function → shipmove → Losita
Pointer Downは押したことを検知するから Losita関数を選択。

8.
同様に Pointer Up に離したときの Lhanasita関数を接続。

インスペクタービューのPointer upの + をクリック。
Noneって欄にヒエラルキービューからship1をD&D。
No Function → shipmove → Lhanasita

9.
さあ実行してみよう!

やったー ^0^
ボタンを押している間、スムーズに左に移動できている!

//////////////////////////////////////////////////////////////////////////

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using UnityEngine.UI;

public class shipmove : MonoBehaviour {

float sx = 0; //x方向移動量を入れる変数
float sy = 0; //y方向移動量を入れる変数

bool Lnow = false; //Event Trigger用 bool型変数。 Lボタンが押されているかどうかを検知

void Start () {
}

//Lボタン押した
public void Losita()
{
Lnow = true;
}

//Lボタン離した
public void Lhanasita()
{
Lnow = false;
}

void Update () {
//左移動
if (Lnow == true) {
this.sx = -0.1f;
transform.Translate (this.sx, 0, 0);
}
}
}

////////////////////////////////////////
ー広告ー



Unityでシューティングゲームの自機をボタンで動かす

スマホで操作できるようにボタンを作ります。

ボタンを押すと前後左右に自機を動かせるようにします。

1.
ボタンの画像を作ってプロジェクトビューにD&Dして登録。

2.
ヒエラルキービューで右クリック→create→UI→Button
名前を Lmove にしました。
▼をクリックして Textを削除。ボタンに文字を表示するときに使うみたい。

3.
Lmoveを選択してインスペクタビューの
PosX -140
PosY 100
Width 40
Height 40
アンカーを画面右下に設定

4.
Lmoveを選択して右クリック→Duplicate でコピーする。
名前を Rmove に変更。
PosX PosYとか位置調整する。
同じように上ボタンと下ボタンも Umove,Dmoveという名前で作成。

5.
自機の動きを記述したC#scriptのshipmoveをダブルクリックで開いて
ボタンを押した時の動きを記述する。
start関数の下に書き込んでいく。
最初update関数内に書いちゃって後で関数が見つからずに苦しみました。

void Start () {
}

//左移動
public void LeftButton() {
this.sx = -0.1f;
transform.Translate (this.sx, 0, 0);
}

//右移動
public void RightButton() {
this.sx = 0.1f;
transform.Translate (this.sx, 0, 0);
}

//上移動
public void UpButton() {
this.sy = 0.1f;
transform.Translate (0, this.sy, 0);
}

//下移動
//public void Upush() {
public void DownButton() {
this.sy = -0.1f;
transform.Translate (0, this.sy, 0);
}

6.
ボタンオブジェクトに関数を登録していく。
Lmoveを選択してインスペクタビューの下の方の
On Click()
List is Empty
って書かれている欄の 『+』をクリック。

7.
Noneって書いてる欄に左のヒエラルキービューからship1をD&Dして
関数に接続できるようにする。

8.
No fanctionってところをクリック →shipmove →LeftButton で接続完了。

step5でupdate関数内にLeftButton関数を書いたらここで見つからずに困り果てる。

9.
とりあえず左ボタンだけ機能するか実行して確かめてみる。

左ボタンを押すと自機が0.1f 左に動く!
しかし!
押しっぱなしを検知していないようで1回だけしか動かない。
連続して左に動かすにはボタンを連打しないといけないぞ・・・。
これはダメだなー ^^;

次回はボタンを押しっぱなしで自機がスムーズに動くように何か策を考えたい!

/////////////////////////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using UnityEngine.UI;

public class shipmove : MonoBehaviour {

float sx = 0; //x方向移動量を入れる変数
float sy = 0; //y方向移動量を入れる変数

// Use this for initialization
void Start () {
}

//左移動
public void LeftButton() {
this.sx = -0.1f;
transform.Translate (this.sx, 0, 0);
}

//右移動
public void RightButton() {
this.sx = 0.1f;
transform.Translate (this.sx, 0, 0);
}

//上移動
public void UpButton() {
this.sy = 0.1f;
transform.Translate (0, this.sy, 0);
}

//下移動
public void DownButton() {
this.sy = -0.1f;
transform.Translate (0, this.sy, 0);
}

void Update () {
}

}

////////////////////////////////////////
ー広告ー



UnityでシューティングゲームのHPを表示する

前回までで敵と自機を動かすことができました。

今回は自機のHPを設定して敵弾に触れたら

HPを減らして表示したいと思います。

1.ヒエラルキービューで右クリック→create→ UI→ text
名前を HPtext にしました。
HPの初期値を3にするのでnew textの部分を書き換えて
ゲーム最初に表示される文字列を00003に指定。

2.アンカーを画面左上に設定してディスプレイの大きさにかかわらず
画面左上に表示できるようにする。
右のインスペクタビューで設定できますよ。

3.テキストのUIを書き換える監督を作る。
プロジェクトビューで右クリック→create→ C#scriptで
名前を HPkantoku にしました。

4.いろいろ記述していく。
↓最初にUI使うのに必要なこれを宣言
using UnityEngine.UI;

次にMonoBehaviour内で
現在のHPを表示するテキスト用のgameobject型変数、HPdamegeを宣言
GameObject HPdamege;

自分のHPの初期値を宣言
int myhp = 3;

5.スタート関数内で
UIのHPtextを見つけてHPdamegeに代入、実体化
this.HPdamege = GameObject.Find (“HPtext”);

6.スタート関数

//他のオブジェクトからアクセスできるようにpublicで記述
public void DMGsub() {

//ダメージ受けたらHP減らす
this.myhp -= 1;

//現在のHPを表示して返す。myhpは数値型なのでToStringで文字列に変換。
this.HPdamege.GetComponent().text = myhp.ToString(“D5”);
}

7.できたら保存する。

8.ヒエラルキービューで右クリック→create→ create Emptyで
空のGameObjectを作成。
名前を HPkantoku にします。

9.さっき書いたスクリプトを上の空のゲームオブジェクトにD&Dで
アタッチして実体化。

10.自機と弾が衝突したことを監督に伝えて
HPを減らす処理をしてもらうようにする。
自機と弾の当たり判定はEsmoveに書いてあるから
次はこいつを書き換える。

//衝突したら弾を消す処理の部分を
if (kyori < rE + rS) {
Destroy (gameObject);
}

↓このようにする
if (kyori < rE + rS) {
Destroy (gameObject);

//監督に衝突を伝える
//HPdamegeオブジェクトのDMGsub関数にアクセスするための
//gameobject型変数、collisionに
//gameobjectのHPdamegeをfind関数で見つけて実体化。
GameObject collision = GameObject.Find(“HPkantoku”);

//getcomponentでHPkantokuオブジェクトのDMGsub関数にアクセスすると
//あっちでHP−1してくれてテキスト表示してくれる
collision.GetComponent ().DMGsub ();
}

11.できたら保存して実行してみる。

うほー
できた できたー^^v

だいぶ前に他のオブジェクトにアクセスする方法がわからず
ややこしいテキスト表示法をやらかしたけど
今回はうまくいったかも。

今回出たエラーは
int myhp = 3;の部分を
float myhp = 3.0f;と書いて
DMG関数内で
myhp.ToString(“D5”)
と書いてしまうと
フロート型で宣言したのにToStringで整数型にしようとしてたから
エラーでした。

//////////////////////////HPkantoku
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //UI使うのに必要

public class HPkantoku : MonoBehaviour {

GameObject HPdamege; //現在のHPを表示するテキスト用のgameobject型変数、HPdamegeを宣言
int myhp = 3; //自分のHPの初期値を宣言

// Use this for initialization
void Start () {

this.HPdamege = GameObject.Find (“HPtext”); //UIのHPtextを見つけてHPdamegeに代入、実体化
}

//ダメージ表示サブ
public void DMGsub() { //他のオブジェクトからアクセスできるようにpublicで記述

this.myhp -= 1; //ダメージ受けたらHP減らす

//現在のHPを表示して返す。myhpは数値型なのでToStringで文字列に変換。
this.HPdamege.GetComponent().text = myhp.ToString(“D5”);

}
}

////////////////////////////////////////
ー広告ー



UnityのPrefabでシューティングゲームの敵を作る

前回までで敵の弾と自機の当たり判定までできました。

今回は敵の弾をたくさん作りたいと思います。

Unityで同じものをたくさん作る時はPrefabというのを使うと良いそうなのでやってみます。

Prefabというのは設計図みたいなもので
設計図を工場に持っていくと同じ部品をたくさん作れるそうです。

1.設計図を作る。
ヒエラルキービューの敵弾オブジェクト(Etama)を
プロジェクトビューにD&DするだけでOK。
名前をEtamaPrefabにしました。

ヒエラルキービューのEtamaPrefabは削除する。
設計図があればこれはもういらんらしい。
これ残したままやったら最後におかしくなった。

2.設計図を渡す工場を作る。
プロジェクトビューのcreate→C#script
名前をEtamaFactoryにしました。

3. スクリプトに書き込んでいく。

//最初に
//設計図を入れる箱をGameObject型変数、EtamaPrefabとして宣言。
//ここではまだただの箱。
//実体はプロジェクトビューにおるEtamaPrefabなので
//後でD&Dでアウトレット接続するために最初にpublicをつけておく。
//これがアウトレット接続の接続口になる。

public GameObject EtamaPrefab;

//何秒ごとに弾を生産するか決める変数limitを宣言。
float limit = 1.0f;

//数を数える変数counterを宣言。counterがlimitに達すると新しい弾を作る。
float counter = 0;

//アップデート関数内で
//counterがlimitに達した時の処理
//まずカウンターを0に戻す。
if (this.counter > this.limit) {
this.counter = 0;

//新しい弾の座標を入れるためのGameObject型変数 EtamaMake を宣言。まだただの箱。
//Instantiate関数で弾の分身を作る。
//設計図(EtamaPrefab)を渡すと分身を作ってくれる。
//Instantiate関数は分身をObject型で返そうとするので
//as GameObject でgameobject型に変換する。キャストというそうな。
GameObject EtamaMake = Instantiate (EtamaPrefab) as GameObject;

//最初の弾の出現位置をランダムに決定
int esx = Random.Range (-4, 4);

//EtamaMakeに座標を入れて実体化
EtamaMake.transform.position = new Vector3(esx,7,0);

4.ヒエラルキービューのcreate→create emptyで空のゲームオブジェクトを作成。
名前をEtamaFactoryにする。

5.さっき書いたC#スクリプトのEtamaFactoryを今作った空のゲームオブジェクトにD&Dでアタッチする。

6.ヒエラルキービューのEtamaFactoryをクリックして選択すると
右のインスペクタビューがこんな感じになってるので

プロジェクトビューのEtamaPrefabをそこまでD&Dで接続して
やっとpublic GameObject EtamaPrefab;の
EtamaPrefabが実体化できたみたい。

7.実行してみると弾がたくさん出てきて大成功。
やったー ^^v

/////////////////////////////////////

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EtamaFactory : MonoBehaviour {

public GameObject EtamaPrefab; //設計図を入れる箱をGameObject型変数、EtamaPrefabとして宣言。
//ここではまだただの箱。
//実体はプロジェクトビューにおるEtamaPrefabなので
//後でD&Dでアウトレット接続するために最初にpublicをつけておく。
//これがコンセントの接続口になる。

float limit = 1.0f; //何秒ごとに弾を生産するか決める変数limitを宣言。
float counter = 0; //数を数える変数counterを宣言。counterがlimitに達すると新しい弾を作る。

// Use this for initialization
//void Start () {
//
//}

// Update is called once per frame
void Update () {

this.counter += Time.deltaTime; //Time.deltaTimeでフレーム時間を数えてcounterに代入。

if (this.counter > this.limit) { //counterがlimitに達した時の処理
this.counter = 0; //まずカウンターを0に戻す。

//新しい弾の座標を入れるためのGameObject型変数 EtamaMake を宣言。まだただの箱。
//Instantiate関数で弾の分身を作る。
//設計図(EtamaPrefab)を渡すと分身を作ってくれる。
//Instantiate関数は分身をObject型で返そうとするので
//as GameObject でgameobject型に変換する。キャストというそうな。
GameObject EtamaMake = Instantiate (EtamaPrefab) as GameObject;

int esx = Random.Range (-4, 4); //最初の弾の出現位置をランダムに決定

EtamaMake.transform.position = new Vector3(esx,7,0); //EtamaMakeに座標を入れて実体化

}

}
}

////////////////////////////////////////
ー広告ー



Unityでシューティングゲームの当たり判定を考える

前回までで自機と敵の弾を動かすことができました。

今回は自機と敵の弾との当たり判定を組み込みたいと思います。

まず、敵弾の中心座標と自機の中心座標との距離を求める。
これをkyoriとする。

次に
敵弾の半径をrEとする。
自機の半径をrSとする。

kyori < rE + rS の時、敵弾と自機は衝突しているらしい。

1.最初に自機(ship1)オブジェクト情報にアクセスするゲームオブジェクト型変数、playerを宣言。
GameObject player;

2.スタート関数内でship1オブジェクトを見つけてplayerに代入、実体化。
this.player = GameObject.Find (“ship1”);

3.アップデート関数内で
敵弾座標をposEに代入
Vector2 posE = transform.position;

自機座標をposSに代入
Vector2 posS = this.player.transform.position;

4.自機から敵弾に向かうベクトルdirを計算
Vector2 dir = posE – posS;

5.ベクトルdirの長さを求めてkyoriに代入。
float kyori = dir.magnitude;

6.
敵弾の半径を0.1に設定
float rE = 0.1f;

自機の半径を0.5に設定
float rS = 0.5f;
この値を変えると当たり判定を大きくしたり小さくしたりできる。

7.敵弾半径(rE)と自機半径(rS)を足したものより
ベクトルdirの長さ(kyori)が小さいと衝突してるので
衝突してたら敵弾を消す。
if (kyori < rE + rS) {
Destroy (gameObject);
}

8.書けたら保存して実行してみる。

ちゃんと当たったら敵の弾が消えてて正常に当たり判定できている模様。
やったー ^^v

///////////////////////////////////////

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Esmove : MonoBehaviour {

float esx = 0; //敵弾のx方向を入れる変数を宣言。

GameObject player; //ship1オブジェクト情報にアクセスするゲームオブジェクト型変数、playerを宣言。

// Use this for initialization
void Start () {

//↓ここでfloat esx = … としてしまうと下のtransform.Translate に反映されない!苦しんだ俺!
this.esx = Random.Range (-0.03f, 0.03f); //敵弾のx方向の軌道をランダムに決める

this.player = GameObject.Find (“ship1”); //ship1オブジェクトを見つけてplayerに代入、実体化。
}

// Update is called once per frame
void Update () {

//transform.Translate (this.esx, -0.1f, 0); //敵弾を動かす処理
transform.Translate (this.esx, -0.01f, 0); //敵弾を動かす処理

if (transform.position.y < -5.0f) { //画面下に消えると弾オブジェクトを消す
Destroy (gameObject);
}

//当たり判定

Vector2 posE = transform.position; //敵弾座標をposEに代入
Vector2 posS = this.player.transform.position; //自機座標をposSに代入
Vector2 dir = posE – posS; //自機から敵弾に向かうベクトルdirを計算

float kyori = dir.magnitude; //ベクトルdirの長さを求めてkyoriに代入。
float rE = 0.1f; //敵弾の半径を0.1に設定
float rS = 0.5f; //自機の半径を0.5に設定

if (kyori < rE + rS) { //敵弾半径と自機半径を足したものよりベクトルdirの長さが小さいと衝突してる
Destroy (gameObject); //衝突してたら敵弾を消す
}

}
}

///////////////////////////////////////////
ー広告ー