[過去ログ] 【3Dゲームエンジン】Unity質問スレッド33 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
169(2): 2017/12/27(水)22:33 ID:UZCkhUUp(1) AAS
 >>165 
 シーン遷移時は、前のシーンのオブジェクトを破棄して新たなシーンのオブジェクトを構築する処理が走る 
 この処理が終わらないと新しいシーンのオブジェクトはFindでは見つからない 
  
 よって、新たなシーンのオブジェクトを見つけたければSceneManager.sceneLoadedデリゲートを使ってシーンのロードが完了してから処理を行う必要がある 
  
 ちなみにSceneManager.sceneLoadedはロードされたシーンのオブジェクトのAwakeが完了し、Startが呼ばれる前に呼ばれる事に注意 
 またこのデリゲートはどのシーンがロードされても呼ばれるから処理内でシーン毎に振り分けるかハンドラをつけ外しするなどの対処が必要 
170(1): 名無し@キムチ 2017/12/27(水)22:59 ID:oeXBuupd(2/2) AAS
 >>164 
 遷移後のobjBをFind →失敗  
 当方の経験ではFindは、そのオブジェクトにアタッチされているスクリプトからでないと、失敗したり成功したりその時々によってさまざまだな。 
171: 2017/12/27(水)23:23 ID:Y6rKayv0(1) AAS
 なんだやっぱりキムチか 
172: 2017/12/27(水)23:29 ID:9tGAk59e(3/3) AAS
 プログラムが成功したり失敗したりなんて挙動するわけない 
 成功するのも失敗するのも理由がある 
 理由を理解できていないのにプログラムのせいにするプログラマー 
173(1): 2017/12/27(水)23:56 ID:2+M/n1Lm(4/4) AAS
 >遷移後のシーンに配置されているボタンから、objAのメソッド?を呼び出す  
  
 本当に呼び出せている? 
 Find以前の問題だったりして・・・ 
174(1): 2017/12/28(木)00:13 ID:mH5YII84(1/8) AAS
 ボタンからの入力を受けていないだけとかはないですか? 
 UIから、その該当スクリプトへのコールがかかっていないとか? 
  
 入力をInputにして、 
 if?(Input.GetKeyDown?(KeyCode.Space))?{ 
  Debug.Log("Input OK"); 
  GameObject A = GameObject.Find("objA"); 
  Debug.Log(A); 
 } 
 を追加して、 
 スクリプトが機能しているかどうか、 
 オブジェクトを取得できているかどうかを確認してみてください 
175(1): 2017/12/28(木)00:18 ID:mH5YII84(2/8) AAS
 すみません、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上に同時に並んでいるわけですものね? 
176(1): 2017/12/28(木)00:34 ID:mH5YII84(3/8) AAS
 各オブジェクトのそれぞれのスクリプトで行っていることが良く分からないのですが、 
  
 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")と同じフレーム内で呼んでいないですよね?? 
177(1): 2017/12/28(木)00:51 ID:fQL7hUYb(1/2) AAS
 >>169 
 レス遅れてすみません。 
 ありがとうございます。 
 とても参考になり、わかりやすかったです。 
  
 結果として、やったことは 
 SceneManager.LoadSceneの直後にSceneManager.sceneLoadedを行って 
 そのデリゲート処理完了後にそれぞれのテストメソッドを呼び出して参照したりしたところ 
 問題なく参照できました。 
 >>161にはレスしませんでしたが、当たりだった感じです。 
  
 >>170 
 なるほど。。。他の方々のレスを見る感じ、テスト環境でやっていたのかもしれないので 
 もしかするとオブジェクト等の量とかでかわるんですかね? 
  
 >>173 
 そこは上のレスを書いた時点で確認できていました 
 debug.log等での確認なので精度はわかりませんが 
178: 2017/12/28(木)00:56 ID:fQL7hUYb(2/2) AAS
 >>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")と同じフレーム内で呼んでいないですよね?? 
  
 恐らくそういうことだったんだと思います 
179: 2017/12/28(木)01:23 ID:GhM3Lpso(1) AAS
 デバッガ使えば5分で分かった事を22時間も掛けて 
 大した効率だよな 
180: 2017/12/28(木)01:43 ID:mH5YII84(4/8) AAS
 以前、物理演算で、どういう処理だったか忘れたけど、 
 変数を物理演算に設定した直後に、 
 同じフレーム内でデバッグログに物理演算結果を出力しようとしたら、 
 変数が設定された結果が出せなくて、 
 Invokeで1フレーム後にデバッグログを呼び出したら、出力できたことがあるので、 
  
 一度フレームを走らせないといけないポイントで処理を連続してしまうのは、 
 結構ピットホールになりやすいかもしれない 
181: 2017/12/28(木)02:14 ID:mH5YII84(5/8) AAS
 velocityの変更、positionの変更は、同じフレーム内で取得しても変更が反映されるけど、 
 例えばAddForceでは、たとえ1フレームで加速するForceMode.Impulseでも、 
 同じフレーム内ではまだvelocityは速度変更されておらず、 
 次のフレームでvelocityの変更が反映されるみたい 
  
 でも、1フレームで移動を行うMovePositionは、 
 同じフレーム内でpositionの変更が反映されているという・・・ 
182: 2017/12/28(木)02:20 ID:aEDu9yFW(1) AAS
 全然関係ねえよ 
 オブジェクトの生成と破壊は1フレーム掛かるから後処理は1フレーム待てと言われただろ 
 シーンの呼び出しも同じって>169に言われてんだろ 
183: 2017/12/28(木)02:49 ID:mH5YII84(6/8) AAS
 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フレーム遅れるんでしょうね・・・ 
184: 2017/12/28(木)02:51 ID:ZI2vMH5M(1/2) AAS
 外様が言うのは何だが 
 コードも貼られて実に良スレだな 
185(2): 2017/12/28(木)03:22 ID:mH5YII84(7/8) AAS
 ごめんなさい、原因が分かったよ 
  
 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でした 
186(1): 2017/12/28(木)03:24 ID:yHTFG4+0(1) AAS
 物理はFixedUpdateのタイムスライスで動いてるから、 
 Update系とは時間の流れ違うだろ 
187(1): 2017/12/28(木)04:43 ID:NrJHfHro(1) AAS
 >>185 
 何の確認もせずに適当な思い込みで妄想しても 
 的外れなだけじゃないキムチ君w 
 毎回そんなアホな事をやってるから迷走すんだよ 
  
 だったらStartとStart2に 
 Debug.Log(Time.frameCount); 
 で実実行時のフレームカウント出してみなよ 
 両方とも1って出るから 
188: 2017/12/28(木)07:27 ID:yfK1iHQW(1) AAS
 161最強!w 
189(1): 2017/12/28(木)09:26 ID:fukyqugk(1/5) AAS
 初心者です 
 マテリアル作って保存したらファイル名が勝手に.matから.MATに変わってそのせいで警告が出てる??みたい  
 パソコンのせいなんでしょうか 
 解決方法分かりませんか? 
190: 2017/12/28(木)09:35 ID:PGevnyVZ(1) AAS
 警告文そのものを貼ってください 
191: 2017/12/28(木)09:53 ID:fukyqugk(2/5) AAS
 警告で 
 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 
 です 
192(1): 2017/12/28(木)10:09 ID:ZI2vMH5M(2/2) AAS
 どーせテクスチャをエクスプローラーからコピペして置き換えしたりしてんだろ 
193: 2017/12/28(木)10:24 ID:o+JGejkD(1) AAS
 >>189 
 君みたいな雑魚にUnityは使いこなせません 
 10年webで下積みしてから出直してきなさい 
194(1): 2017/12/28(木)10:45 ID:fukyqugk(3/5) AAS
 >>192 
 いえ、普通にUnityエディタ内でmaterialを作成してます 
 で真っ白なまま保存しても.matで保存されるんですが少しでも色を変えると保存した時に拡張子が.MATに変わってしまうんです 
195(1): 2017/12/28(木)11:13 ID:ghF3Rjv1(1/5) AAS
 >>194 
 ファイル消したりしてるでしょ 
 元ファイル消したのにmetaファイル消してないから名前が使えない 
 だから別の名前使うね、ってなってる 
 生成も削除も移動も全てuntiy上で行ってください 
196: 2017/12/28(木)11:16 ID:ghF3Rjv1(2/5) AAS
 てか警告分の内容は理解してる? 
 中学英語の単語しか無いぞ 
 英語だからって毛嫌いせず読もうとしてみるの大事 
 だんだん慣れてくるから 
197(2): 2017/12/28(木)12:01 ID:fukyqugk(4/5) AAS
 >>195 
 ありがとうございます、消してしまった気がします… 
 こうなった場合の対処法ってどうすれば良いんですか?調べたんですけど「やらないように注意」みたいにしか書いてなくて… 
  
 警告文は1回Google翻訳に突っ込んだ時にルー語で翻訳されてキレそうになりましたw 
 ちゃんと調べてある程度意味はわかりました 
198(1): 2017/12/28(木)12:18 ID:ghF3Rjv1(3/5) AAS
 >>197 
 基本的には不要なmetaファイルを消せばいい 
  
 metaファイルの中を理解することは大変だけどmetaファイルの存在意義を理解することはそこまで難しくはないと思う 
 ググればmetaファイルとはなんぞやって記事いっぱいあるからゆっくり読んでみればいい 
  
 全部が理解できなくてもいいから色んな記事を読むといい 
 その過程で色んな知識がつくはず 
 それを繰り返してればそのうち色んなことに対処できるようになる 
上下前次1-新書関写板覧索設栞歴
あと 804 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.014s