ランスタのブログ

気になった事の実験や検証、Cinema4Dでのモデリングや使い方、Unityのゲームアプリ制作に関する記事を書いています。

【スポンサーリンク】

【Unity】iOSアプリ仕様の3Dジャンプアクションゲームを制作みる。【開発】(その11)

【スポンサーリンク】

f:id:Lanstar:20170528232930p:plain

Unityでios用3Dジャンプアクションゲームアプリ制作【第11回】

 
今回は「Enemy」スクリプトにPlayerが追いかける為の範囲内に入ったらEnemyオブジェクトが追従してくるコードを書いていきたいと思います。
 
では「Enemy」スクリプトをダブルクリッ
クしてMonoDevelopを開いて下さい。
開いたら以下のコードを書いてください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class Enemy : MonoBehaviour {
Transform player;
// Use this for initialization
void Start () {
player = GameObject.Find("Player").transform;
}
// Update is called once per frame
void Update () {
if(player == true){
Vector3 playerPos = GameObject.Find("Player").transform.position;
float kyori = Vector3.Distance(playerPos,transform.position);
if(kyori <= 15){
Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation,rotation,Time.deltaTime * 1);
transform.Translate(Vector3.forward * 0.9f * Time.deltaTime);
}
}
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 
書いたらビルドしてUnity側に戻って下さい。
 
そして再生ボタンを押して少し遠いですが敵の所まで行ってみて下さい。
(最初の位置からプレイするのが面倒な場合はPlayerオブジェクトの位置をPositionXに10、PositionYに4、PositionZに63に変更した場所から始めて下さい。)
 
ある場所までEnemyオブジェクトに近づくとEnemyがPlayerに向かって追ってくるのが確認出来ます。
 
ではコードを確認しながら説明していきます。
 
Transform player;
の意味はplayerのTransformの情報を入れる為の変数です。
 
次の
player = GameObject.Find("Player").transform;
の意味はplayer変数に「Player」オブジェクトのTransformの情報を入れています。
 
そしてUpdate()内にある
if(player == true){
Vector3 playerPos = GameObject.Find("Player").transform.position;
float kyori = Vector3.Distance(playerPos,transform.position);
if(kyori <= 15){
Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation,rotation,Time.deltaTime * 1);
transform.Translate(Vector3.forward * 0.9f * Time.deltaTime);
}
}
↑の意味は、
 
もし Playerオブジェクトのtransform が ヒエラルキー上に存在していたら
if( player == true){
 
playerPos に PlayerオブジェクトのXYZ位置の情報を入れる。
Vector3 playerPos = GameObject.Find("Player").transform.position;
 
kyori に playerのXYZ位置とEnemyのXYZ位置の2点間の距離を入れる
float kyori = Vector3.Distance(playerPos,transform.position);
 
もし kyori が 15の数値以下なら(追従する範囲内に入ったら)
if (kyori <= 15){
 
rotation に playerの位置とEnemyの位置を引いた数値に向かせる
Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
 
現在のXYZ回転 に playerの方向に少しずつ方向転換させる数値を入れている
transform.rotation = Quaternion.Slerp(transform.rotation,rotation,Time.deltaTime * 1);
 
Enemyの今の位置から enemyの向いている方向(forward)に0.9ずつ進ませる(前進させる)
transform.Translate (Vector3.forward * 0.9f * Time.deltaTime);
}
}
と言う事です。
 
Playerに対してEnemyオブジェクトが追従するスクリプトは完成しました。
 
次はPlayerrがEnemyに接触するとPlayerは消えるようにしてみましょう。
 
では作成していた「player」スクリプトをダブルクリックしてMonoDevelopを開いて下さい。
 
PlayerがEnemyに接触した時にPlayerを削除して、ゲーム中の進む時間を0(要するに画面が停止している状態)にするコードを付け足しているので、確認しながら付け足して下さい。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class player : MonoBehaviour {
int jumppower = 500;
Rigidbody rigid;
// Use this for initialization
void Start () {
rigid = GetComponent();
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision col){
if(col.gameObject.tag == "wall"){
rigid.AddForce(Vector3.up * jumppower);
}
if(col.gameObject.tag == "Enemy"){
transform.DetachChildren();
Destroy(gameObject);
Time.timeScale = 0;
}
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 
書いたらビルドして、再生ボタンを押して下さい。
 
そして、わざとEnemyオブジェクトに接触してPlayerが削除されているか、画面が停止した状態になっているか確認して下さい。
 
確認できたらコードの説明をしていきます。
 
付け足したコードの
if(col.gameObject.tag == "Enemy"){
transform.DetachChildren();
Destroy(gameObject);
Time.timeScale = 0;
}
↑の意味は、
 
もし 接触したオブジェクトのタグ が Enemyなら
if (col.gameObject.tag == "Enemy"){
 
Playerの子の階層(つまりMain Cameraオブジェクト)を切り離す。
transform.DetachChildren();
 
削除 このオブジェクト
Destroy(gameObject);
 
ゲームの進行を0の時間にする(つまり停止させる)
Time.timeScale = 0;
}
と言う事です。
 
Playerの子の階層(つまりMain Cameraオブジェクト)を切り離す為のコードは何故切り離す必要があるのかと言うと、 Playerの下の階層にあるMain Cameraを切り離さない状態にしてしまうと、このPlayerとMain Cameraの2つのオブジェクトが削除されてしまう為、Main Cameraまで削除して無くなるとゲーム画面が写らなくなってしまうからです。
 
ではどうなるのか試しに
 
transform.DetachChildren();
のコードの部分の前に//を付けて下さい、以下のようになります。
 
//transform.DetachChildren();
これで↑のコードはコメント状態にして無効中にしています。
 
ビルドして確認してみましょう。
 
Main Cameraも削除されゲーム画面が写らないのが確認出来たと思います。
 
次に、
 
Time.timeScale = 0;
 
の部分はゲームの進行時間を停止させており、数値を1にすると通常の進行速さになります。数値を2にした場合は2倍の速さになり、0.5などにするとスローしたような感じになります。
 
これでほとんど完成の状態になりました。
 
次回はクリアエリアに触れるとゲームがクリアした状態にさせるスクリプトを書いていきたいと思います。
 
 

【スポンサーリンク】