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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1570閲覧

配列に変数を格納するときについて

susudada

総合スコア10

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/11/22 14:55

編集2015/11/22 15:07

超がつくほどにプログラミング初心者なのですが、訳があり「UnityとLeapmotionを用いて3D空間上に三次元線が描けるお絵描きツール」を製作しています。知識も拙いためどのように質問したら良いかもわかず、長く分かりにくい文章になってしまいましたが、何卒よろしくお願いいたします。
使用言語はJavascript(Unityscript)で、開発者用のUnity+Leapmotionのプロジェクトをいじって制作しています。

具体的には、スペースボタンを押している間だけLeapmotionが感知した手の指先(人差し指)から線が引け、離している間には何も書かれない。また押すと線が引けて....というものを作りたいです。

実際の仕組みとして
1.スペースを押している間、指先の座標を1/30秒ごとに取得し、それを配列(NowLine)にしてLineRendererで線にする。
2.スペースを離した瞬間、そのNowLineを丸ごと要素の一つとして親配列(OldLine)に追加する。LineRendererでNowLineとは別に描画する。その後NowLineをリセットする。
という方法をとっています。多次元配列です。

以下のscriptを指先のオブジェクトにアタッチして、線を描くための配列を生成しているのですが、どうも思うような動きをしません。
NowLineをどんどん格納していくにあたり、
OldLine = [(1回目押した時のNowLine) ,(2回目押した時のNowLine) ,(3回目押した時のNowLine)]
になってもらいたいのですが、
OldLine = [(3回目押した時のNowLine) ,(3回目押した時のNowLine) ,(3回目押した時のNowLine)]
のようになってしまいます。前に入れたNowLineも更新されてしまっているようです。

どのようにしたらこの問題を解決できますでしょうか。よろしくお願い致します。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#pragma strict

private var NowLine = new Array(); //要素数0のArray(NowLine)を定義。 private var OldLine = new Array(); //要素数0のArray(OldLine)を定義。

function Start () {
}

function Update () {

if (Input.GetKeyDown(KeyCode.Space)){ //スペースキーを押した瞬間に動く機能。 NowLine.length = 0; //NowLineを初期化。(文章では最後にリセットとしていたが、ここにある方がわかりやすいためここに配置。) }

if (Input.GetKey(KeyCode.Space)) {
//スペースキーを押している間だけ動く機能。
//主に、指先の座標を取得して配列にし、描画する。

var NowPoint = transform.position; //指先のポジションをNowPointとして取得。 NowLine.Push(NowPoint); //NowLineに格納していく。function Update ()は1/30秒ごとに更新されるため、この文だけでどんどん追加されていく。 Debug.Log('NowLine'); Debug.Log(NowLine); //配列内の要素をConsoleに表示。 } if (Input.GetKeyUp(KeyCode.Space)) { //スペースキーを離した瞬間動く機能。 //NowLineの格納された配列をOldLineの要素として格納する。 OldLine.Push(NowLine); Debug.Log('OldLine'); Debug.Log(OldLine); //配列内の要素をConsoleに表示。 }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Unityscriptを触ったことがないので推測で書きます。

OldLine.Push(NowLine)で値を格納しておられますが、JavaScirptでは配列は参照渡しのため格納した値はすべて同じ内容を指します。
ですので、配列の値を格納するときは、その配列の複製を作って格納する必要があるかと思います。

javascript

1// 複製を作る(Unityscriptを触ったことがないのでこれで動くかわかりませんが...) 2var clone = NowLine.Concat(new Array ()); 3 4// 複製を格納() 5OldLine.Push(clone);

参照渡しについては「javascript 参照渡し 値渡し」で検索してみてください

投稿2015/11/22 16:41

takamujp

総合スコア66

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

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

susudada

2015/11/22 16:51

試しにこのままスクリプトに入れてみた所、(少し他のエラー?が表示されるものの)思い通りに動きました。。。このような長い文を読み、かつ的確なアドバイス、本当にありがとうございました。参照渡しについても調べてみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問