X



【3Dゲームエンジン】Unity質問スレッド33
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
垢版 |
2017/12/19(火) 09:35:55.55ID:VZwsAqll
フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。
プラットフォームサポートはiPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3、PlayStation 4、PS Vita他

次スレは>>950以降にできるだけ早く(できれば回答者が回答した後にでも余裕を持って)建てて下さい。

■Unity 2ch Wiki(まとめ、過去ログ、リンク集)
http://www24.atwiki.jp/unity2ch/

●リンク
・Unity(日本公式サイト)
http://unity3d.com/jp
・マニュアル
 http://docs.unity3d.com/ja/current/Manual/index.html
・チュートリアル
 http://unity3d.com/jp/learn/tutorials
・スクリプトリファレンス
 http://docs.unity3d.com/ja/current/ScriptReference/index.html
・FAQ
 http://unity3d.com/jp/unity/faq
・MSDN
 http://msdn.microsoft.com/ja-jp/ms348103←スクリプトのエラー番号をこれで検索すると原因が日本語で出てきます。

前スレ
【3Dゲームエンジン】Unity質問スレッド32
http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/
0115名前は開発中のものです。
垢版 |
2017/12/26(火) 19:19:33.08ID:yq5adPSI
公式どころか個人がやってる初心者講座サイトの1つでもやってれば普通に分かっていておかしくない内容だよな。
どんだけ何もやってない怠けものだよコイツって感じ
0116名無し@キムチ
垢版 |
2017/12/26(火) 19:58:50.02ID:5fo0vrRf
ごく初歩的な質問ですが、何もさわってないのに、たまにシーン内でのオブジェクトの位置が変わっていることがあるのですが、それは何故でしょうか?
同じく何もしないのに、コンポーネントが外れていたり、インスペクターの値が変わっていることもあります。
これは非常に困るので、位置や値が自分で変えるまでは絶対に変わらない対処法をご教示おねがいいたします!!!
0117名無し@キムチ
垢版 |
2017/12/26(火) 20:03:01.61ID:5fo0vrRf
なお>>113は当方ではないですよ。当方、無意味なコテ外しはしませんw
0118名前は開発中のものです。
垢版 |
2017/12/26(火) 20:26:13.27ID:O9PscLer
シーン遷移時に引き継ぎたい変数をどの手段から選べばいいか迷ってるんですけど、

1 static変数として持つ
2 ScriptableObjectを作ってそこに一時保管しておく
3 dontdestroyで変数の入ったスクリプトがアタッチされているオブジェクトを壊さず持っていく
4 外部のdb等に一時保管しておく

辺りで迷ってるのですが、ケースバイケースだとは思うのですがどれがいいのかアドバイスお願いします。
1 なるべくstatic使わない方が初心者には良い とたまに聞きます。
  似た名前のローカル変数を複数使っているので混乱する可能性もあるかなと

2 基本的に変動しない小さいマスターデータをdb代わりに使う事が多い と見ました
  こういった使い方には適さないのかもと迷いました

3 普通のゲームと同じくいくつかのシーンをループして進めていくのでオブジェクトが被らないようにシングルトンにする手間や
  処理は一切入れず変数入れとしてこの処理をするならScriotbleObjectでいいのかな?と思ったり

4 形式にもよるのでしょうが一時的な変数をイチイチ外部に書き出すのはどうなのかと
0120名前は開発中のものです。
垢版 |
2017/12/26(火) 21:27:04.89ID:ef3cEapS
>>111

ボタンは引数なしで呼び出すだけだから簡単だけど、
スライダーは引数をどうやって受け取るかがわからなかったのでした

少なくとも公式のオンラインマニュアルからは探せず・・・
UIのインスペクターのリストをよーく見たら、
引数ありのメソッドと同名の、引く数なしのメソッドが上の方に見つかって解決したけど

>>99

やっぱり、リスト最上段のDynamic floatの直下にあるところをみると、
コレ(@)がUnity側で用意した機能なんでしょうね・・・
0121名前は開発中のものです。
垢版 |
2017/12/26(火) 21:32:11.65ID:ycBgqB9O
>>118
何が消えてOKで、何が消えたら不味いのか、切り分けが分からない
例えば、セーブ/ロード付けるなら、シーン移動時にセーブとロード
するから結局同じ事じゃないの?
0122名前は開発中のものです。
垢版 |
2017/12/26(火) 21:36:26.13ID:ef3cEapS
>>118

個人的には「3」を使ってます!

最初のLoad用のシーン0でフラグ管理用のオブジェクトを「DontDestroy」設定して、
その後はシーン1へ遷移して、以降はシーン0へは戻りません
(戻ると、「DontDestroy」設定を繰り返してしまうので・・・)

フラグ管理用のオブジェクトに載せたスクリプト内では、Start()内で、
ゲームを通してシーン間で共有する変数を全て「public」で宣言して初期値設定しています

そして、他のシーンの他のオブジェクトから、適宜呼び出して参照や代入して共有してますね
0123名前は開発中のものです。
垢版 |
2017/12/26(火) 21:40:47.37ID:ef3cEapS
>>121の言うように、
セーブありのRPGみたいな感じであれば、シーン変更前にセーブして、
シーン変更後にロードでも良い気がしますね

ゲーム終了後も保持したいなら、やはり外部保存だと思います

自分のは基本パスワード式のACTなので、
セーブシステムがないので、ゲーム内でのみ保持しています

パスワードの入力によって、フラグの初期値を変更して、
その後にゲーム開始となるようにしていますね
(まっすぐゲームスタートした場合は、全フラグを初期値で開始)
0124名前は開発中のものです。
垢版 |
2017/12/26(火) 23:19:01.53ID:V8TVTato
>>118
言うまでもないが可能不可能で言えばどれでも出来る
と言うか、シーンロードでDestroyされないヒエラルキーに依存しないものならなんでも保持は可能

適不適で言うなら
1.staticである必要性はない。staticにすることによる弊害の方が多いため不適
2.ScriptableObjectは実行時はReadOnlyなデータのバリエーションを扱うもの。使い方が間違っているため当然不適
3.揮発性の情報ならこれが最適※
4.不揮発性の情報ならこれこれが最適※

※揮発性情報は意図せずプロセスが死亡した場合に消えても良いもの、不揮発性情報はプロセスが死亡しても残るべきものとする
0125名前は開発中のものです。
垢版 |
2017/12/26(火) 23:39:55.98ID:ef3cEapS
staticにする必要性ってどこにあるんだろう??

FCやSFCで言うところの、RAMじゃなくてROM的な機能か?
0130名前は開発中のものです。
垢版 |
2017/12/27(水) 01:16:54.26ID:2+M/n1Lm
ROM的な機能は、ScriptableObjectの方だったか

全オブジェクトからアクセスできる関数(メソッド)作成はStaticが良いかもしれない

どのスクリプトからでも
@RGB→HSL変換できるメソッド:RGBto.HSL(R, G, B, out H, out S, out L)
ARGB→HSV変換できるメソッド:RGBto.HSV(R, G, B, out H, out S, out V)
を作ってみた
0131名前は開発中のものです。
垢版 |
2017/12/27(水) 01:19:10.80ID:2+M/n1Lm
public static class RGBto {
 public static void HSL(int R, int G, int B, out int H, out int S, out int L){
  int Max = Mathf.Max (R, G, B);
  int Min = Mathf.Min (R, G, B);
 if (Max == Min) {
  H = 360;
 } else if (G == Max) {
  H = 60 * (B - R) / (Max - Min) + 120;
 } else if (B == Max) {
  H = 60 * (R - G) / (Max - Min) + 240;
 } else {
  H = 60 * (G - B) / (Max - Min);
  if (H < 0) H = H + 360;
 }
 if (Max == 0 || Min == 255){
  S = 0;
 } else {
  S = 255 * (Max - Min) / (255 - Mathf.Abs(Max + Min - 255));
 }
  L = (Max + Min)/2;
 }
0132名前は開発中のものです。
垢版 |
2017/12/27(水) 01:19:30.81ID:2+M/n1Lm
 public static void HSV(int R, int G, int B, out int H, out int S, out int V){
  int Max = Mathf.Max (R, G, B);
  int Min = Mathf.Min (R, G, B);
 if (Max == Min) {
  H = 360;
 } else if (G == Max) {
  H = 60 * (B - R) / (Max - Min) + 120;
 } else if (B == Max) {
  H = 60 * (R - G) / (Max - Min) + 240;
 } else {
  H = 60 * (G - B) / (Max - Min);
  if (H < 0) H = H + 360;
 }
 if (Max == 0){
  S = 0;
 } else {
  S = 255 * (Max - Min) / Max;
 }
  V = Max;
 }
}

Hを求めるところはもっとまとめられるかも・・・
Hのみ0〜360(360で色相未定義)
RGB,SLVは0〜255
0134名前は開発中のものです。
垢版 |
2017/12/27(水) 03:01:38.22ID:4kYoBCMG
また質問なんですけど、
シーン遷移した後って前シーンからdontdestroyで持ってきたオブジェのスクリプト内で
getcomponentってできないですか?
gameobject.findで指定したオブジェクトを見つけるまでは大丈夫なのですが
ゲットコンポーネントするとNullReferenceExceptionが帰ってきます
同じシーン内に作ったなんらかからならちゃんと動くのですが
0135名前は開発中のものです。
垢版 |
2017/12/27(水) 03:07:33.07ID:4kYoBCMG
もしかするとfindも失敗してるのかもしれませんが、
sceneをパスに指定するようなことが必要になるのでしょうか?
dontrestroyしたオブジェクトはdontdestroyの子みたいな表示になりますし
共通シーン内でしか受け渡しできないとかなのでしょうか?
0136名前は開発中のものです。
垢版 |
2017/12/27(水) 12:43:41.61ID:YC5nHwtt
全部自作した奴が偉い君は
ガワだけ張り替えて大当たりするようなソシャゲが
天下取ってる現状に発狂してそう
0137名前は開発中のものです。
垢版 |
2017/12/27(水) 12:54:38.15ID:WZqeNEin
>>103

UnityのUIのボタンのフォーカスとフォーカス対象の設定
https://gametukurikata.com/program/uifocus
>あらかじめボタン1つがフォーカスされていないと他のボタンの選択が出来ません
>EventSystemに最初に選択するボタンの設定は出来ます


>>89 >>91

[UI] スライダーで変更した値を取得できない現象に対処した [Unity]
http://negilab-unity.com/archives/14367667.html
>スライダーの変更値を float として取得するのではなく、Slider.value 変数として取得するように書き換えたところ、問題なく取得できました
>スライダーのインスペクタで、引数にスライダーのオブジェクトを指定

uGUIのSliderの値をスクリプト側で受け取る方法
http://unitymemo.blog.jp/archives/30226350.html
>SliderをGetComponentしてvalueを参照することでスライド値を参照できます
>OnValueChangedに定義したメソッドでスライド値を受け取る方法
>メソッドを選択する際、一番上のほうの「redSlider」を選択する事
>下のほうにも「redSlider(float)」がありますが、こちらを選んでも正しく値を渡すことは出来ません
0139名前は開発中のものです。
垢版 |
2017/12/27(水) 14:56:11.54ID:+i3zpKSn
見ての通り、質問せずに最初から自分でググってれば数分で解決している問題が多いな。
自分でググらないといけない事を人にググってもらってるだけなんだから。
0142名前は開発中のものです。
垢版 |
2017/12/27(水) 18:41:34.06ID:WZqeNEin
>>134
何をGetcomponentしたいの?
Sceneを指定したりはしないはず

ObjectはFindされているんでしょ?
obj内にObjectが入っている状態で、スクリプトをGetcomponentしたいなら、
スクリプト名 s = obj.GetComponent<スクリプト名>();

そのスクリプト内の変数をゲットしたいなら
s.変数名

変数は引用元のスクリプトの最初にpublicで宣言しておいて
0143名前は開発中のものです。
垢版 |
2017/12/27(水) 18:54:27.94ID:fBJY1RTE
やってみたがFindもGetComponentも普通に出来るよな

検索範囲は明示がないけどHierarchyウインドに表示されてる物は
全捜索するようで、シーンが分かれていようが全く関係がない
(Updateで使うなってのは、毎回Hierarchy全捜索されたら洒落にならん)
0144名前は開発中のものです。
垢版 |
2017/12/27(水) 18:56:13.87ID:WZqeNEin
>>134
dontrestroyしたObjectに付いているスクリプト内で、
別のシーンにある他のObjectのコンポーネントを取得してみたけど、普通に受け取れたよ?

Scene0で、共有Objectをdontrestroyして、Scene1へ遷移
Scene1で、共有Objectのスクリプトから、
Scene1の別のObjectのtransfomを取得したら、普通に見れた

FindだとHierarchyにない別のSceneのObjectは検索できないはず
Objectを検索できたのに、GetComponentできないなら、
そのObjectには取得しようとしているコンポーネントがないか、
他のObjectから取得できないように保護されている(変数ならprivate宣言)かでは?
0145名前は開発中のものです。
垢版 |
2017/12/27(水) 19:04:57.79ID:WZqeNEin
>>134
Debug.Logで、FindしたGameObjectの中身を表示、
GetComponentした中身を表示してみることを勧めるよ

dontrestroyしたObjectに付いているスクリプトでも、
それ以外のもともとそのSceneにあったObjectに付いているスクリプトでも

まさか、dontrestroyしたObjectを出すためのSecneを省いて
テストプレイしているなんてことはないよね?

自分の例で言えば、Scene0からじゃなくて、Scene1からテストしているとか

テストプレイ中、HierarchyにdontrestroyしたObjectは出ているんだよね?
毎フレームdontrestroyしまくったりしていないよね??
0150名前は開発中のものです。
垢版 |
2017/12/27(水) 19:58:36.60ID:TaFXzcmh
英語だとカンバスが近いらしい。HowTo動画とか見てるとカンバスカンバス言われるからカンバス読みになるんじゃないの。
キャンバスは美術用語で、学校で習うのはキャンバス読みだと思う。
0151名無し@キムチ
垢版 |
2017/12/27(水) 20:09:12.86ID:oeXBuupd
>>150
発音のことなのか・
英語でもキャンバスが近いよw
0152名前は開発中のものです。
垢版 |
2017/12/27(水) 20:12:19.02ID:9tGAk59e
別にどっちでも良いしどっちでも伝わるけど喋るときはどっちが多いのかなぁっていう素朴な疑問
ネイティブの発音はどうでも良い、カタカナ表記することが云々って話になるし
0153名前は開発中のものです。
垢版 |
2017/12/27(水) 20:15:02.72ID:Ojr+yz4V
>>136
できる/努力する奴ひっぱり下ろすのはゲスすぎないか
俺もわかんないまま借りてるけどどっか後ろめたいよ
0154名前は開発中のものです。
垢版 |
2017/12/27(水) 20:26:06.89ID:4kYoBCMG
>>142-145

レス遅くなりました。mm

dontrestroyしたオブジェクトにアタッチされたスクリプトから
遷移後のオブジェクトがfind出来てるか確認したところ、出来ていませんでした。
上で出来ていると勘違いしたのはfindの時点でエラーが帰ってこなかったからという単純な理由でした。

遷移後のシーン内に作ったオブジェクトのスクリプトから同じコードをコピペしてみましたが
こちらは普通にfind出来ていました
public gameobjectとしてインスペクター上で両方確認しました。

うーん。
0155名前は開発中のものです。
垢版 |
2017/12/27(水) 20:36:04.46ID:JxfZYfQR
香港人
「高卒だらけの日本人英語は、無いところにYの発音が入っちゃいます。土人丸出しです。」
0156名前は開発中のものです。
垢版 |
2017/12/27(水) 20:40:05.60ID:4kYoBCMG
今試したのですが、

objA dontdestroyしたオブジェクト
|   これにアタッチされているスクリプト内でボタン押されたら遷移する処理
|   その遷移処理の後に同スクリプト内の別メソッド@を呼び出して遷移後のobjBをFind →失敗

シーン遷移
   objB
   遷移後のシーンに配置されているボタンから、objAのメソッド@を呼び出す → 成功
                                                     objAのヒエラルキーでobjBが格納されている

だったんですけど、これどういうことなんだろう…
0157名前は開発中のものです。
垢版 |
2017/12/27(水) 20:43:19.36ID:4kYoBCMG
>>156だとなんか時系列変に見えますね;

objA dontdestroyしたオブジェクト
|           これにアタッチされているスクリプト内でボタン押されたら遷移する処理
|           

シーン遷移
   objB
            その遷移処理の後に同スクリプト内の別メソッド@を呼び出して遷移後のobjBをFind →失敗

                                        ↑             ↓
   遷移後のシーンに配置されているボタンから、objAのメソッド@を呼び出す     成功
                                                     objAのヒエラルキーでobjBが格納されている

みたいな感じです
こっちのが見づらいかもしれませんが…
0160名前は開発中のものです。
垢版 |
2017/12/27(水) 20:48:37.38ID:4kYoBCMG
シーン1
 objA dontdestroyしたオブジェクト
 |           これにアタッチされているスクリプト内でボタン押されたら遷移する処理
 |           
 ↓
シーン2へ遷移
   objB
            その遷移処理の後に同スクリプト内の別メソッド@を呼び出して遷移後のobjBをFind →失敗

                                        ↑             ↓
   遷移後のシーンに配置されているボタンから、objAのメソッド@を呼び出す     成功
                                                     objAのヒエラルキーでobjBが格納されている

これで質問に答えられてますかね?
0163名前は開発中のものです。
垢版 |
2017/12/27(水) 21:22:17.48ID:fBJY1RTE
てか、何で相互に見れるようにする必要があるの?
無駄が多すぎるだろ

DontDestroyOnLoadしたGameObjectを一方的に参照する
データ保管庫みたいに切り分けて使えばいいだけじゃない
0164名前は開発中のものです。
垢版 |
2017/12/27(水) 21:23:12.19ID:4kYoBCMG
うーん…なんでだろう

またもう一つ試したのですが、

シーン1で objA に加えて objCを作り、
objCにスクリプトをアタッチし、これもdontdestroyして中に変数を一つ入れておきました

シーン1
 objA dontdestroyしたオブジェクト
 |           これにアタッチされているスクリプト内でボタン押されたら遷移する処理
 |           
 ↓
シーン2へ遷移
   objB
            その遷移処理の後に同スクリプト内の別メソッド@を呼び出して遷移後のobjBをFind →失敗
         ※ ここで今回作ったobjCから参照してみる → 成功

                                              ↑        ↓
   遷移後のシーンに配置されているボタンから、objAのメソッド@を呼び出す     成功
                                                     objAのヒエラルキーでobjBが格納されている

と、見づらいかもしれませんが同じシーンから持ってきたオブジェクトに対しては普通にfindもゲットコンポーネントもできました
あああああああああわかんね!!!!!!!!!!!!!
0165名前は開発中のものです。
垢版 |
2017/12/27(水) 21:26:43.61ID:4kYoBCMG
>>163
遷移後にそのまま冒頭のイベント処理みたいなことをやりたくて
ならそのまま遷移処理の後に引き続きそのメソッド内である程度指示だして引継ぎすればよくね?
でやってみたら遷移後のシーンのオブジェクト参照ができなかったということから質問をしました
0167名前は開発中のものです。
垢版 |
2017/12/27(水) 21:39:00.89ID:4kYoBCMG
上でも書いてるのですけど本来の目的はそれですが
試してみたところエラーが出たので質問をした ということです
0168名前は開発中のものです。
垢版 |
2017/12/27(水) 21:48:41.42ID:fBJY1RTE
objAを外から読み書きできるようにしたんだよね?
なんでobjAからobjBを見る必要があるのか分からない(出来るけど)
0169名前は開発中のものです。
垢版 |
2017/12/27(水) 22:33:19.52ID:UZCkhUUp
>>165
シーン遷移時は、前のシーンのオブジェクトを破棄して新たなシーンのオブジェクトを構築する処理が走る
この処理が終わらないと新しいシーンのオブジェクトはFindでは見つからない

よって、新たなシーンのオブジェクトを見つけたければSceneManager.sceneLoadedデリゲートを使ってシーンのロードが完了してから処理を行う必要がある

ちなみにSceneManager.sceneLoadedはロードされたシーンのオブジェクトのAwakeが完了し、Startが呼ばれる前に呼ばれる事に注意
またこのデリゲートはどのシーンがロードされても呼ばれるから処理内でシーン毎に振り分けるかハンドラをつけ外しするなどの対処が必要
0170名無し@キムチ
垢版 |
2017/12/27(水) 22:59:24.99ID:oeXBuupd
>>164
遷移後のobjBをFind →失敗
当方の経験ではFindは、そのオブジェクトにアタッチされているスクリプトからでないと、失敗したり成功したりその時々によってさまざまだな。
0172名前は開発中のものです。
垢版 |
2017/12/27(水) 23:29:25.63ID:9tGAk59e
プログラムが成功したり失敗したりなんて挙動するわけない
成功するのも失敗するのも理由がある
理由を理解できていないのにプログラムのせいにするプログラマー
0173名前は開発中のものです。
垢版 |
2017/12/27(水) 23:56:23.72ID:2+M/n1Lm
>遷移後のシーンに配置されているボタンから、objAのメソッド@を呼び出す 

本当に呼び出せている?
Find以前の問題だったりして・・・
0174名前は開発中のものです。
垢版 |
2017/12/28(木) 00:13:29.64ID:mH5YII84
ボタンからの入力を受けていないだけとかはないですか?
UIから、その該当スクリプトへのコールがかかっていないとか?

入力をInputにして、
if?(Input.GetKeyDown?(KeyCode.Space))?{
 Debug.Log("Input OK");
 GameObject A = GameObject.Find("objA");
 Debug.Log(A);
}
を追加して、
スクリプトが機能しているかどうか、
オブジェクトを取得できているかどうかを確認してみてください
0175名前は開発中のものです。
垢版 |
2017/12/28(木) 00:18:44.79ID:mH5YII84
すみません、objAからobjBの方を見たいんですね

objAのスクリプトのUpdate()内に、
if (Input.GetKeyDown (KeyCode.Space)) {
 Debug.Log("Input OK");
 GameObject B = GameObject.Find("objB");
 Debug.Log(B);
}
を追加して、
スクリプトAが機能しているかどうか、
オブジェクトBを取得できているかどうかを確認してみてください

ボタンからの呼び出しが届いていないだけであれば、
上記でオブジェクトを取得できるはずですが・・・

シーン2では、
objA:DontDestroyによって、シーン1から持ち越し
objB
・・・が、Hierarchy上に同時に並んでいるわけですものね?
0176名前は開発中のものです。
垢版 |
2017/12/28(木) 00:34:38.37ID:mH5YII84
各オブジェクトのそれぞれのスクリプトで行っていることが良く分からないのですが、

Scene1
 objA-A.cs:DontDestory
  ボタン→LoadScene("Scene1")
 objC-C.cs:DontDestory

Scene2
 objA-A.cs:DontDestory(Scene1から)
  メソッド@→A = Find("objB") →NG
 objC-C.cs:DontDestory(Scene1から)
  Aのメソッド@→A = Find("objB") →OK
 objB-B.cs
  ボタン→Aのメソッド@→A = Find("objB") →OK

こういうことなのでしょうか??

A = Find("objB")は、
GameObject A = GameObject.Find("objB");のことです

メソッド@を呼ぶタイミングはどうやって遷移後に指定しているのでしょうか?
まさか、LoadScene("Scene1")と同じフレーム内で呼んでいないですよね??
0177名前は開発中のものです。
垢版 |
2017/12/28(木) 00:51:12.79ID:fQL7hUYb
>>169
レス遅れてすみません。
ありがとうございます。
とても参考になり、わかりやすかったです。

結果として、やったことは
SceneManager.LoadSceneの直後にSceneManager.sceneLoadedを行って
そのデリゲート処理完了後にそれぞれのテストメソッドを呼び出して参照したりしたところ
問題なく参照できました。
>>161にはレスしませんでしたが、当たりだった感じです。

>>170
なるほど。。。他の方々のレスを見る感じ、テスト環境でやっていたのかもしれないので
もしかするとオブジェクト等の量とかでかわるんですかね?

>>173
そこは上のレスを書いた時点で確認できていました
debug.log等での確認なので精度はわかりませんが
0178名前は開発中のものです。
垢版 |
2017/12/28(木) 00:56:34.32ID:fQL7hUYb
>>174-176

Scene1
 objA-A.cs:DontDestory
  ボタン→ *A.cs内の LoadScene("Scene1") 呼び出し
 objC-C.cs:DontDestory * +変数1

Scene2
 objA-A.cs:DontDestory(Scene1から)
  メソッド@→A = Find("objB") →NG
 objC-C.cs:DontDestory(Scene1から)
  Aのメソッド@→A = Find("objB") →OK *   Aのメソッド@→A = Find("objC") →OK です
 objB-B.cs
  ボタン→Aのメソッド@→A = Find("objB") →OK


A.Csの中の処理流れは

{
LoadScene2;
gameobject.find(Scene2のobjB)
}

でBが見つからない ということでした

>メソッド@を呼ぶタイミングはどうやって遷移後に指定しているのでしょうか?
まさか、LoadScene("Scene1")と同じフレーム内で呼んでいないですよね??

恐らくそういうことだったんだと思います
0180名前は開発中のものです。
垢版 |
2017/12/28(木) 01:43:55.44ID:mH5YII84
以前、物理演算で、どういう処理だったか忘れたけど、
変数を物理演算に設定した直後に、
同じフレーム内でデバッグログに物理演算結果を出力しようとしたら、
変数が設定された結果が出せなくて、
Invokeで1フレーム後にデバッグログを呼び出したら、出力できたことがあるので、

一度フレームを走らせないといけないポイントで処理を連続してしまうのは、
結構ピットホールになりやすいかもしれない
0181名前は開発中のものです。
垢版 |
2017/12/28(木) 02:14:32.76ID:mH5YII84
velocityの変更、positionの変更は、同じフレーム内で取得しても変更が反映されるけど、
例えばAddForceでは、たとえ1フレームで加速するForceMode.Impulseでも、
同じフレーム内ではまだvelocityは速度変更されておらず、
次のフレームでvelocityの変更が反映されるみたい

でも、1フレームで移動を行うMovePositionは、
同じフレーム内でpositionの変更が反映されているという・・・
0182名前は開発中のものです。
垢版 |
2017/12/28(木) 02:20:34.36ID:aEDu9yFW
全然関係ねえよ
オブジェクトの生成と破壊は1フレーム掛かるから後処理は1フレーム待てと言われただろ
シーンの呼び出しも同じって>169に言われてんだろ
0183名前は開発中のものです。
垢版 |
2017/12/28(木) 02:49:46.90ID:mH5YII84
Invokeに1フレームかかるのか、1フレーム内で行う処理の量の問題なのか、
PCの性能の違いなのか、Unityのバージョンの違いなのかは不明だけど、

Rigidbody rb;
void Start() {
 rb = GetComponent<Rigidbody>();
 rb.angularVelocity = new Vector3(0, 0, 180 * Mathf.Deg2Rad);
 Invoke ("Log", 1);
 //Invoke("Log", 1 - Time.fixedDeltaTime);
}
void Log() {
 rb.angularVelocity = Vector3.zero;
 Debug.Log (rb.rotation);
 Debug.Log(rb.rotation.eulerAngles.z);
}

本来、Z軸回転に180度/秒を入れて1秒間回転させて止めているわけだから、
Z軸の回転角は180が返るはずだけど、183.6という結果になってしまいます

Invoke("A", 1 - Time.fixedDeltaTime)で1フレームは早く呼ぶと、180が返るから、
おそらくInvokeで呼ぶ場合は、1フレーム遅れるんでしょうね・・・
0185名前は開発中のものです。
垢版 |
2017/12/28(木) 03:22:50.01ID:mH5YII84
ごめんなさい、原因が分かったよ

Start()から、Log()を呼んでいるからでした・・・
Start()が終了するのに1フレームかかるみたいですね

Rigidbody rb;
void Start() {
 rb = GetComponent<Rigidbody>();
 Start2()
}
void Start2() {
 rb.angularVelocity = new Vector3(0, 0, 180 * Mathf.Deg2Rad);
 Invoke ("Log", 1);
}
void Log() {
 rb.angularVelocity = Vector3.zero;
 Debug.Log (rb.rotation);
 Debug.Log(rb.rotation.eulerAngles.z);
}

StartからStart2を呼んで、Start2でangularVelocityを設定すれば、
Start2()からLog()を呼ぶ場合は、1秒指定のInvokeで、ぴったり180でした
0187名前は開発中のものです。
垢版 |
2017/12/28(木) 04:43:29.76ID:NrJHfHro
>>185
何の確認もせずに適当な思い込みで妄想しても
的外れなだけじゃないキムチ君w
毎回そんなアホな事をやってるから迷走すんだよ

だったらStartとStart2に
Debug.Log(Time.frameCount);
で実実行時のフレームカウント出してみなよ
両方とも1って出るから
0189名前は開発中のものです。
垢版 |
2017/12/28(木) 09:26:13.89ID:fukyqugk
初心者です
マテリアル作って保存したらファイル名が勝手に.matから.MATに変わってそのせいで警告が出てる??みたい
パソコンのせいなんでしょうか
解決方法分かりませんか?
0191名前は開発中のものです。
垢版 |
2017/12/28(木) 09:53:48.72ID:fukyqugk
警告で
The GUID for assets/アセット名.mat is already in ues by assets/アセット名.MAT.
Assigning a new guid.

エラーで
Refresh case sensitivity failure.
Assets:Assets/アセット名.mat ; Metafile:Assets/アセット名.mat.meta
です
0194名前は開発中のものです。
垢版 |
2017/12/28(木) 10:45:38.68ID:fukyqugk
>>192
いえ、普通にUnityエディタ内でmaterialを作成してます
で真っ白なまま保存しても.matで保存されるんですが少しでも色を変えると保存した時に拡張子が.MATに変わってしまうんです
0195名前は開発中のものです。
垢版 |
2017/12/28(木) 11:13:08.50ID:ghF3Rjv1
>>194
ファイル消したりしてるでしょ
元ファイル消したのにmetaファイル消してないから名前が使えない
だから別の名前使うね、ってなってる
生成も削除も移動も全てuntiy上で行ってください
0196名前は開発中のものです。
垢版 |
2017/12/28(木) 11:16:47.13ID:ghF3Rjv1
てか警告分の内容は理解してる?
中学英語の単語しか無いぞ
英語だからって毛嫌いせず読もうとしてみるの大事
だんだん慣れてくるから
0197名前は開発中のものです。
垢版 |
2017/12/28(木) 12:01:44.31ID:fukyqugk
>>195
ありがとうございます、消してしまった気がします…
こうなった場合の対処法ってどうすれば良いんですか?調べたんですけど「やらないように注意」みたいにしか書いてなくて…

警告文は1回Google翻訳に突っ込んだ時にルー語で翻訳されてキレそうになりましたw
ちゃんと調べてある程度意味はわかりました
0198名前は開発中のものです。
垢版 |
2017/12/28(木) 12:18:12.10ID:ghF3Rjv1
>>197
基本的には不要なmetaファイルを消せばいい

metaファイルの中を理解することは大変だけどmetaファイルの存在意義を理解することはそこまで難しくはないと思う
ググればmetaファイルとはなんぞやって記事いっぱいあるからゆっくり読んでみればいい

全部が理解できなくてもいいから色んな記事を読むといい
その過程で色んな知識がつくはず
それを繰り返してればそのうち色んなことに対処できるようになる
0199名前は開発中のものです。
垢版 |
2017/12/28(木) 12:24:20.51ID:ghF3Rjv1
>>197
あと警告やエラー文は基本翻訳ソフトに突っ込まないほうがいい
単語の意味を調べる程度にしときな
プログラム上で使われる意味合いと英文としての意味合いが異なって余計に混乱することになることが多いと思う
GUIDみたいな略語なんかは翻訳仕様がないしね

むしろ警告文をそのままググるほうが同じ問題で引っかかった人が解決法とか書いてくれてたりすることもあるからそういうふうに調べたほうがいいよ
0200名前は開発中のものです。
垢版 |
2017/12/28(木) 12:36:22.53ID:epGNZdyE
>>185

正確に言うと1フレーム内なんだけど、イベントが呼び出される順番の問題では?

Awake
Start
FixedUpdate
Update
LastUpdate
OnRenderImage
OnGUI
OnDestroy

同じフレーム内でも、Updateの前にFixedUpdateが来るから、
FixedUpdateの処理が1フレーム分先の内容になっているんだと思う
0201名前は開発中のものです。
垢版 |
2017/12/28(木) 12:43:17.39ID:fukyqugk
>>198
>>199
わかりました、また調べてみます
色々とご教示ありがとうございました
0202名前は開発中のものです。
垢版 |
2017/12/28(木) 12:44:32.49ID:epGNZdyE
Start:
 Debug.Log
 Invoke A 0秒
 Invoke B 0秒
FixedUpdate:
 Debug.Log
Update:
 Debug.Log
A:
 Debug.Log
B:
 Debug.Log
 Invoke AA 0秒
AA:
 Debug.Log

Time.frameCountをDebug.Logすると、全て1になるね
(FixedUpdateとUpdateは初回のみDebug.Log)
0203名前は開発中のものです。
垢版 |
2017/12/28(木) 12:48:38.22ID:epGNZdyE
実際にやってみると、Debug.Logされる順番は、
@Start
AFixedUpdate
BA
CB
DUpdate
EAA
の順になるので、

@Satrt→BAの間には、FixedUpdateが入っているので、
その間に物理演算の結果が更新されますが、

CB→EAAの間には、FixedUpdateが入らないので、
その間に物理演算の結果は更新されません
0209名無し@キムチ
垢版 |
2017/12/28(木) 19:12:09.06ID:26YsjXJQ
>>177
他のオブジェクトのアクティブのtrueはfalse明らかにオブジェクトの量で変わる。
オブジェクトの量を増やすと、それまでtrueはfalseがちゃんと動いていたものが、動かなくなる。
その行の削除するとまたちゃんと動き出すことから、それは明らか。

それを回避するには、オブジェクトごとにスクリプトをつけてそれに書けばアクティブのtrueはfalseは確実に動く。
0210名無し@キムチ
垢版 |
2017/12/28(木) 20:33:48.36ID:26YsjXJQ
最近わかったんだが、Unityでは基本あるオブジェクトにつけたスクリプトから他のオブジェクトを動かしてはいけないんですね。
あくまでもそのオブジェクトにだけ関するスクリプトであるということ。
MonoBehaviorの「Mono」とはそういう意味なんですね。
0212名前は開発中のものです。
垢版 |
2017/12/28(木) 21:42:51.63ID:mWenZKXP
NSObjectのNSはNextStepの略だしな
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況