unityでシューティングっぽいのを作る2

前回の記事
前回までで背景を表示して自機を動かすまでやりました。

今回は敵の弾を動かしたいと思います。
まず画面の上から下へ1発だけ弾を動かします。
その際、垂直に落とすのではなくて
ランダムな方向へ撃ちたいと思います。

上から下へのY方向の速度は一定とします。
ランダムな方向に撃つのでX方向の値をランダムに変えてやれば良さそうですな。

1.プロジェクトビューの敵の弾の画像(Etama)をシーンビューにD&D。

2.敵の弾を動かすスクリプトを作る。
プロジェクトビューのcreate→C#script
名前をEsmoveにしました。

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

最初に敵弾のx方向を入れる変数(esx)を宣言。
float esx = 0;

で、スタート関数内でX方向の値をランダムに決定しようとして
float esx = Random.Range (-0.03f, 0.03f);
って書いちゃったからうまく行かずに苦しみました。
こう書くとなんでか下のupdate関数に反映されず、
垂直に弾が落ちることに。
つまりesx=0になってた。

ここでは
this.esx = Random.Range (-0.03f, 0.03f);
こう書くと思い通りの動きになりました。

正直thisの使い方がよくわからんのです^^;

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

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

public class Esmove : MonoBehaviour {

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

void Start () {

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

void Update () {
transform.Translate (this.esx, -0.1f, 0); //敵弾を動かす処理
if (transform.position.y < -5.0f) {
//画面下に消えるとオブジェクトを消す

Destroy (gameObject);

}

}

}

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

4.書けたら保存してヒエラルキービューのEtamaにD&Dしてアタッチする。

5.実行してみる。


やったー
弾がランダムな方向に飛んでいくよー ^^v

——————————–
ー広告ー



unityでシューティングゲームっぽい何かを作る

unityでシューティングゲームっぽい何かを作ります。
まだまだ練習段階です。

とりあえず

①プレイヤーを動かす
②複数の敵の弾をランダムに動かす
③弾とプレイヤーの当たり判定を組み込む

この3つをやりたいと思います。

1.新しいプロジェクトを2Dで作成。

2.縦画面のシューティングにするのでSceneの隣のGameをクリックして
ゲームビューに切り替え、左上の画面設定でiPhone5 Tallを選択。
画面が縦画面になる。

3.使用する素材画像をプロジェクトビューにドラッグ&ドロップ。

4.自機ship1と背景画像bg1をシーンビューにD&D。

5.背景が一番奥、その次に自機が表示されるようにレイヤーを調整する。
インスペクタパネルのorder in Layerを1にする。
背景は0にする。

6.とりあえず一回実行してみる

こんな感じ

7.自機を動かすスクリプトを作る。
プロジェクトビューのcreate→C#script

名前をshipmoveにする。

8.自機を動かす処理を書き込んでいく。
////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class shipmove : MonoBehaviour {

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

// Use this for initialization
void Start () {

}

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

//左移動
if (Input.GetKeyDown (KeyCode.LeftArrow)) { //もし左キーが押されたら
this.sx = -0.1f; //移動量-0.1をセット。語尾にfを忘れると怒られる。
transform.Translate (this.sx, 0, 0); //移動させる処理
}

//右移動
if (Input.GetKeyDown (KeyCode.RightArrow)) {
this.sx = 0.1f;
transform.Translate (this.sx, 0, 0);
}

//上移動
if (Input.GetKeyDown (KeyCode.UpArrow)) {
this.sy = 0.1f;
transform.Translate (0, this.sy, 0);
}

//下移動
if (Input.GetKeyDown (KeyCode.DownArrow)) {
this.sy = -0.1f;
transform.Translate (0, this.sy, 0);
}

}
}
////////////////////////////////

実行してみると自機は動くけど一回押しただけでは1回動くだけで
押しっぱなしを検知していない模様。
あとthis.sy = -0.1f;の語尾のfを忘れるとエラーになるよ。

押しっぱなしを検知するにはInput.GetKeyDownではなく
Input.GetKeyを使うとうまくいった^^v

—————————————-
ー広告ー



Unityで文字を表示する

http://bouoexpress.xyz/2017/09/01/unity1-5/
上の記事の続き。

前回まででボールを左右に転がすことができたので
今回は文字を表示したいと思います。

ボールが画面端まで転がって反射した回数を表示します。

簡単かと思ったら思うように表示されなくてすごい変なやり方になってます。もう少し勉強して正しいやり方を身に付けたい。

1.ヒエラルキービューのcreate→UI→TEXT

2.ヒエラルキービューのTEXTをクリックして適当に名前を付ける。
mojiという名前にしました。この作業はやらんでええかも。

3.インスペクターパネルで文字表示位置を調整する。
Pos X=-200 Pos Y=200
Width=300 Height=50
でアライメントを左寄せ・高さを中央に設定

4.文字を表示する用のスクリプトをいちいち書かないといけないみたい。
あー面倒面倒。
プロジェクトビューのcreate→C#Scriptで新しいスクリプトを作成。
名前をwordにする。

5.wordに色々記述していく。
////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //UIを使うのに必要

public class word : MonoBehaviour {

GameObject mojiOBJ; //GameObject型の変数 mojiOBJを宣言。この時点ではただの空箱
GameObject ball; //GameObject型の変数 ballを宣言。この時点ではただの空箱
float itiX = 0; //ボールのX座標を入れる変数をフロート型で宣言。
float reflec = 0; //反射回数を記録する変数をフロート型で宣言。

// Use this for initialization
void Start () {

this.mojiOBJ = GameObject.Find (“moji”); //テキストのUIを見つけて代入、実体化
this.ball = GameObject.Find (“ball”); //ゲームシーン内にあるballというオブジェクトを見つけて代入、実体化
}

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

//transformコンポーネントの位置情報positionにアクセスして座標情報をゲット
this.itiX = this.ball.transform.position.x; //itiXにballのx座標を入れる。
if(itiX > 8) { //もし画面右からはみ出しそうになれば
this.reflec += 1; //反射回数を記録する変数reflecに1加算
}

if(itiX < -8) { this.reflec += 1;
}

this.mojiOBJ.GetComponent ().text = “反射回数 “+this.reflec+” 回”; //文字を表示する

}
}
////////////////////////////////

6.書けたらセーブする。

7.これをmojiにドラッグ&ドロップすればいいのかと思ったらそうじゃなくてなんか全体を管理する監督っぽいのを作らないといけないらしい。
ヒエラルキービューのcreate→Create Emptyで空のゲームオブジェクトを作成。kantokuって名前を付ける。

7.さっき書いたwordスクリプトをこの空のゲームオブジェクトkantokuにドラッグ&ドロップしてアタッチする。

8.実行してみる

一応正常に表示できてるけど・・・
こんな面倒なやり方は絶対に間違ってるよ。

http://bouoexpress.xyz/2017/09/01/unity1-5/

上の記事で作ったballmoveのスクリプトとかぶってる部分が多いし二度手間になってる。ballmoveのボールが画面端に来た時のif文で
this.reflec += 1;
ってやって加算させればいいと思ったけどそのreflecにwordのスクリプトからどうやってアクセスしたらいいのかわからんかった。

もっとスマートな方法があるんだよな?

とりあえずなんとか文字の表示はできた。
疲れたので今日はもうおしまい。

——————————————
ー広告ー




unityでオブジェクトの座標を得る

前回まででボールの画像を回転させて移動させることができました。

これだけではボールは画面の外に飛び出して永遠に右方向に転がり続けます。

ボールのX座標を取得して条件式で画面の端までボールが転がると逆方向に転がるようにしたいと思います。

public class ballmove : MonoBehaviour { の下に色々追加します。

//ボールのX座標を入れる変数をフロート型で宣言。
float itiX = 0;

//GameObject型の変数 ballを宣言。この時点ではただの空箱
GameObject ball;

//ゲームシーン内にあるballというオブジェクトを見つけて代入。
//空箱を実体化

void Start () {
this.ball = GameObject.Find (“ball”);
}

//update関数内に色々追加。

//transformコンポーネントの位置情報positionに
//アクセスして座標情報をゲット
//itiXにballのx座標を入れる。

this.itiX = this.ball.transform.position.x;

//もし画面右からはみ出しそうになれば
//逆方向に移動させて
//回転も逆回転させる

if(itiX > 8) {
this.speed = -0.1f;
this.kaiten = 7;
}

//もし画面左からはみ出しそうになれば
//逆方向に移動させて
//回転も逆回転させる

if(itiX < -8) {
this.speed = 0.1f;
this.kaiten = -7;
}

スクリプトを保存してゲームシーン上の▶︎ボタンで動作確認。

ほほー

思い通りに動いているではありませんか〜 ^0^

ただ、なんかやり方が回りくどいような気がしないでも無いです^^;

もっと簡単な方法があるかもしれません。

コンポーネントはこれからよく出てくるみたいなので

しっかり勉強しておかないとわけがわからんなるかも。

transformはコンポーネントの1種で

コンポーネントとは設定資料のようなものだそうです。

transformコンポーネントは座標や回転、移動などの

動きに関する資料をくれるのね。

つまり

ball.transform.position.x

はオブジェクトballのx座標をくれ。と言っている。

コンポーネントを利用する際の正規の書き方は

GetComponent<??>()

と書く。

<>の部分は半角英数です。
ブログで書くとタグ扱いになって表示されないから全角で書いてます。

上のtransformコンポーネント使用も正しくは

GetComponent<transform>().position.x

となる
のかな。

ただしtransformは省略してそのまま使えるみたい。

次回はテキストのコンポーネントにアクセスして

文字を表示してみたいと思います。

—————————————
<広告>




Unityでadmobの広告を表示させる

Unityで作ったiPhone用のアプリにadmob広告を表示させようとしてとても苦労したお話。

1.https://github.com/googleads/googleads-mobile-unity/releases
プラグインをダウンロードする

2.assets→import package→custom package

GoogleMobileAds.unitypackageを選択

3.全部の項目にチェックが入っているのを確認してimportをクリック

4.なんか勝手にcocoapodsとかいうのをインストールされる。何ですかこれ

5.空のゲームオブジェクトを作る

6.C#スクリプトを作って書き込んでいく

7.以下の記述はこちらのサイト様を参考にさせていただきました。

http://www.kurisankaku.xyz/entry/2017/03/19/192245

//———————————————–
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using GoogleMobileAds.Api;

//↓class名は新規に作ったC#スクリプトのファイル名
public class adc : MonoBehaviour {

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

private void RequestBanner()
{
#if UNITY_ANDROID
string adUnitId = “INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE”;
#elif UNITY_IPHONE
//string adUnitId = “INSERT_IOS_BANNER_AD_UNIT_ID_HERE”;
string adUnitId = “ca-app-pub-3940256099942544/6300978111”;  //テスト用広告ID
#else
string adUnitId = “unexpected_platform”;
#endif

// Create a 320×50 banner at the top of the screen.
BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder()
.AddTestDevice(AdRequest.TestDeviceSimulator) // Simulator.
.AddTestDevice(“2077ef9a63d2b398840261c8221a0c9b”) // My test device.
.Build();
// Load the banner with the request.
bannerView.LoadAd(request);
}
}

//———————————————–

8.できたスクリプトを空のGameObjectにドラッグ&ドロップしてアタッチする。

9.file→build settings

10.PlatformはiOSを選択してswitch platformクリック。
 Run in Xcode asはRelease
Development Buildにチェックを入れる
Player Settingsをクリック

11.Bundle IdentifierにバンドルIDを入力
 Automatically Signにチェック
 Automatic Signing Team IDを入力
 Target SDKにDevice SDKを選択

12.Buildボタンをクリックして保存場所を指定してビルドする。

13.ビルド完了後保存場所のフォルダが開くのでこのファイルをダブルクリック。Xcodeが起動する。

14.下記のサイトからGoogle Mobile Ads SDKをダウンロード。
https://developers.google.com/admob/ios/download

15.GeneralのLinked Frameworks and Librariesにフレームワークをいっぱい追加。

AdSupport.framework
AudioToolbox.framework
AVFoudation.framework
CoreGraphics.framework
CoreTelephony.framework
EventKit.framework
EventKitUI.framework
MediaPlayer.framework
MessageUI.framework
StoreKit.framework
SystemConfiguration.framework

それとさっきダウンロードしたMobile Ads SDKを左のフレームワークのところにドラッグ&ドロップして追加しました。
copy items if needed にチェックを入れておきました。
入れなくてもいいかも?
この辺はよくわかりません^^;

フレームワークが足りないとビルドした時に
linker command failed with exit code 1
といったエラーが何回も出て泣きそうなる。

赤で表示されてるファイルが無いか見つからないようだ。
調べてみるとlibPods-Unity-iPhone.aというのはなくても良いぽい。

左と中央に表示されてるlibPods-Unity-iPhone.aをdeleteボタンで削除。

もう一つ、libiconv.2.dylibというのが見つからんようですがこれはxcodeがバージョンアップした時にファイル名が変わったそうでlibiconv.2.tbdというファイル名になっているらしい。

フレームワーク集の中を探したらあったので念のためこいつも追加しておく。

準備が整ったらビルドして実機に転送。

やっとテスト広告を表示できました。
めでたし めでたし。
ここまでくるのに何度もエラーが出てくじけそうになりましたよ!
一日潰れた。^^;

unityで回転させながら移動させる

画像オブジェクトを動かします。

登録した画像をシーンビューにドラッグ&ドロップして配置していく。

画像が重なった場合、下にある画像を上に表示したいときは右のインスペクターパネルの Order in Layer の数値を上げると上に表示されました。

画像ファイルとして丸いボールの画像を用意しました。

ball.png

画面をクリックしたらボールが右に転がるように動かしたいと思います。

・プロジェクトビュー内で右クリック。

・createからC#scriptを選択。

・できたスクリプトファイルに名前をつける。
ballmoveと名付けました。

・できたファイルをダブルクリックして開く。

・編集していく。

public class ballmove : MonoBehaviour の括弧内で

//ボールを動かす変数speed をフロート型で宣言。
float speed = 0;

//回転スピードを入れる変数kaitenをフロート型で宣言。
float kaiten = 0;

Update関数内で

//もしマウスがクリックされたら
//移動スピードを0.1に設定し
// 回転スピードを−7に設定
//kaiten=7とすると反時計回りになってしまう。

if (Input.GetMouseButtonDown (0)) {
this.speed = 0.1f;
this.kaiten = -7;
}

//オブジェクトを回転させる処理
transform.Rotate (0, 0, kaiten);

//オブジェクトを移動させる処理
transform.Translate (speed, 0, 0,Space.World);

・書けたら保存する。スクリプトにボールの動きを記述しました。

このままではまだダメでオブジェクトにこういう動きをしなさいよ、と

伝えてあげないといけないようです。

この作業を「アタッチする」というようです。

やり方は

ballmoveのファイルを左のヒエラルキービューのballにドラッグ&ドロップするとアタッチ完了です。

ではちゃんと動くかどうか確認してみましょう。

シーンビューの上の▶︎ボタンをクリックします。

おおー

ちゃんと思い通りに動かすことができましたー ^0^

*注意点*
Space.Worldを書かないで

transform.Rotate (0, 0, kaiten);
transform.Translate (speed, 0, 0);

このように書くとなんでか移動せずにその場で回転するだけでした。

移動しながら回転させたかったので色々調べたところ

第四引数にSpace.Worldを入れたら思い通りの動きになりました。

第四引数にSpace.Worldと入れると、ワールド座標での移動になるそうです。

まあ、よく分からんのですがこう書くとこう動くと覚えておきます^^;

———————-




unityを使ってみる その3

実際にクラスを作ってみました。

飛行機のクラスplaneです。
飛行距離は120キロ。 kyori=120
飛行時間を数値型変数timeとして宣言。int time;
そしてその下に飛行時間をアナウンスする関数を作りました。


//飛行機クラス plane
public class plane {
public int kyori=120;
public int time;

//アナウンスする関数announce 引数の時速はspeedに入る
public void announce(int speed) {
time = kyori / speed;
//飛行時間を計算してdebugで表示してリターン。戻り値無し。
Debug.Log (“当機は時速” + speed + “で飛行し” + time + “時間で目的地に到着予定です。”);
}
}


クラスから関数を呼び出してアナウンスさせる!

void Start () {

//plane型のflying変数を宣言。newでインスタンス注入。実体化。 plane flying = new plane ();

//speedの項目に時速(60)を入れてannounce関数を呼び出し
flying.announce (60);
{

実行結果

当機は時速60キロで飛行し2時間で目的地に到着予定です


クラスと関数について学習したので次は画像のオブジェクトを動かしてみたいと思います。テスト実機にはiPhoneを使用し実際にちゃんと動くか確認したいと思います。

1:動かす画像ファイルを用意する。gazou.png

2:unityを起動

3:new+をクリック

4:プロジェクト名、保存場所を指定して2Dを選択してcreate projectをクリック

5:画像ファイルgazou.pngをプロジェクトビューの下部にあるassetsって欄にドラッグ&ドロップする。これで画像ファイルが素材として登録されるようです。

6:ツールバーのfileからbuild settingsをクリック。

7:左下のplatform欄でiosを選択してswitch platformをクリック。

8:build settingsの画面を閉じる

9:シーンビューのgameタブをクリック。左上のfree aspectって書かれてるところをクリックすると下に候補となるiPhoneのアスペクト比が出てくるのでiphone5wideを選択。

10:ツールバーのfileからsave scene asを選択して名前をつけて保存。

プロジェクトの準備はこれで完了です。

————————————————————-
<広告>



unityを使ってみる その2

前回に続き関数を学習します。

int kazu=0;//数値型の変数kazuを使う宣言

//引数あり、戻り値ありの関数CLCsub。呼び出し元はCLC元とする。
//aとbの要素を引数として受け取ったら掛け算して値を返す関数。
int CLCsub(int a,int b){
int c = a * b;
return c;
}

//関数CLCsubに5と4を引き渡すぜ!掛けて返してくれ!
//そして次にsub1にkazuを渡して文字列表示してくれ!
void Start () {
kazu = CLCsub (5, 4);//CLC元
sub1 (kazu);//sub1元
}
結果
→エラー

これは何がいけなかったのかというと数値型のkazuを文字列型の関数sub1に飛ばしたからエラーになったと思われる。

そこで数値型変数を飛ばしても大丈夫なようにもう一個作る。

//引数あり、戻り値無しの関数sub2。数値用。呼び出し元はsub2元とする。
void sub2(int box2){
Debug.Log (“お返しします” + box2);
}

void Start () {
kazu = CLCsub (5, 4);//CLC元
sub2 (kazu);//sub2元
}
結果
→お返しします20


:クラスについて:

関数とか変数をひとまとめにしたグループをクラスと言うそうです。

作ったクラスは独自の型を持つことができるようです。
ahoというクラスを作り、その中にtalkという関数を作ったとすると

int a=0;//数値型変数aの使用を宣言
string b;//文字列型変数bの使用を宣言
aho c;//aho型変数cの使用を宣言

cの中には何も入ってないので何か代入して実体を持たせないと使えないようです。
この代入する実体をインスタンスと呼ぶそうです。
このように書くとcに実体が入るようです。

aho c=new aho();

:クラスの書き方:

public class aho{
public void talk(){
Debag.Log(“ふとんが吹っ飛んだ”);
}
}

ahoクラス内のtalk関数を使うときは
aho.talk();

結果

ふとんが吹っ飛んだ

:publicとprivateについて:

publicは他のクラスから呼び出せるが
privateは他のクラスから呼び出せない

そんなんやったら全部public使いますわ。

次回は実際にクラスを作って実装してみたいと思います。

————————————————————-
<広告>



unityを使ってみる その1

1:unityを起動

2:NEWをクリック

3:project name: New Unity Project1
:location: 保存するファルダを指定
:organization:会社名を入力
:2Dか3Dかを選ぶ

4:create projectをクリック

5:プロジェクトビュー内で右クリック、create 、C#scriptをクリック

6:できたファイルに名前をつける。test1。これがスクリプトを記述するファイルのようです。

7:画面左上のcreateをクリック、create emptyをクリック。

8:さっき作ったtest1のファイルアイコンを左上に表示されているgame objectの文字のところにドラッグ&ドロップする。これでtest1スクリプトに書いた命令がgame objectで実行されるようになるのですな。

9:test1をダブルクリックして記述を開始しようとすると
error while trying to load the project・・・とか言われてエラーが出る。よくわからんのでOKをクリック。一回閉じてまた起動するとエラーが出なかった。

10:void Start () {
}
この{}内に記述された内容がゲーム起動時に一回実行されるようだ。

その下の
// Update is called once per frame
void Update () {
}

この{}内に記述された内容が繰り返し実行されるようだ。HSPのメインループのようなところかな。


:関数を使う:

関数の概念がよくわからん。swiftでもわからんかった。
HSPのgosubみたいな感じなのかなぁ?

public class test1 : MonoBehaviour {
void sub1(string box1){
Debug.Log (“お返しします” + box1);
}

void Start () {
sub1 (“これをbox1に入れろ”);
}

実行結果
→お返ししますこれをbox1に入れろ

この関数は引数はあって戻り値はない関数みたいです。

「お返ししますこれをbox1に入れろ」という文字列を返してるので戻り値はあるように思えるのですが。

まあこのへんは慣れていくしかないですなぁ。

ちなみに末尾のセミコロン忘れたら
all compiler errors have to be fixed before you can enter playmode
とか言われてエラーが出ましたよ。unity初エラー。

セミコロン入れる習慣がなかったからうっかり忘れるね^^;

————————————————————-
<広告>