0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

タップしたところに弾を飛ばす方法

Last updated at Posted at 2022-02-20

シューティングゲームで使えそうな、タップしたところにオブジェクトを飛ばす実装について

使用PC: MacBook Pro (13-inch, M1, 2020)
OSバージョン: 11.5.2
Unityバージョン:2020.3.20f1

実際にゲームをプレイすると

シューティング動画_AdobeCreativeCloudExpress.gif
こんな感じになったら完成です!

目次

1.オブジェクトの準備
2.弾が飛ぶスクリプトの作成
3.弾の出現位置を作る
4.弾を生成するスクリプトの作成
5.オブジェクトの代入

オブジェクトの準備

【Hierarchy】→【Create】→【3D Object】→【Sphere】で弾オブジェクトを作成する
②名前をBallに変更しておく
③Projectビューにドラッグ&ドロップしてPrefab化しておく
④HierarchyビューのBallは不要なので消しておく
⑤PrefabにしたBallにRigidbodyをAdd Componentする

弾が飛ぶスクリプトの作成

【Project】→【Create】→【C# Script】でScriptを作成し、名前をBallControllerに変更する

BallController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    public void Shoot(Vector3 dir)
    {
        GetComponent<Rigidbody>().AddForce(dir);
    }
}

これだけ!BallController.csをBallオブジェクトにアタッチする

コードの解説

まずは弾を飛ばす用の関数 public void Shootを作ります。
その中にRigidbodyのAddForce関数で、Ballオブジェクトに物理的な力を加え移動させるコードを書いてます。
これによって勢いよくボールが飛んでいくように実装しました!

弾の出現位置を作る

【Hierarchy】→【Create】→【Create Empty】で名前をBallGeneratorに変更

このBallGeneratorからBallオブジェクトが出てくるようにしていきます!

弾を生成するスクリプトの作成

【Project】→【Create】→【C# Script】でScriptを作成し、名前をBallGeneに変更する

BallGene.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallGene: MonoBehaviour
{
    public GameObject BallPrefab;
    GameObject Ball;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ball=Instantiate(BallPrefab) as GameObject;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 worldDir = ray.direction;
            Ball.GetComponent<BallController>().Shoot(
                worldDir.normalized * 3000);
        }
        Destroy(Ball, 10.0f);
    }
}

BallGene.csをBallGeneratorオブジェクトにアタッチする

コードの解説

①変数宣言

BallGene.cs
public GameObject BallPrefab;
GameObject Ball;

大元になる弾のPrefabと、Instantiateする用の弾をGameObject型で宣言します。
PrefabはUnity側で代入するのでpublicをつけておいてください。

②void Update関数の中に処理を書いていく。

BallGene.cs
if (Input.GetMouseButton(0)){
 Ball=Instantiate(BallPrefab) as GameObject;

マウスをクリックしたときに処理をif文で書いていきます。
次に変数宣言したGameObject型のBallの中身をBallPrefabとして生成します。

ちなみに()の中に入れる数字によってクリックの処理が変わります☺️

メソッド 処理    
GetMouseButtonDown(1) 右クリック時
GetMouseButtonDown(0) 左クリック時
GetMouseButtonDown(2) 中クリック時
BallGene.cs
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 worldDir = ray.direction;

カメラからRayを打ち、画面をクリックしたところの位置と方向をrayに格納します。
ray.directionでカメラからタップした座標に向かうベクトルを規定します。

BallGene.cs
Ball.GetComponent<BallController>().Shoot(worldDir.normalized * 3000);

BallオブジェクトについてBallController.csShoot関数を呼び出します。
normalized変数でベクトルの正規化(長さが1のベクトルを生成)して、そこに3000の力を加えていきます。
ここの3000とかは、ご自身のゲームに合わせて数値を変えてみてください。

BallGene.cs
Destroy(Ball, 10.0f);

生成した弾を10秒後に消去します。

オブジェクトの代入

HierarchyのBallGeneratorオブジェクトを選択し、Inspectorでアタッチしたスクリプト内にあるBall PrefabにBallのPrefabをドラッグ&ドロップする

以上!

参考記事
ボールをタップした場所に飛ばす方法と座標系の違い【Unity】

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?