質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

988閲覧

短時間で複数回Instantiateする際, 外部スクリプトから速度を与えたいが...

Sado

総合スコア89

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/11/19 22:50

前提

Unity2Dにて弾丸を連射するスクリプトを作っているのですが、**弾丸ゲームオブジェクト(&Script)銃コンポーネント(Script)**の2つの要素で構成するように考えていました。

  • 弾丸には直進又は追尾する等といった"発射後"の処理を。
  • 銃には初速・連射速度・装弾数などの情報と"発射"の処理を。

それぞれ実装していこうとしています。
しかし、ここで銃に初速の情報を持たせることに難儀しています。

問題点

銃コンポーネントに初速を持たせる、つまりInstantiate時にRigidBody2DのVelocityに代入する処理が必要だと思うのですが、この場合は弾を生成する度にRigidBody2DをGetCompornent()しなければなりません。

例▼

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BulletsShooter : MonoBehaviour { 6 7 [SerializeField] private GameObject bullet; 8 [SerializeField] private AudioClip se_fire; 9 [SerializeField] private int capacity; //装弾数 10 [SerializeField] private float rateOfFire; //連射速度(数/分) 11 //[SerializeField] private float muzzleVelocity; //初速(px/sec) ★★★ 12 private float rateOfFirePerSec; 13 14 private void Start() 15 { 16 rateOfFirePerSec = 60f / rateOfFire; 17 } 18 19 public IEnumerator Fire(Transform _transform) 20 { 21 GameObject blt = Instantiate(bullet, _transform.position,_transform.rotation); 22 // blt.GetCompornent<RigidBody2D>.velocity = ... ;★★★ 重そう ★★★ 23 AudioSource.PlayClipAtPoint(se_fire, _transform.position); 24 yield return new WaitForSeconds(rateOfFirePerSec); 25 } 26 27}

これを避けるために現状としては、弾丸ゲームオブジェクトの方に"初速"を持たせ、プレハブで必要個数複製させようと考えていました。
★★★ 重そう ★★★な処理を回避しつつ、銃コンポーネントに"初速"を持たせるには、どのような方法がありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

GetCompornent無くてもいけますよー。
bltがGameObjectである必要性が無いなら、直接Rigidbody2Dを生成すればいいです。
(これでもちゃんとGameObjectが出来ます)

[SerializeField] private Rigidbody2D bullet;
Rigidbody2D blt = Instantiate(bullet, _transform.position,_transform.rotation);
blt.velocity = ...;


もしくは、弾丸側のスクリプトに初速を渡すという手も。
(弾の挙動は全て弾丸側スクリプトで制御する、という役割分担が分かりやすくなる。あと「銃の初速+弾の初速」みたいにしたい時に楽かも)

BulletsShooter側
[SerializeField] private Bullet bullet;
Bullet blt = Instantiate(bullet, _transform.position,_transform.rotation);
blt.Shoot(初速);

Bullet(弾丸側スクリプト)
public Shoot (float startSpeed) { //初速の処理 }

投稿2018/11/20 02:01

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sado

2018/11/20 03:21

なるほど、自分にアタッチされたコンポーネントもインスペクターで参照を持ってこれるのですね。たしかにそうすれば、弾丸がGetCompornentを省略してVelocityを弄れますね! Rigidbody2Dを生成する方法はちょっとびっくりです。
guest

0

スクリプトから値を与える以上はGetCompornentが必須ですよね...頭わるわるでした。
Rigidbody2DのVelocityに初期値を与えるようなものは、スクリプト以外に方法が見当たらないですし。
参考:プレイヤーから弾を撃つ - 2Dシューティング - Unity

GetCompornent<RigidBody2D>を使う場所をどこにするかの問題な気がします。
今回は、この部分でこれ以上GetCompornentをしないで設計するよう心がける程度にします。

投稿2018/11/20 01:53

Sado

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問