トップページgamedev
1002コメント420KB

【3Dゲームエンジン】Unity質問スレッド22 [無断転載禁止]©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2016/01/11(月) 01:24:43.29ID:r4suKLTg
3Dゲームエンジン「Unity」の質問に優しく答えるスレです。
Windows/Mac用。JavaScript/C#といった汎用言語を使用できるのが特徴です。
フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。
プラットフォームサポートはiPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3、PlayStation 4、PS Vita他

次スレは>>970を踏んだ方が建てること。ダメなら>>980>>990が建てて下さい。

■本スレ
【3Dゲームエンジン】Unity総合スレッド27 [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/gamedev/1441891966/

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

●リンク
・Unity(日本公式サイト)
http://unity3d.com/jp
・ユーザーガイド
 http://docs.unity3d.com/ja/current/Manual/UnityManualRestructured.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質問スレッド21
http://peace.2ch.net/test/read.cgi/gamedev/1447775596/
0002名前は開発中のものです。2016/01/11(月) 14:26:50.41ID:jh+IJu+Y
Unity5.3.1 で起動すると画面が灰色で、動きません。どうしたらいいですか?
0003名前は開発中のものです。2016/01/11(月) 23:15:03.66ID:B3JfDoAX
マップデータをtext形式でセーブしゲーム開始時にロードするシステムを作ったのですが
セーブを行った時にtextファイルを上書きで書き込んでるのですが
Play中セーブを行ってもtextの中身が変わらずmonodevelopでtextファイルを開いた時に更新されました
上書きはちゃんと出来ているのですがmonodevelopで一度開かないと更新がされません 原因わかる方いませんか?
セーブするときはStreamWriter とFileInfo を使いました
0004名前は開発中のものです。2016/01/12(火) 00:44:43.39ID:2QuOWJx6
ソースコードを貼ってくれと何度も(ry

あとセーブデータをテキストファイルで保存するのは(手法の一つとしては)いいが、後で暗号化なりの処理を加えとかないと書き換え放題だぞ
0005名前は開発中のものです。2016/01/12(火) 02:57:30.91ID:zes3wFGw
ファイルの書き込みとは、メモリに書き込むだけ。
それをどういうデバイスに、いつ書き込むかは、OSの設定による

絶対にデバイスに書き込みたいのなら、
(同期的に)flush して、メモリからデバイスに書き込む

非同期だと、本当に書き込んだかどうか、わからない
0006名前は開発中のものです。2016/01/12(火) 10:37:02.27ID:7+Ji+X3F
public void Save
{
Map mapdata = GameObject.Find("MAP").Getcomponent<Map>();

StreamWriter sw;
FileInfo fi;

fi = new FileInfo(Application.datapath + "/Resources/stageData.txt");
sw = fi.CreateText()

for(int i=0;i<mapdata.maxY;i++){
for(int j=0;j<mapdata.maxX;j++){

sw.Write(mapdata.pos.y);
sw.Write(",");
sw.WriteLine(mapdata.pos.x);
}
}
sw.Flush();
sw.Close();
}

ソースコードはこの様な感じです
Mapのデータを書き込むようにして
保存先はリソースファイルに指定しています
0007名前は開発中のものです。2016/01/12(火) 14:33:57.23ID:Ujpm+eby
質問です
今単純なオブジェクトをまぁ大体100個位同時に表示させるゲームを作ってるんですが
Batchesつまりドローコールがかなり多くなってしまいます
オブジェクトを一つのマテリアルで共用で使うように変更してみたりしたのですが
やっぱりドローコールが多いです
ドローコールを下げる方法ってのはどういうものがあるでしょうか?
0008名前は開発中のものです。2016/01/12(火) 21:54:46.06ID:vxzjE1XO
batchsとdrawcallは別だよ
batchsの値は、「それだけdrawcallを減らせた」って事だから、batchsの値が高くても、気にしなくていい
0009名前は開発中のものです。2016/01/12(火) 21:56:46.09ID:vxzjE1XO
saved by batchesの方だった
嘘教えてごめん
0010名前は開発中のものです。2016/01/12(火) 22:00:31.79ID:vxzjE1XO
3Dで作ってるなら、drawcallが多くなるのは、これが原因かも

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10126720595
0011名前は開発中のものです。2016/01/12(火) 22:38:14.54ID:x5b084d/
>>7
Unity5系であれば、Frame Debbuger使えば実際のドローコールが目視で確認できるから見てみるのもいいかもしれない
0012名前は開発中のものです。2016/01/13(水) 00:59:26.62ID:GYbfaCxv
>>10
うーむ
違いますねぇ〜
ライトはもともと設置してあるディレクショナルライト一つを多少向きを変えて使ってるだけです

>>11
明日チェックしてみます
0013名前は開発中のものです。2016/01/13(水) 13:30:48.96ID:xhzQbyIl
>>6
>sw.Flush(); sw.Close();

よく知らないけど、普通、ファイルのClose()を呼べば、
その中でFlush()を呼ぶから、
Close()する際、Flush()は書かなくてよい

サンプルを見て、sw.Flush(); sw.Close();と書いてあるなら、
その通りにしてください
0014名前は開発中のものです。2016/01/13(水) 13:31:57.31ID:VqYoBuzo
なんでよく知らないのに書くんだろう…
0015名前は開発中のものです。2016/01/13(水) 13:37:31.68ID:2ZlhPTps
前スレ >>999
レスありがとうございます。
自前で用意するしかないようなので、もう少し Animator 周りを調べてみます。
0016名前は開発中のものです。2016/01/13(水) 14:06:36.40ID:V7WW9YF0
>>13
Close()呼べばFlush()されるので明示的に呼ぶ必要はないというのは正しい

ただしusingステートメント使えばClose()も明示的に呼ぶ必要はない。
>>6のソースだと途中で例外が発生した場合Closeされないのでusingステートメントを使うのがいいと思う
0017名前は開発中のものです。2016/01/14(木) 00:30:32.20ID:ktxMKZ7s
>>7ですがまだ完全とは言えませんがとりあえず何割か改善しました
パーティクルのエフェクトにソートの設定を付けたら良くなりました
0018名前は開発中のものです。2016/01/14(木) 12:12:38.26ID:dtN67MUT
複数シーンを扱えるようになったけど、
別シーンのオブジェクトを変数で参照しておくと、新しいインスタンスが作られてしまう。

基本的にシーンまたぎの参照はできないのですか?
0019名前は開発中のものです。2016/01/14(木) 13:13:10.39ID:w22A5JmG
できない。
0020名前は開発中のものです。2016/01/14(木) 18:27:33.47ID:QcoLVpo7
スクリーンと各オブジェクトのwidth, heightについて、
WorldPointで取得した値の相関関係?が実際のpixelサイズの比率と異なっており、悩んでいます。
http://i.imgur.com/QTSXcQL.jpg

◆スクリーンサイズ
・実際の値
 w 560, h 800
・ログ出力した値
 w 1.7, h 2.4
 > Vector2 size = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height))
  or
 > Vector2 size = Camera.main.ViewportToWorldPoint(new Vector2(1, 1))

◆背景画像サイズ
・実際の値
 w 1345, h 951
・ログ出力した値
 w 8.07, h 5.70
 > Vector2 size = this.GetComponent<SpriteRenderer>().bounds.size

背景画像の横幅は、スクリーンサイズの2倍ちょい程度なのですが
WorldPointで出した数値は1.7 : 8.07となってしまいます。
背景画像にscaleを加味したとしても、4.84で比率が合いません。

サイズの取得方法について、何か間違いがありますでしょうか。
ご教示お願いしますm(_ _)m
0021名前は開発中のものです。2016/01/14(木) 19:28:10.58ID:5fQyllGr
>>19
ありがとうございます。
0022名前は開発中のものです。2016/01/14(木) 20:04:37.28ID:xdOodcu9
>>20
「なにがしたいか」も書いた方が質問の意図が伝わるんじゃないかなと思った
そもそも意味がわからないけどね
0023名前は開発中のものです。2016/01/14(木) 20:43:54.47ID:w22A5JmG
>>20
色々わからん部分もあるので恐らく、だが

まずスクリーンの方についてだがカメラのSizeが2.4になっている、
というだけの話であろうかと思う。

次にスプライトの方だがのインポート設定のピクセルパーユニットが100になっているはずだ。
つまりエディター内での1の大きさに100ピクセル入るようになっている。
だから1345のスプライトなら横13.45の大きさのオブジェクトになる。
それに0.6のスケールをかけると8.07になる
0024名前は開発中のものです。2016/01/14(木) 20:46:11.55ID:QcoLVpo7
>>22
意味不明でしたか…すみません

やろうとしていることは、スプライトのドラッグ時に移動可能範囲を定めたいです。
範囲設定自体は下記で出来ています。

 > Mathf.Clamp(現在値, 最小値, 最大値);

例えば画面より小さいサイズのスプライトが画面からはみ出ないようにするためには

 > // xの場合 (スプライトの中心±幅の半分で、スプライト全体をはみ出さないようにする)
 > 座標最小値 += スプライト幅 / 2
 > 座標最大値 -= スプライト幅 / 2

で出来ました。

今は>>20で書いたマップのような、
画面より大きいスプライトの移動制限をかけたいと思っています。
小さいのとは逆で「常にスプライトが画面に収まるように」したいです。
計算としては下記で出来ると考えています。

 > // xの場合 (一旦中心に戻して、スプライトと画面の大きさの差分だけを可動範囲にする)
 > 座標最小値 += (画面幅 / 2) + (スプライト幅 - 画面幅)
 > 座標最大値 -= (画面幅 / 2) + (スプライト幅 - 画面幅)

これが上手く行っておらず、各値をLogで出したところ、
肝心の画面幅やスプライト幅の数値が怪しいことに気づき、
質問した感じです。
0025名前は開発中のものです。2016/01/14(木) 20:52:35.61ID:QcoLVpo7
>>23
ありがとうございます
各数値の意味を理解していませんでした…
マニュアル見てきますorz
0026名前は開発中のものです。2016/01/14(木) 21:02:23.68ID:w22A5JmG
>>25
まぁ訳わからなくなりがちなので0.6とかのスケールをかけるのではなく
スプライトのスケールは1にしておいた方がいい。
恐らくカメラのSizeを変えるという方法をとらず
スプライト側の大きさを変えてしまったということなのだろうが。
スプライトのスケールを1にしてカメラのSizeを4にすればいい。
大体今と同じような見え方になるはず。
そしてワールドでの座標値とスクリーン座標値の比率は1:100になる。
■ このスレッドは過去ログ倉庫に格納されています