日々惑う -雑記ブログ-

プログラミングやUnityの使い方、ソシャゲ運営の手法など自身の考え方などをまとめていく。

3.ショット実装

「Unityで個人開発をしたい人のための 3Dゲーム試作ワークショップ -トライコア勉強会- #3」の講義内容のまとめ
ショットの生成までの内容の要点抜粋になります。
※ 暫定的な記載な為、後日補足します

ゲームオブジェクトのInstantinate

弾の作成

弾のゲームオブジェクトを作成
GameObject > 3D Object > Sphere
名称: PlayerShot
Scale 0.2
rigidbody を追加
プレハブ化

スクリプトの作成

弾を打ち出すスクリプトを作成
名称: Shooter

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shooter : MonoBehaviour {

    // Unity側で設定する、ショットとしてコピーするためのプレハブ(設計図)
    public GameObject shot;

    // Unity側で設定する、ショットを生み出す場所を見るための空のオブジェクト
    public GameObject shotPoint;

	// Update is called once per frame
	void Update () {
        // スペースキーが押されたとき
        if(Input.GetKeyDown(KeyCode.F))
        {
            // ゲームオブジェクト(ショットの設計図のコピー)を生み出す!
            GameObject newShot = GameObject.Instantiate(shot);

            // 生み出したゲームオブジェクトのポジションをshotPointと同じに.
            newShot.transform.position = shotPoint.transform.position;

            // 生み出したゲームオブジェクトの向いている方向を自分と同じに
            newShot.transform.rotation = gameObject.transform.rotation;
        }
    }
}

Player に Shooter コンポーネントを追加
Instanciate の shot に PlayerShot のプレハブを設定

弾を生成する場所を決める

空のオブジェクトを作成
ShotPoint と名前を付ける
Player の下層に配置

空のオブジェクトは[Scene]のどこにあるか見えないので
[Inspector] オブジェクト名称のチェックボックスの左にあるアイコンをクリックして、Select Icon から好きなものを選択して表示させる
f:id:kazafe:20180227005805p:plain
f:id:kazafe:20180227010017p:plain

ショットの発射

弾が進むようにスクリプトを作成
名称: PlayerShot

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShot : MonoBehaviour {

    // 弾のスピード
    public float speed = 1.0f;

    // 弾が持っているRigidBody
    public Rigidbody rigid;

	// Update is called once per frame
	void Update () {
        // 物理で自分自身が進む力を、
        // 自分が向いている方向にspeed分だけ進むように強制書き換え
        rigid.velocity = transform.forward * speed;
	}
}

f:id:kazafe:20180227004416p:plain
重力で変に動くことがあるので、動いて欲しくない挙動を制限する

f:id:kazafe:20180227010248p:plain

[Inspector] Rigidbody > Constraints
Freeze Posion と Freez Rotation
動いて欲しくないXYZにチェックを入れる

落ちる球の当たり判定

PlayerShot のスクリプトに以下を追加

    // コライダーが当たったことを検知したとき
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("コライダーがあたったよ!");
        //// 何かに当たったら自分を消す
        //GameObject.Destroy(gameObject);
        //// 何かに当たったら当たったやつを消す
        //GameObject.Destroy(collision.gameObject);
    }

Shere Collider > Radius
の値を変更することで当たり判定の範囲を変えることが可能
f:id:kazafe:20180227011409p:plain

ショットと敵の当たり判定

Shere Collider >Is Trigger にチェックを入れる
物理的な判定ではなくなる

PlayerShot のスクリプトで判定できる

    // トリガーが当たったことを検知する
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("トリガーがあたったよ!");
        // 何かに当たったら自分を消す
        GameObject.Destroy(gameObject);
    }

f:id:kazafe:20180227004947p:plain

Edit > Project Settings > Physics
[Inspector] Layer Collision Matrix
チェックが入っているものは衝突する
f:id:kazafe:20180227010813p:plain

Tags や Layers は
Edit > Project Settings > Tags and Layers
から新規追加が可能