PrefabとUniBulletHellとDoTween
プレハブで使用したい小技
インスペクターで取得するオブジェクトをプログラムで行う
[Header("プレイヤー")] public GameObject target;
ここにplayerをアタッチして、targetとしてました。
しかし、プレハブ化すると、毎回playerのアタッチをする羽目になり、面倒くさい。
そこで、プログラムでこの作業を簡略化。
private GameObject target;
void Start( )
{
target = GameObject.Find("player");
}
としました。
これで、毎回アタッチする必要がなくなりました。
インスペクターで取得する関数をclass操作で行う
例えば、敵がプレイヤーの死亡を確認したい時
[Header("生死を確認できるオブジェクト")] public Player pDeath;
とし、インスペクターでPlayerをアタッチします。
プレハブから実態化した時、毎回Playerをアタッチする必要があります。
敵がプレイヤーと敵のボスの状態をスプリクトで取得する例です。
【Playerのスプリクト】
public class player : MonoBehaviour
{
//関数
public string Hello()
{
string text = "死んでしまった";
return text; //返り値を宣言する
}
}
【Bossのスプリクト】
public class enemyBoss : MonoBehaviour
{
//関数
public string Boss()
{
string text = "われは強い";
return text; //返り値を宣言する
}
}
【敵のスプリクト】
プレイヤーとBossの状態を確認
using static player; //使用するクラスを宣言します。
using static enemyBoss;
public class enemy : MonoBehaviour
{
player teta = new player(); //プレイヤーを取得
enemyBoss boss = new enemyBoss(); //Bossを取得
private void Start() //今回はStart( )を使用しました。
{
string hello = teta.Hello();
string boss = boss.Boss();
if (hello == "死んでしまった")
{
//処理を書く
}
if(boss == "われは強い")
{
//処理を書く
}
}
注意: プレハブ化すると【You are trying to create a MonoBehaviour using the 'new' keyword.This is not allowed. MonoBehaviours can only be added using AddComponent().
Alternatively, your script can inherit from ScriptableObject or no base class at
all】の注意が出る
直訳→'new'キーワードを使用してMonoBehaviourを作成しようとしています。これは許可されていません。MonoBehavioursは、AddComponent()を使用してのみ追加できます。または、スクリプトはScriptableObjectから継承することも、基本クラスをまったく継承しないこともできます。
対応策がまだ分かっていませんが、たぶんGridが入るとダメっぽいです。
上記のプログラムでは異常はありませんでした。
敵(プレハブ)を自動生成する
空のオブジェクトを作成する。
名前は適当にenemyOccとする。
public class enemyOcc : MonoBehaviour
{
public GameObject enemyPrefab;
void Start( )
{
//繰り返し生成する
InvokeRepeating("Spawn", 2f, 0.5f) ; //2秒後に0.5秒間隔で生成する
void Spawn( ) //生成する
{
Instantiate(enemyPrefab, //生成するオブジェクト
transform.position, //enemyOccの位置で生成する
transform.rotation //生成する時の向き
);
}
}
敵(プレハブ)する位置をX座標でランダムに生成する
上記の関数Spawn( )を
void Spawn( ) //生成する
{
//生成する位置をランダムに変える
Vectet3 spawnPosition = new Vector3(
Random.Range(-3.0f, 2.5f), //X軸座標-3~2.5の間で
transform.position.y, //Y軸座標はそのまま
transform.position.z //Z軸座標はそのまま
);
Instantiate(enemyPrefab, //生成するオブジェクト
spawnPosition, //X軸ランダムに
transform.rotation //生成する時の向き
);
}
UniBulletHellの使い方
UniBulletHellの弾の発射Sprict
UniBulletHellは、シューティングなどで使用する弾幕を簡単に作れるアセットです。
しかし、初歩的な弾幕の出し方が分かりませんでした。
あまりにも初歩的だったようで、解説している方を見つけられませんでした。
そこで、忘れてしまっても、すぐに思い出すようにまとめてみました。
▼Player (画像あり)
▼GameObjedt (画像なしで、Shot Controllerをあてる)
■CircleShot (好みの弾幕パターン)
public class player : MonoBehaviour
{
public UbhShotCtrl usc;
void Update()
{
if (・・・)
{
usc.StartShotRoutine();
}
}
}
解説
UbhShotCtrlは、Add ComponentでGameObjedtにShotControllerを、追加した時につくスプリクトclassです。
そのclassをuscとしました。
usc.StartShotRoutine();を入れると、弾幕開始します。
if文で条件を付けるといいですね。
停止は、usc.StopShotRoutine();になります。
スタートの( )には1f等と遅延時間を入れます。
ストップでは遅延時間は使用できません。
生成した弾幕を時間で削除していく
答えは、弾自体に時間制限をつけます。
弾の場所は、UniBulletHell >Example >Prefab >Otherにあります。
使用している弾のスプリクトを開きます。
例えば、弾がEnemyBulletParentの場合、スプリクトはUbh Bullet Simple Sprite 2dと表示されています。
このUbh Bullet Simple Sprite 2dを開きます。
追加する機能は、削除する時間 : lifeTimeです。
スプリクト上部の変数設定の場所に、
[Header("弾の寿命")] public float lifeTime;と追加します。
次に、
private void Start( )
{
Destroy(gameObject, ilfeTime); //時間でこのオブジェクトを削除する
}
を記入します。
これで、弾が生成されてから、指定した時間で消えていきます。
弾幕に当たり判定を付ける
使用している弾に新なスプリクトを追加します。
1.使用している弾にCollider2D(例えばCircle Collider)を付けます。
2.Rigidbody2Dを付け、BodyTypeをKinematicにします。
Kinematicは弾かれるとか、重力で落ちるとかの外部から影響をうけません。
public classBulletTama : MonoBehaviour
{
//弾が当たってplayerの減算処理をする場合
[Header("減算ない")] public bool non;
[Header("減算スコア")] public int subScore;
private string playerTag = "player"; //プレイヤーを認識するためのタグ
private bool isHit = false; //弾が当たっていない
void Update()
{
if (!non) //スコアの減算処理をする場合
{
if (isHit) //弾が当たったら
{
Destroy(gameObject); //弾を削除
//HPの減算
if (GManager.instance != null) //GManagerというスコア管理しているClass
{
GManager.instance.score -= subScore; //スコアを減算
}
}
}
}
void OnCollisionEnter2D(Collision2D collision) //物体が衝突した時に呼ばれる。衝突データを取得します。
{
if (collision.collider.tag == playerTag) //当たった相手のタグを確認し一致していたら
{
isHit = true; //弾が当たった
}
else //タグが合わない場合には
{
isHit = false; //当たっていしない
}
}
}