一人称視点で銃弾を撃って的に当てる

投稿者: | 2019-12-14

カメラから銃弾を飛ばして的のCubeに当てます。

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

public class ThrowBallScript : MonoBehaviour
{

    Vector3 cursorPosition;
    Vector3 cursorPosition3d;
    RaycastHit hit;

    Vector3 cameraPosition;
    Vector3 throwDirection;
    

    public GameObject ball;
    Rigidbody rb_ball;

    public float thrust = 10f;



    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        cameraPosition = Camera.main.transform.position; // カメラの位置

        cursorPosition = Input.mousePosition; // 画面上のカーソルの位置
        cursorPosition.z = 10.0f; // z座標に適当な値を入れる
        cursorPosition3d = Camera.main.ScreenToWorldPoint(cursorPosition); // 3Dの座標になおす

        throwDirection = cursorPosition3d - cameraPosition; // 玉を飛ばす方向

        if (Input.GetMouseButtonDown(0)) // マウスの左クリックをしたとき
        {
            rb_ball = Instantiate(ball, cameraPosition, transform.rotation).GetComponent<Rigidbody>(); // 玉を生成
            rb_ball.AddForce(throwDirection * thrust, ForceMode.Impulse); // カーソルの方向に力を一度加える
        }
    }
}

マウス座標を3Dのワールド座標に変換してキャラクターを動かす」の方法で、マウスカーソルが示す3Dの方向を得て、その方向へ玉を飛ばします。

Ballのプレハブを作ってスクリプトにアタッチしています。

これにはコライダーとリジッドボディが付いています。

リジッドボディのCollision Detectionが「Discrete」のままだと、玉のスピードが早いときに他の物体をすり抜けることがあります。

なので、BallのリジッドボディのCollision Detectionは「Continuous Dynamic」に設定します。

銃弾のような早い玉を飛ばすときに重要です。

また、Ballをたくさん撃つとBallオブジェクトがシーンにたくさん作られてゲームが重くなるので、Ballを消すためのスクリプトをBallのプレハブに付けます。

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

public class ballScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (transform.position.y < -10f)
        {
            Destroy(gameObject);
        }
    }
}

落下したBallのZ座標が(-10)を切ると破壊されるようになります。

コメントを残す

メールアドレスが公開されることはありません。