トップページ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になる。
0027名前は開発中のものです。2016/01/14(木) 21:07:51.86ID:QcoLVpo7
>>26
ありがとうございます!
マニュアルめくってる…というかクリックしまくっている最中なのですが
画面のwidth, heightと、スプライトのwidth, heightは
カメラのサイズとスプライトのスケールを考慮してそれぞれ補正しないと
等価なスケール?の数値として扱えないということでしょうか
0028名前は開発中のものです。2016/01/14(木) 21:14:59.66ID:4szDTpIZ
画面上にgameobjectが存在するか確認したいのですが、わからないです。


例えば、「敵」というオブジェクトを消滅して、画面に存在するか確認したいのですが
0029名前は開発中のものです。2016/01/14(木) 21:17:16.82ID:DcDqZSER
>>28
Findとは違うの?
0030名前は開発中のものです。2016/01/14(木) 21:17:25.44ID:w22A5JmG
>>27
カメラのサイズはワールドの中でのどの範囲を描画するかを決める。
Sizeを4にすればカメラが平行で0,0,0にあるとして上下4の範囲を描画する。
つまり縦8の領域を描画する。
それをいくつのピクセルとして描画するのか、を決めるのが画面のWidth,Heightの設定だ。
Height800にすればワールドの縦8を800ピクセルで描画する。
スプライトはあくまでワールドの中に置かれるものだからそれが何ピクセルのものかは
どうでもよくてワールドの中でどのような大きさのものなのかが問題になる。
0031名前は開発中のものです。2016/01/14(木) 21:18:59.06ID:Q45i/G7c
UNETでNetworkManagerのuse Network Simulatorをチェックしたままでビルドすると
Clientが謎のtimeoutsで落ちるんだな、数時間悩んだよ
0032名前は開発中のものです。2016/01/14(木) 21:27:26.71ID:w22A5JmG
>>28
Renderer.isVisibleを使うかもしくはOnWillRenderObject()を使う
http://docs.unity3d.com/ja/current/ScriptReference/Renderer-isVisible.html
http://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.OnWillRenderObject.html
0033名前は開発中のものです。2016/01/14(木) 21:28:10.64ID:4szDTpIZ
>>29

findしてもずっとnullが出ます…
0034名前は開発中のものです。2016/01/14(木) 21:29:01.49ID:QcoLVpo7
>>30
非常によくわかりました。重ね重ねありがとうございます
全スプライトの設定を見なおしてみます(´;ω;`)

>>28
動かしてる時にヒエラルキーウインドウを出すようにしておけば
実行中にインスタンスが残ってるかどうか確認できるけど
そういうことではなく?
0035名前は開発中のものです。2016/01/14(木) 21:30:53.47ID:4szDTpIZ
>>29

ゲーム起動してプレハブで生成したものを確認したいのですが、出ないですね
0036名前は開発中のものです。2016/01/14(木) 21:34:39.25ID:4szDTpIZ
>>34
プログラム側で確認したいです


やろうとしている事は

プレイヤーが球を発射して
連射出来ないように球が画面にある間は
球を発射出来ないようにしたいのですが、
生成した球の存在チェックをプログラム側でどうすればいいのか…
0037名前は開発中のものです。2016/01/14(木) 21:39:00.91ID:w22A5JmG
>>33
生成したときにリストとかに突っ込んで管理する。
0038名前は開発中のものです。2016/01/14(木) 21:40:13.17ID:QcoLVpo7
チェックはこれですかね
http://baba-s.hatenablog.com/entry/2014/08/19/222641
0039名前は開発中のものです。2016/01/14(木) 21:45:19.65ID:DcDqZSER
弾クラスでstatic intな変数を用意して、Awake()で+1、OnDestroy()で-1
あとはこの変数が0のときにのみ発射できるようにするとかどうよ
パワーアップアイテムとかで連射可能になったときも対応できるし
0040名前は開発中のものです。2016/01/14(木) 21:51:49.27ID:4szDTpIZ
皆さまありがとうございます!

取り敢えず>>37の生成したものを管理して存在チェックしたらいけました

ありがとうございます!

他の方のやり方も試してみて納得いくやり方でやってみます!
0041名前は開発中のものです。2016/01/14(木) 22:13:33.92ID:Q2ZA3yWj
>>36
目的がシンプルなのでやり方は色々あるね
例えばUnityEventメンバ変数持てばインスペクタやスクリプトからも処理を追加出来る様になる

public class Ball{
public UnityEvent Destroy;
void OnDestroy(){
Destroy.Invoke();
}
}

public class Player{
int ballcount
void Shoot(){
if(ballcount>=maxBallCount)return;
Ball b =.Instantinate(prefab);
b.Destroy.AddListener(OnBallDestroy);
//射出時の処理諸々
ballcount++;
}
void OnBallDestroy(){
ballcount--;
}
}
0042名前は開発中のものです。2016/01/14(木) 22:16:58.59ID:Q2ZA3yWj
スマホで直打ちしたら諸々不備が多いな、すまんね
0043名前は開発中のものです。2016/01/14(木) 22:56:15.90ID:xdOodcu9
質問する時は最初から
 やろうとしている事
 そのために書いたコードまたは手法
両方書けば応える方もさらっと理解できるよ
より向いた手法があったらそういう助言もできるし
0044名前は開発中のものです。2016/01/15(金) 00:11:45.72ID:VE1n1Pig
まあ、結局はせっかく書いた前提条件とか一切関係なしに
最後の2行くらいで適切な回答をされることも多いけどなw
0045名前は開発中のものです。2016/01/15(金) 00:17:55.20ID:hT1xBee/
>>36
一番簡単なのは、固有のタグつけてタグの有無見るのが一番手っ取り早いよ
>>41のやり方は拡張性が高い半面、管理もしっかりしないし、コード書く手間とアルゴリズム抜けを
イチイチ気にしないといけないから、俺はお勧めしないな
0046名前は開発中のものです。2016/01/16(土) 06:45:49.18ID:hMQbMJn+
前スレでカプセル化について質問したものです。
教えていただいた通り、オブジェクトの分類を理解するためにも、
カプセル化していってみようと思います。遅レスすいませんでした。

>初心者がカプセル化なんて知ってるわけがなかろう

javaのチュートリアルサイトにカプセル化の記載があり、
C#とjavaは言語などが非常に似ているとの事でしたので、
初めて3ヶ月程度というのもあり、質問させていただいた次第です。
0047名前は開発中のものです。2016/01/16(土) 10:35:21.23ID:6vYU6itD
ん、ま、がんばれ
でも本気でUnityやる気ならC#がいいぞ
WEB上でjavaでのサンプル&資料はすごく少ない
0048名前は開発中のものです。2016/01/16(土) 14:29:08.17ID:pIjhD6Wk
こんな僻地のスレにも業者現れるとか2chいよいよヤバいだろ
ひろゆきが暴れるわけだわ
0049名前は開発中のものです。2016/01/16(土) 22:30:24.46ID:D6eJ+oJm
ソリティアのクリア画面みたいな
画面をクリアせずに延々と書き足し続ける演出をUnityでやりたいのですが、
何か手はありますかね。恐ろしく非効率的な方法としては、残像の数だけ生成…
0050名前は開発中のものです。2016/01/16(土) 22:39:27.38ID:+Tq113Aa
パーティクルがまさにそうなんでは
0051名前は開発中のものです。2016/01/16(土) 22:47:36.89ID:ESSHHt4c
>>49
単純にカメラのクリアフラグをnoneにするだけで出来るでしょ
0052名前は開発中のものです。2016/01/16(土) 23:38:56.52ID:33or0W7w
どこかのゲームがすでにやってそうだけど、3Dゲームが見やすくなる表示方法思いついた。
http://imgur.com/Ii5cy4z
↑みたいに4方に立体的な杭を立てれば操作キャラの方向がわかりやすくなるよね?
0053名前は開発中のものです。2016/01/17(日) 00:02:49.86ID:+43sny4h
質問が複数あります

@GetComponent<Light>().colorで、Direction Lightの色をスクリプトから変更しようとしましたが
「Lightにcolorの定義が含まれておらず、型'Light'の最初の引数を受け付ける拡張メソッドが見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足しています。」
と出ます。
どのようにすればスクリプトからLightの色が変えられるのでしょうか?

ASpaceボタンを押したときに効果音が再生されるようにスクリプトを組みましたが、音がなりません。
ListenerはMain Cameraに設定し、スクリプトを組み込んだゲームオブジェクトとともに座標を(0,0,0)に設定してあります。
Audio Listenerのチェックボックスはオンになっています。
鳴らそうとした音声ファイルはwav形式です。

audioSource.PlayOneShot(sound); だけではなく、audioSourse.Play();でも試してみましたが、こちらも音が鳴りませんでした。

Bアイテム(Item_fireというタグを付けています)に接触したときに
floatの値(fireという名前にして、初期値は1です)を、1増やそうとして、OnCollisionEnterで接触したときに増やそうとしたのですが、一気に13や14も増えて困っているのですが、どうすればいいでしょうか?
OnTriggerEnterを使って、衝突したときに増やす方法や、座標が重なったときに増やす方法(重なったら重なったアイテムをDestroyで消して、1だけ増やそうとしました)も試しましたが、結果は同じでした。
非常に初心者的な質問で申し訳ないんですが、だれか回答をお願いします……
0054名前は開発中のものです。2016/01/17(日) 00:47:08.26ID:HM7CiyDS
UNETでバイオ5みたいなco-cpのやり方とかは見かけるんですが、
Client/Server方式でserverが座標やオブジェクトのスポーンなどの
数値データを送受信している方式を見かけないのですが、どなたか
サンプルや解説などを載せたサイトをご存じないでしょうか?
0055名前は開発中のものです。2016/01/17(日) 00:48:01.70ID:XD9ZIbZ3
Bには思わずわろたw 14回とか接触判定発生してるからに決まってんだろw
Destoryはフレームに最後に解決されると思ってプログラム書かないとダメ
無理やりぶっ壊すこともできるけど、その辺は人それぞれじゃないかな

Unity基礎知識が足りてないみたいだから、複数のチュートリアルしっかりやるか、
検証兼ねながら一つづつ確認してったほうがいいよ
0056名前は開発中のものです。2016/01/17(日) 00:57:41.87ID:KYCpO1zf
>>53
@俺のところではその文のままで変更できる。using UnityEngineと書いていないとかか。
A俺のところでは普通に鳴る。そこにある情報に音が鳴らない理由は書かれていない
BそういうのはフラグをもっておいてOnCollisionEnter内ではフラグを立てるだけにしておいてUpdate()内で処理する
■ このスレッドは過去ログ倉庫に格納されています