- タップしたところにオブジェクトを飛ばしたい!
というなやみを解決します。
この記事では2つのスクリプトを使って、タップしたところにオブジェクトを飛ばしていきます。一回タップしてオブジェクトを飛ばすのはもちろんのこと、複数回タップしてもオブジェクトを飛ばします。
今回は「Cube」を飛ばします。自分が飛ばしたいオブジェクトに変更できるようです。
1からオブジェクトを飛ばすスクリプトを作成しているので、1から作成していきたい人は順番通りに、その他の人は適宜利用してください。
タップしたところにオブジェクトを飛ばす
- オブジェクト(Cube)を制御するための「CubeController」スクリプト
- オブジェクト(Cube)を複数生成するための「CubeGenerator」スクリプト
2つにわける理由はのちのち編集しやすくするためです。①の方は、絶対わける必要ないと思われるぐらい少ない分量なのですが許してほしいです( ・∇・)
レイアウトは【2 by 3】です。見にくい方は【Unity】効率アップ!レイアウト(Layout)を変更してできる5個の開発画面で【2 by 3】に変更してください。
このプロジェクトがほしい
1から作るのが面倒な場合は、こちらにプロジェクトを上げているのでダウンロードしてみてください。
バージョンは2018.2.5です。多分エラーは起きないと思いますが、もし起きたらごめんなちゃい。
>>タップしたところにオブジェクトを飛ばすプロジェクトをダウンロード
オブジェクトの準備
Cubeを作成
【Hierarchy】→【Create】→【3DObject】→【Cube】
まず立方体を作成していきます。名前は変更しません。
Rigidbodyをつける
【Cube】→【Inspector】→【Add Component】→【Rigidbody】
CubeのPrefab(設計図)をつくる
【CubeをProjectウィンドウにドラッグ&ドロップする】→【Rename】→【CubePrefab】
Prefabからオブジェクトを作って、タップしたごとにオブジェクトを飛ばすのでこの作業を行います。
Hierarchy上から「CubePrefab」を削除
【Hierarchyウィンドウ】→【CubePrefabを右クリック】→【Delete】
Hierarchyウィンドウから【CubePrefab】を削除してください。
MainCameraのタグを変更
【Hierarchy】→【MainCamera】→【Inspector】→【Tag】→【MainCamera】
MainCameraのタグを変更します。
「CubeController」スクリプトを作成する
スクリプトを作成、アタッチ
【Projectウィンドウ】→【CubePrefabを選択】→【AddComponent】→【New Script】→【CubeController】
スクリプトの作成とアタッチを行っています。CubeControllerスクリプトをダブルクリックしてください。これからスクリプトを記述していきます。
スクリプトを記述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeController : MonoBehaviour {
public void Shoot(Vector3 dir)
{
GetComponent<Rigidbody>().AddForce(dir);
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
たったこれだけです。RigidbodyのAddForceを使って、オブジェクトを飛ばします。
「CubeGenerator」スクリプト
CubeGeneratorオブジェクトを作成
【Hierarchy】→【Create】→【Create Empty】→【CubeGenerator】
スクリプトを再生するために空のオブジェクトを作成していきます。
スクリプト作成、アタッチ
【Projectウィンドウ】→【CubeGeneratorを選択】→【AddComponent】→【New Script】→【CubeGenerator】
スクリプトの作成とアタッチを行っています。CubeGeneratorオブジェクトにCubeGeneratorスクリプトをアタッチというわかりづらい表現ですいません。
CubeGeneratorスクリプトをダブルクリックしてください。これからスクリプトを記述していきます。
スクリプトを記述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeGenerator : MonoBehaviour {
public GameObject CubePrefab;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
GameObject Cube =
Instantiate(CubePrefab) as GameObject;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 worldDir = ray.direction;
Cube.GetComponent<CubeController>().Shoot(
worldDir.normalized * 3000);
}
}
}
詳しい説明はまた今度
アウトレット接続する
【Hierarchy】→【CubeGeneratorオブジェクトを選択】→【CubeGeneratorオブジェクトをInspectorのCubePrefabにドラッグ&ドロップする】
これでタップ(PCだと左クリック)した瞬間にオブジェクトが発射されます
ゲーム実行して遊んでみてください。
ちなみにCubeGeneratorスクリプトをこのように変更すると
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeGenerator : MonoBehaviour {
public GameObject CubePrefab;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButton(0))
{
GameObject Cube =
Instantiate(CubePrefab) as GameObject;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 worldDir = ray.direction;
Cube.GetComponent<CubeController>().Shoot(
worldDir.normalized * 3000);
}
}
}
押し続けている間、立方体が発射されます。
ひゃっはー気持ち良き( ・∇・)#unity #unityd pic.twitter.com/AdZiRUuMeM
— さぎのみや (@saginomiya8) October 16, 2018
こんな感じです。
時間経過でオブジェクトを消す方法
気分よくオブジェクトを発射していると、生成されたオブジェクトがたまりにたまって重くなります。今回ではあまり感じないけどね( ・∇・)
そこで時間経過でオブジェクトを消す方法の記事も書きました。超簡単ですので、真似してみてね。
さいごに
なんかシューティングゲームとかで使えそうだね。
以上タップしたところにオブジェクトを飛ばす方法でした。
さぎのみや(@saginomiya8)でした。
コメント