Unityで自分に向かってくる敵の弾を作る

自分を狙って飛んでくる敵の弾を作りたいのです。

ある地点に向かってオブジェクトを動かすにはMoveTowardsを使うと出来るそうなので、プレイヤーの位置情報を取得してそこに動かせばいいのだろうと

this.transform.position = Vector3.MoveTowards(this.transform.position, new Vector3(playerpos.x, playerpos.y, playerpos.z), 0.5f);

このように書いてみたところ

自分のほうに飛んでは来たものの、ずっと張り付いて離れなくなってしまった。ずっとプレイヤーの座標を参照してるからずっとその座標を目指してしまう。

位置を参照するのは1回で良さそう。

プレイヤーのボールをP1、敵弾を赤丸とすると

プレイヤーは前に進むわけだからP1の座標を目指して敵弾を飛ばしても命中しないし狙ってる感じがしない。

プレイヤーの移動先のP2の地点の座標をゲットしてそこに飛ばそう。

public class EnemyMove : MonoBehaviour {

   Vector3 tmpE;                        //myballの位置情報をここに入れる 
    public Transform hogeEne;
    GameObject BPninja;     //
    int Ecnt = 0;       //フラグ立てに使う
    float calcZ = 0;    //敵とプレイヤーの距離を測るのに使う

    void Start () {

        this.BPninja= GameObject.Find("MyBall");            //playerposにボール位置情報を格納
        Vector3 playerpos =this.BPninja.transform.position; //
    }

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

         Vector3 playerpos = this.BPninja.transform.position;    //ball位置情報取得する
            this.calcZ = this.transform.position.z - playerpos.z;   //敵のZ座標からボールのZ座標を引く。これで距離が出る

            if (this.calcZ < 50)    //プレイヤーが弾に近づいて来たら

            {
                if (this.Ecnt == 0)     //ここで一回だけ現在のプレイヤー位置情報を調べる
                {
                    hogeEne = GameObject.Find("MyBall").GetComponent<Transform>();  //ボールを見つける
                    tmpE = hogeEne.transform.position;                              //ボールの位置情報をvector3でtmpに格納
                    this.Ecnt = 2;      //Ecntを2にして再度位置情報をゲットしないようにする
                }

                if (this.Ecnt == 2)     //Ecnt=2ならゲットした位置情報の座標にMoveTowardsで弾を飛ばす
                {
                    this.transform.position = Vector3.MoveTowards(this.transform.position, new Vector3(tmpE.x, tmpE.y, tmpE.z + 10), 0.6f);
                }
            }
        }

上のコードではプレイヤーのボールが敵弾に近づくと弾が発射されるようにしています。狙う位置はプレイヤーの移動先なのでtmpE.z + 10 としてプレイヤーより奥の座標を指定しています。

このコードを敵弾のオブジェクトにD&Dでアタッチして実行してみると

うむ!

プレイヤーが近づくと移動先に向かって敵弾が発射されました!

四角い岩も飛んできたぜ! やった^^v

buttonのPrefabを表示するのに苦労した話

こんな感じでSTARTボタンを押したらゲームがスタートするようにしたかったんです。そのボタンをPrefabで作ろうとしたらいろいろエラーが出て苦しみました・・・

まずボタンが表示されませんでした。

なんでかというとボタンとかテキストはCanvasの子オブジェクトにしてやらないと表示されないようです。ボタンのPrefabのBTstartはCanvasの外にできちゃってます。これはアカン。

いろいろ調べてCanvasの子オブジェクトとしてPrefabを作る方法を発見。

public class test : MonoBehaviour { 

public GameObject canvas;//キャンバス
public GameObject PutStart; //スタートボタンのプレファブを入れる箱 

void Start () { 

GameObject prefab = (GameObject)Instantiate (PutStart); 

prefab.transform.SetParent (canvas.transform, false); 
} 

void Update () { 
} 

}

これでいけるはずなんですが・・・

こんなエラーを吐かれてしまう。

UnassignedReferenceException: The variable canvas of MainJ has not been assigned.
You probably need to assign the canvas variable of the MainJ script in the inspector.

はぁ~ん? 何を言っとるのかわからんのう~

public class test : MonoBehaviour { 
public GameObject PutStart; //スタートボタンのプレファブを入れる箱 
public RectTransform canvas;//キャンバス 

void Start () { 
Instantiate(PutStart, new Vector3(4, 12, -299), 
Quaternion.identity).name = "PreStrat"; canvas=GameObject.Find("Canvas").GetComponent<RectTransform>(); 
PutStart.transform.SetParent(canvas.transform, false); } 

void Update () { } 

}

Canvasが見つからないのかと思ってFindで見つけようとか訳のわからんことをしてみる。

すると今度はこんなエラーを吐きだしたのでった。

Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption.

どうもこれはPrefab自身を親オブジェクトに設定しようとすると出るエラーらしい。

なんかよくわからんけど私のPrefabの作り方がおかしかったぽい。

public class test : MonoBehaviour { 

public GameObject canvas; //キャンバス 
public GameObject PutStart; //スタートボタンのプレファブを入れる箱 

GameObject ObjK; //ちゃんとInstantiateするための箱 

void Start () { 
ObjK = Instantiate(PutStart, new Vector3(3.9f, 18.6f, -298.6f), Quaternion.identity); 

canvas = GameObject.Find("Canvas"); 

ObjK.transform.SetParent(canvas.transform, false); } 

void Update () { 
} 

}

このように書くと

ちゃんとCanvas内にクローンが作れて

やっとボタンを表示することができました^0^

すごい基本的なことなのかな~?

やっぱ独学はアカンね・・・^^;

↓こういうところで本格的に勉強したいですな!




Collider Materialのbouncinessをスクリプトから変更する




こういったスロープ状のオブジェクトの上にボールを転がす時

Bouncinessを0.9くらいに設定しているとスロープ内で反射しまくります。

スロープの上にいるときはBouncinessを0にして反射させずにスルスルとボールを転がしたいのですよ。

反射させないオブジェクト用にNotReflecというタグを新しく作ります。

スロープオブジェクトのPlane.002にNotReflecタグを設定。

    
void OnCollisionEnter(Collision col)
    {
        //反射させない処理
        if (col.gameObject.tag == "NotReflec")
        {
            this.GetComponent<SphereCollider>().material.bounciness = 0;
            return;
        }
        //反射させない処理
    }

スクリプトの衝突判定処理内に上記を追加。

実行してみるとスロープの壁に反射せずにスルスルとボールが上がっていきます。やった^^

注意点としてはこの方法では反射させない障害物にぶつかっても
最初の1回は反映されずに反射してしまうようです。
2回目の衝突からは反映されて反射しなくなるみたい。

それと一度bouncinessを0にするとその後もずっと0のままなのでスロープを抜けるとまた0.9にしたい。

    void OnCollisionEnter(Collision col)
    {
        this.GetComponent<SphereCollider>().material.bounciness = 0.9f;

        //反射させない処理
        if (col.gameObject.tag == "NotReflec")
        {
            this.GetComponent<SphereCollider>().material.bounciness = 0;
            return;
        }
        //反射させない処理
    }

最初の行で0.9fに設定しておいてNotReflecタグの時だけ0にするようにしました。

するとスロープを抜けたら壁に反射するようになりました!

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




unityでオブジェクトが壁をすり抜けてしまう問題について





ブレンダーでこういうスロープ状のデッキを作って

その上にボールを転がそうとしたら

左のカーブ部分で

壁をすり抜けしまう問題発生 ^^;

ボールオブジェクトのRigidbody のCollision Detectionを

DiscreteからContinuous

に変更すると

すり抜けなくなりました! やった ^0^




徳島へ日帰りバイク旅


バイクで徳島へ

鳴門スカイラインに入る

この道の眺望は素晴らしいです^-^

途中で廃墟を発見

廃墟が好きなんです

廃墟を堪能したあと

エスカヒル鳴門にやってきたのであった

高低差34m、全長68mのエスカレーター。高くてちょっと怖いけど冒険気分に浸れます。

たどり着いたぜ ヘブンズドアー。

その先の絶景へ

ああ・・・素晴らしい

ここに来てみたかったのです

風が気持ちいい

エスカヒル鳴門 おすすめです~^0^

その後 海沿いの道を走って

徳島ラーメンいのたに鳴門店でお昼ご飯

あ~ これこれ。昔よく来たなー 懐かしい味

さらに海沿いを走る

田舎道をのんびり走るのが好き

像を発見

いい場所

四国八十八か所第一番札所の霊山寺

立派な境内

納経前に般若心経を唱えます

霊山寺の奥に大麻比古神社という大きな神社を見つけました

大きな鳥居をくぐると素敵な灯篭の道

赤い橋を渡って境内へ

霊山寺の奥にこんないい神社があったなんて

お参りしていこう

そこからちょっと西に走るとドイツ館がありました

中は有料だったので外から眺めるだけ~^^;

さあもう帰ろう

徳島は自然が豊かで良いね

徳島日帰り冒険 これにて終了


納経帳に御朱印をいただきました。

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



鳥取砂丘へ


二日目は鳥取砂丘へ

まず砂の博物館で芸術を堪能

これ全部水と砂丘の砂で作ってあるそうです。すごすぎ^0^

ムンクさん^^

さあ砂の旅路へ

一度来てみたかった鳥取砂丘

すばらしいスケールだ

脳内BGMは安全地帯の「遠くへ」

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



三朝館の温泉で癒された

鳥取県の三朝温泉へ旅行に行ってきました。

鳥取は牛コツラーメンというのが美味しいそうです。

倉吉駅近くのごっつおラーメンさんで初めて牛コツラーメンを食べましたが牛肉の旨味満点でめちゃ美味しかったです。

その後、白壁土蔵群・赤瓦という名所で観光歩き

夕方に三朝館に到着。風雅でいいお部屋~。

温泉では写真撮れなかったけどいいお湯でしたよ。

どんな病も三日目の朝には治るというラドン温泉です。

温泉で癒されてから夕食。わーい すごいごちそうや~^0^

うまうま~ ^-^

ごちそうさまでした~

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



コンビニのサンドイッチをトーストするとすごく美味しい


コンビニサンドイッチをトーストすると美味しいと聞いたのでさっそくやってみました^-^ ローソンのたまごサンドを使用。

まずレンジで20秒ほど温めてからトースターで4分くらい。

クリームチーズを添えていただきまーす^0^

うおおー これはうまいぜ~

喫茶店のホットサンドのようですわ~

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



セブンイレブン とうもろこしあられ 塩バター味


セブンイレブンのとうもろこしあられ 塩バター味を食べた感想

パッケージ裏1

パッケージ裏2

塩バター味のさくさくあられとコショウの効いたサイコロ状のフライドポテトが入っています。おいしかったです。

リピート率100%

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