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

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

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

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

Q&A

0回答

1484閲覧

生成されたprefabをLineRendererの終点に指定する方法

tuna-uniko

総合スコア10

C#

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

0グッド

0クリップ

投稿2021/02/22 02:36

編集2021/02/25 07:43

長押し音符の生成をInstantiateで行う時LineRendererの設定も行ったノーツを生成しているのですが、public型で設定したGameObjectに終点を指定すると、始点はLineRendererを持つオブジェクトになるのに対し終点がその設定したオブジェクトの位置に固定されてしまいます。
=>セットしたオブジェクトの座標が(0,0)の時、始点にしたいオブジェクトの生成位置が(0,5.7f)の時でもLineの終点は(0,0)を参照しているため、これを(0,5.7f)に生成され下に移動していくオブジェクトの位置へ常に設定できるようにしたい

###できていること
・LineRendererで初めからシーンにある場合ならば長押し始点扱いのオブジェクトへ常に終点が追従するようにできています。
・始点オブジェクトが特定座標付近に来た時ボタンを押すことで、その座標を予め用意しておいた空のオブジェクトの座標へ固定する(判定される)仕組みはできています。押さなかった場合は画面外へ始点オブジェクトを移動し、長押しの帯が通過しているように見せる処理も組めています。

###実現したいこと・知りたいこと
LineRendererが入っているオブジェクトを始点、長押し開始の音符を終点として線を引く時、Lineの終点座標に生成された長押し開始のオブジェクトの座標を常に指定できるようにしたいです。
=>Instantiateで生成したprefabの現在位置をLineRendererの座標指定に使用したい
他のゲームを作る際にも役立つはずなので特に知りたいと思っています。

###試したこと
・Lineの始点終点を設定するスクリプトから音符を流すスクリプトで生成された始点オブジェクトを取得し、それの座標を参照する
エラー:NullReferenceException: Object reference not set to an instance of an object
=>Lineの始点終点を後ろに続く/!/のコードで設定できなくなりました

C#

1(LineRendererをもつオブジェクト側の設定 Update()内処理) 2longend2 = _tesno.mkl; 3//_tesnoにノーツ生成スクリプトの情報を取得させ、public型のmklに生成されたオブジェクトを入れる 4//GameObject型のlongend2にmklへ入れられた始点役オブジェクトの情報を追加する 5 6/*!*/var positions2=new Vector3[] 7 { 8 new Vector2(gameObject.transform.position.x,gameObject.transform.position.y), 9 new Vector2(longend2.transform.position.x, longend2.transform.position.y) 10 }; 11//longend2(始点扱いオブジェクト)の座標を毎フレーム取得

・逆にLineを設定しているスクリプトへ工場スクリプトから、始点扱いオブジェクトを生成した時にオブジェクト情報を移動させる
エラー:NullReferenceException: Object reference not set to an instance of an object
=>始点オブジェクトが無限生成されてしまう(始点オブジェクトの生成タイミングは曲開始からの時刻で始点生成スクリプトにて決められています)

C#

1(ノーツ生成側の処理) 2 _long.longend2 = mk; 3//LineRendererの終点にInstantiateで生成したオブジェクトを指定するため、GameObject型のmkを指定 4 5(LineRenderer側のUpdate関数内処理) 6var positions2=new Vector3[] 7 { 8 new Vector2(gameObject.transform.position.x,gameObject.transform.position.y), 9 new Vector2(longend2.transform.position.x, longend2.transform.position.y) 10 }; 11    //LineRendererをもつオブジェクトを線の始点とし、longend2を線の終点にする 12    //longend2に生成された始点役オブジェクトの座標を指定し、移動に合わせて線も移動する

使用環境はUnity2019.1.5.f1とVisual Studioになります。
・2021/02/23追記 エラーメッセージとエラーを起こしているコードの記載を行いました。
・2021/02/25追記 エラーメッセージについて、工場役スクリプトをもつオブジェクトを線生成スクリプトへpublic型GameObjectに設定し参照することで、両方同時に解決できました。しかしLineの終点位置をprefabの現在座標に設定し、常時始点と終点間にLineを生成する試みは上手く行っていません。
=>今回は始点生成位置がいつも5.7fだったため、そこから毎フレーム移動速度である0.11fを引き算した数値をLineの終点にすればよかっただけでした。

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

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

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

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

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

fiveHundred

2021/02/22 11:30

「Null Referenceエラー」とだけ書かれても、いつどこでなにが起こったか分かりません。 該当のコードとエラーメッセージを記載してください。 特にコードが無いと、一から作って検証するしかない場合もあり、回答者に大きな負担になります。
tuna-uniko

2021/02/23 01:38

fiveHundred様 ご指摘ありがとうございます。エラーを起こしている部分のコードを抜き出し、エラーメッセージ全体を追記しました。
退会済みユーザー

退会済みユーザー

2021/02/23 03:16

提示されたコードだけで判断できるとすれば、 (LineRendererをもつオブジェクト側の設定 Update()内処理) longend2 = _tesno.mkl; Nullの原因になっている部分はこの行っぽいですね。代入しようとしている元がNullである可能性が高い。 Nullは代入できるのでこの行自体がエラーになる事は無いです。 あと、上記がUpdate内の処理、参照を毎フレーム代入ってのは正直気持ち悪い処理かと思います。そんな事をする必要があるか?という意味で。
fiveHundred

2021/02/23 03:26

LBKさんの意見を考慮にすると、後者も「_long.longend2」に代入しており、肝心の「longend2」はnullのまま、という可能性が高いと思います。 あと質問と関係ないかもしれませんが、「new Vector2(gameObject.transform.position.x,gameObject.transform.position.y)」とありますが、今回の場合、暗黙のうちにVector3に変換されているので「gameObject.transform.position」や「transform.position」で済むと思うのですがどうでしょう。 (同じ理由で「new Vector2(longend2.transform.position.x, longend2.transform.position.y)」も「longend2.transform.position」に出来ます)
tuna-uniko

2021/02/24 01:37

LBK様,fiveHundred様 ありがとうございます。 毎フレーム代入・参照の処理をする必要があるかどうかについて、LineRenderer側がUpdate()で座標を取得しているため、同じくUpdate()でないと途中で参照が切れるかもしれないと考えたためでした。よく考えたところprefabが生成されたと同時にLineの設定を行うスクリプトのStart()が動くはずなので、prefabをStart()で代入さえできればlongend2に入れられたprefabの座標を参照し続けられると考えられ、非常に変な処理をしていたと気が付きました。 また暗黙のうちにVector3変換されているという点についても、書き換えても問題なく動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問