アイテムを拾うスクリプトを書く上で、まず作成したのはItemのPrefabです。このプレファブは空のゲームオブジェクトにビジュアルの為のCUBE等が入っています。そして空のゲームオブジェクトに付けたスクリプトは、PhotonView.cs、BoxCollider、Rigidbodyの3つです。アイテムを取得する時にTriggerEventが起きるようにIsTriggerに✔を入れてあります。
それから、オブジェクトの場所が変わらないようにFreeze Positionに全方向✔をいれ、回転だけは拘束せずに自由に回転するようにしてあります。それから新しいタグを作成してItemLifeというタグをつけてあげています。
これを各アイテムごとに行い、ItemLife、ItemPower、ItemFastとそれぞれタグに名前を付けています。これでアイテム側の設定は終了です。次にプレイヤーのプレファブFPSplayerの設定を行います。FPSplayerのメインスクリプトであるPlayerNetworkMover.csに下記のスクリプトを追加します。
IsTriggerにチェックが入っているので、アイテムにぶつかった際、関数OnTriggerEnterが呼ばれます。そして、ぶつかったアイテムのタグによって処理を別けています。まずはPhotonNetwork.Destroyで取得したアイテムを破壊し、外部スクリプトの変数にアクセスします。この時の書き方として、2種類使用しているので、両方とも紹介します。
void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("ItemFast")) { PhotonNetwork.Destroy(other.gameObject); //ぶつかった相手をディアクティベート(消える if (photonView.isMine) { FirstPersonController firstPersonController = GetComponent<FirstPersonController>(); firstPersonController.walkSpeed += 2f; } } else if (other.gameObject.CompareTag("ItemLife")) { PhotonNetwork.Destroy(other.gameObject); //ぶつかった相手をディアクティベート(消える health += 30f; healthText.text = health.ToString() + "points"; } else if (other.gameObject.CompareTag("ItemPower")) { PhotonNetwork.Destroy(other.gameObject); //ぶつかった相手をディアクティベート(消える if (photonView.isMine) { GunShooting gunShooting = GameObject.Find("Cylinder").GetComponent<GunShooting>(); gunShooting.damage += 10f; } } }
1つはPublicな関数としてインスペクター上で親子関係を作り、そこから関数を取得するやり方です。この場合PlayerNetworkMover.csにFirstPersonController.csをインスペクター上でドラッグ&ドロップする必要があります。
Public FirstPersonController firstPersonController; //インスペクターに表示させるために冒頭にこれが必要 //関数内の処理は例えばこのように書く FirstPersonController firstPersonController = GetComponent<FirstPersonController>();//スクリプトを取得 firstPersonController.walkSpeed += 2f;//外部変数にアクセスできるようになっている
2つ目のやり方はGameObject.Find("aaa")で直接スクリプトのありかを探して取得するやり方です。この場合親子関係を作らずに直接スクリプトを引っ張ってこれます。
GunShooting gunShooting = GameObject.Find("Cylinder").GetComponent<GunShooting>(); //GunShootingクラスのgunShootingというスクリプト = //CylinderというGameObjectにくっついているGunShootingというスクリプトを取得 gunShooting.damage += 10f; // 外部変数にアクセスできる。
ただし、この場合ゲーム上のすべてのスクリプトを探してしまうので、IsMineで自分の物のみを探すようにしておかないと、相手キャラの外部変数にアクセスしてしまうので気を付けなければなりません。
それから、共通で外部変数にアクセスする場合にはクラス、変数共にPublicにしないと取得できないので注意が必要です。
これで、アイテムの取得が出来るようになりました。次はアイテムのドロップのやり方です。敵を倒したタイミングでその場所にアイテムを出現させたいので、敵クラスに下記のスクリプトを追加します。
//冒頭で配列を定義する。 public GameObject[] items; //現在位置と回転情報を取得しておく。 Vector3 currentposition = this.transform.position; Quaternion currentquanternion = this.transform.rotation; PhotonNetwork.Destroy(gameObject); //自分のキャラをデストロイ //ここからは元からある敵が倒されたときの処理 gameController = GameObject.Find("GameController").GetComponent<GameController>(); gameController.StartSpawnProcess(3f); gameController.enemyCount += 1; enemyText.text = gameController.enemyCount.ToString() + "enemy killed"; //ここまで。 //ここから追加スクリプト int index = Random.Range(0, items.Length);//配列からランダムで番号を選ぶ //0の場合ItemLife、1の場合ItemPower、2の場合ItemFastを落とす if(index == 0) { PhotonNetwork.Instantiate("ItemLife", currentposition, currentquanternion, 0); }else if(index == 1){ PhotonNetwork.Instantiate("ItemPower", currentposition, currentquanternion, 0); } else if (index == 2) { PhotonNetwork.Instantiate("ItemFast", currentposition, currentquanternion, 0); }
そして、インスペクター上に作ったItemPrefab達を全部いっぺんにドラッグアンドドロップしておきます。これで、ItemPrefabの配列が完成します。Random.Rangeを使用してランダムに配列の番号を取得し、その番号に対応したアイテムが落ちるようにしてあります。
本日はアイテムの落とし方についてのスクリプトを記録しました。ゲームはこちらのリンク先のボタンから飛べますので、是非遊んで頂けると嬉しいです。どうぞよろしくお願い致します。