▽メニュー開く 
3Dアクションゲームを作る

前回の続き

Enemyオブジェクトも球を飛ばせるようにする。
EnemyMove.csで、
初期設定に
public GameObject prefab; //プレファブ設定

一番下の}の前に
    //キャラクター読み込み
    GameObject LoadBullet(){
        GameObject bullet = GameObject.Instantiate(prefab) as GameObject;
        return bullet;
    }

void attacking(){}の中に
GameObject bullet = LoadBullet();
を入れる。

Hierarchy>Enemyを選択して
Inspector>EnemyMoveのPrefabを、EnemyBulletとする

ゲームを起動して、
Inspector>EnemyMoveのEnemyStateをAttackingにすると
そうすると無尽蔵にEnemyBullet(Clone)というオブジェクトが増殖する

Project>Prefabs>EnemyBullet
にある
AddComponent>PhysicsのRigidbodyをつける

    GameObject LoadBullet(){}に追記
        pForward =  transform.TransformDirection(Vector3.forward); //オブジェクトの正面の情報を得る
        pForward.y =  1;//高さ設定
        bullet.transform.position =& nbsp;transform.position + pForward; //Prefabの座標
        bullet.GetComponent<Rigidbody>().velocity = pForward*bulletSpeed;

void attacking(){}のGameObject bullet = LoadBullet(); を
if (enemyTime <= 0) {}に変更。

ゲームモードで確認すると、単発で発射される。

手動で、Attachingにしていたものを
PlayerがSearchArea内に入ると、攻撃を始めるという行動を追加する

Hierarchy>Enemy>SearchAreaを選択し
inspector>AddComponent>NewScriptに
SearchArea.csという名前のファイルを作り、Project>Assets>Scriptsに入れる





作ったファイルを開きます。

void Update () {}
下に枠内に入った時、出た時を認識するスクリプトを追記

//入った時
void OnTriggerEnter(Collider other){
}
//出た時
void OnTriggerExit(Collider other){
}

これだけだと、あったもの全てに反応してしまうので
tagを付けて識別する
Hierarchy>Playerを選択しInspectorの、Tagの右側をPlayerに変更





ーーーSearchArea.csーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;

public class SearchArea : MonoBehaviour {
    EnemyMove enemyState2; //コンポーネントの名前を入れ る

    // Use this for initialization
    void Start () {
        enemyState2 = transform.parent.GetComponent<EnemyMove> ();
    }
   
    // Update is called once per frame
    void Update () {
    }
       
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Player") {
            enemyState2.enemyState = EnemyMove.State.Attacking;
            enemyState2.enemyTime = enemyState2.shootingBaseTime;
        } else {
            enemyState2.walkMuki = 2;
        }
    }

    //OnTriggerStayでも大丈夫だけど一瞬すぎるからダメかも?
    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.tag == "Player") {
            Debug.Log (other.gameObject.tag);
            enemyState2.enemyState = EnemyMove.State.Waiting;
        } else {
            enemyState2.walkMuki = 2;
        }
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーー

if (other.gameObject.tag == "Player") {
当たったオブジェクトのTagがPlayerだったら

transform.parent.GetComponent<EnemyMove> ();
このオブジェクトの親のEnemyMove

EnemyMove enemyState2;
コンポーネントの名前を入れる

これで、searchArea内に入った時攻撃を始めるようになります


戻る 次へ

運営者画像
Reon Viewin