【ゲームエンジン】Unityなんでも質問スレpart9
■ このスレッドは過去ログ倉庫に格納されています
フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。 プラットフォームサポートはiPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3、PlayStation 4、PS Vita他 ■注意事項 質問と答え以外は禁止 ■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 ←スクリプトのエラー番号をこれで検索すると原因が日本語で出てきます。 前スレ 【ゲームエンジン】Unityなんでも質問スレpart8 https://mevius.5ch.net/test/read.cgi/gamedev/1663487800/ >>504 UNITYでアニメ反転出来ますよ。 アニメーションクリップのインスペクターでMirrorにチェック入れるだけです。 アニメクリップコピー>コピーしたのをmirrorにチェックで繰り返し 作っていけば左右両方のアニメ出来るんですが、数が多いと作業量も増えるので スクリプトでできたら便利だなあと思ったんですよね。 Quaternionの回転量に係数を掛けたQuaternionを取得したいんだけど、 Quaternion.ToAngleAxis と Quaternion.AngleAxis を経由せずに行う計算方法ない? 徐々に回転が遅くなるコードを書きたいんだけど、 毎フレームやるとGameObjectの数増やした時にチリツモで重くなる気がする void Update() { transform.rotation *= inertiaRotation; inertiaRotation.ToAngleAxis(out var angle, out var axis); inertiaRotation = Quaternion.AngleAxis(angle * 0.95f, axis); } >>505-506 なるほど なんとなく腑に落ちた気がします ありがとうございます >>508 そこ以外でangleとaxisが変わらないなら、angleとaxisを変数に持っておけば、ToAngleAxis()は省ける 別の方法なら、Quaternion.RotateTowards()、Quaternion.Lerp()あたりも使えるかもしれないけど、AngleAxis()より軽いとは思えないな Objectが大量にある時に重くなるのを軽くしたいなら、自分ならBurst、JobSystemを使うことを検討する 壁に当たった時onCollisionEnter内で自身にrigidbody.addforceをして反射っぽい動きをする球を数千個複製して動かしてますが 数個に1個ほど衝突してもaddforceされてないぽい動きをする球が居ます 数千個もやってるせいかなと思ってるのですが負荷状況によってcollisionenterが呼ばれないもしくはaddforceが無視されるケースてあり得ます? 親オブジェクトのみtransform.Rotateで回転させることはできますか? テキストはそのままでキャラクターを左右反転させたいです。 合ってるかどうか自信ないので質問させてください。 1/60フレームごとに処理したいのですが、スクリプトは以下のやり方でいいんでしょうか? よろしくお願いしますm(__)m public float fps; void Update() { fps+=Time.deltaTime; if (fps > 1/60){fps = 0;} if(fps==0){//何か処理} } >>513 端数切り捨てだから正確な判定にはならんな あと1/60は1f/60fにした方がいい 変数fpsにゼロ入れたときにそのまま処理書いちゃあかんのん? >>512 その2つの上に空の親作っちゃあかんのん? >>514 なるほど 端数を切り捨てないように次の計算で足したりしたらいいってことでしょうか なんとなくわかった気がします 回答ありがとうございます >>515 あ、そのまま書いても行けましたね ご指摘ありがとうございます photonでprefabの変数を区別するにはどうすればいいでしょうか? prefabに変数expを持たせているのですがプレイヤー1とプレイヤー2で区別できません。 ボタンをクリックしたプレイヤーのexpだけ1増えるようにしたいのですが、プレイヤー1、2両方とも増えてしまいます。 >>520 すみません、言ってる意味が不明です。読解力ないのかな。 staticにしてあるとかじゃなくて? photon Boltだと 「UserToken」があり接続してきた相手の名前、切断理由、コネクト状態を保持しています。 こんな情報あるんだけど、よく見て見て識別は可能だと思うよ >>518 0にするんじゃなくて1f/60fを引く仕組みに変えればいいだけ >>523 レスありがとうございます。 なるほど!引くっていうの思いつかなかったです。 こんなカンジであってますか? void Update() { fps+=Time.deltaTime; if (fps > 1f/60f){何か処理; fps =fps-1f/60f;} } >>525 たしかにそうでした。 ありがとうございます。 >>521 >>522 staticが原因でした。解決できました。ありがとうございます。 >>517 ありがとうございます! 記事読む限り懸念してたことは起こってなさそうです 原因わからんですが別のアプローチでどうにかしようと思います >>528 ありがとうございます。 これでいこうとおもいます。 >>530 とはいえもともとupdateは不確実なものだからそれをベースに 同期的なシステムを作ることはオススメしない >>530 例えばプロファイルを眺めてれば分かるが ゲーム実行中一気に負荷がかかって一瞬全ての処理が滞ることがある updateも滞る そうした時その君のシステムはまともに動作するのか? 甚だ疑問である 厳格に60分の1秒単位の処理する必要なんてあるんかな? なんか不必要な処理な気がする >>532 >>533 後出しになっちゃってすみません。 具体的にやろうとしてるのは方向2回入れのダッシュの検出なんです。 1秒以内に方向が2回押されてる、かつその間にニュートラルが入ってる ならダッシュ成功みたいなふうにやろうと考えてます。 入力方向がニュートラルなら0、右なら3でリストに入力された方向を追加していって リストの中身を全部調べるやり方で作ろうとしています。 ただこのやりかただとPCの処理速度によってリストに追加するタイミングも違ってくるのではと思い、fpsで管理しようと思った次第です。 他におすすめやり方とかあれば教えてほしいですm(__)m //方向の履歴リスト(ダッシュ検出用) public List<int> histry; Start{ //リスト初期化 histry = new List<int>(); //方向0を60個リストに追加(60で1秒とする) for(int i = 0; i < 60; i++) {histry.Add(0);} } Update{ //履歴リスト更新(追加と1番最初を削除) histry.Add(押された入力方向番号); histry.RemoveAt(0); //履歴チェックメソッド実行(これから作る予定) Check(); } >>534 フレームで管理する必要ない マシンのスペック差はTimi.deltatimeでクッションされてるから 普通にfloat型の変数で管理できる >>535 すみません。 自分にはちょっと難しくて話についていけてないです。 よろしければ詳しく教えていただけますか? >>534 それと入力検知で60個ものリストを使い、毎フレーム付け外しするとか無駄の極み >>536 要するに1秒ってのを測ればいいだけだろ float型変数でjikanってのを作った場合 jikan+=Time.deltatime; でjikanをカウントして1秒後にチェックすればいいだけ マシンスペックによってTime.deltatimeの中身が変わるから それで差は吸収される >>538 くわしくありがとうございます。 floatで時間計測は理解できるのですが、1秒以内にダッシュ検出はどうしたらいいんでしょうか? >入力検知で60個ものリストを使い、毎フレーム付け外しするとか無駄の極み リスト使わなくてもできるってことでしょうか? スマートにやる方法をおしえていただきたいです。 1秒後というのはどう計測するんだい? マシンスペックに依存しちゃうと測れなくね? 開始したらコルーチンでも動かすんか? >>541 わわ まさにピンポイントな記事が 参考にさせていただきます! ありがとうございます! >>534 やっぱりこういうことか 俺もよくやるんだよねw ホントは簡単にできるのに無駄に遠回りしちゃうの 本人は熱中してるから無駄なのに気づかないんよ 遠回りするとコードややこしくなって詰んじゃってなんとかしようとググってると簡単なコード見つけて絶望する ようやくきがついたか。1/60で入力変化を人間ができるのかと言う壁。 初心者です 愚問でしたら申し訳ないです 共通UIのオブジェクトはどのシーンに属しているのが一般的なのでしょうか UI専用のシーンを一つ用意して、他のシーンとあわせてadditiveでロードするべきなのか それとも、UI専用のシーンは用意せず、各シーンにUIのオブジェクトを置いておくのが良いのでしょうか やりたいように作ればいいよ 一般的とか考えるだけ無駄 その通り 自分のゲームに最適なものを自分で選ぶ必要がある一般的なんてものはない >>545 ゲームのシーンが単一ならそのシーンにUI置いてもいいけど シーンがたくさんあるならUIのシーン作らないと面倒くさくない? 本日暇なので1日使えばこなせるおすすめのチュートリアルがあったら教えて欲しいです 出来ればコーディングも経験したいのでそういったものがチュートリアル内に含まれていると助かります 2Dでも3Dでもかまいません UIをプレハブ化したらUI用のシーンなんて作る必要ないと思うのだが UI用ゲームオブジェクトを1つ作って各シーンで使い回してるわ スプライトをフェードインフェードアウトさせたくてスクリプトをつくりましたが作動しませんでした。 スクリプトをアタッチして再生したのですが再生中インスペクターにあるSprite RendererのColorのAlphaが変動してませんでした。 原因わかる人いたら教えてください。改行が多くて書き込めなかったので{}は省略しています。 using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; public class FadeInOut : MonoBehaviour public float fadeSpeed = 1f; private float alpha = 0.0f; private SpriteRenderer spriteRenderer; void Start() spriteRenderer = GetComponent<SpriteRenderer>(); alpha = 0.0f; spriteRenderer.color = new Color(1, 1, 1, alpha); public void FadeIn() StartCoroutine(DoFadeIn()); public void FadeOut() StartCoroutine(DoFadeOut()); private IEnumerator DoFadeIn() while (alpha < 1) alpha += Time.deltaTime * fadeSpeed; spriteRenderer.color = new Color(1, 1, 1, alpha); yield return null; private IEnumerator DoFadeOut() while (alpha > 0) alpha -= Time.deltaTime * fadeSpeed; spriteRenderer.color = new Color(1, 1, 1, alpha); yield return null; んでもって、仕様を日本語にしてみよか フェードインとアウトはどうなったら起動するのかを考えよ >>553 これ FadeIn() 関数はちゃんと呼んでるの? 迷路状のでかいマップ(床プレートと壁だけ)に 敵オブジェクトをマップのランダムな位置に出現させたいです。 壁の中には出現しないようにするにはどうすればいいですか? >>558 俺なら完全なランダムはデバッグがやりにくいから 生成候補ポイントをあらかじめ決めて配列として持っておき その中から生成ポイントを選ぶ方式にする ランダムにしたければ生成候補ポイントの上からrayを飛ばして床プレートに当たった時生成して 壁に当たった時は生成候補ポイントの位置をずらしてまた rayを飛ばして生成できるポイントが見つかるまで繰り返す 壁からすぐ生成できるポイントを探せるように壁に隣の床の情報を持たせておく方法も考えられる 〉〉559 なるほど 配列で確保しとくのもいいですが、上からレイを飛ばす そのやりかたがありましたか レイ飛ばしても壁の中で当たり判定取れなくて困ってました 壁より高いとこから下に向けてやればいけますね ありがとうございます! 俺なら壁と床をきっちりオブジェクトごと分割してDictionaryに登録して プレイヤーの現在位置に近い床を検索してからその範囲で敵配置するかな。 床のどこに置くかは床の頂点を参照すれば良い。 rayだと階段がある建物に1000体みっちり配置したいとか プロシージャル的にやりたい場合は難しくなってくる。 raycastで配置なんて俺も初心者の時にやったが時間の無駄。 なんかさSceneビューでオブジェクト選択しても、Hierarchyビューのオブジェクトが開かない。 Inspectorでは選択状態になるけど、親子関係が自動で展開しなくなったんだけど、原因わかりますか? Houdiniでアセット作ってscatterで賢く点をばらまこう Unityのデモのアセットって無料で公開してるとかないの? Book of the Deadとかのシーン使いたい 初心者です。3Dマップ上でスプライトキャラを歩かせたいのですが、検索方法が悪いのか2dマップで歩かせるものしか出てきませんでした。 とりあえずスプライトの前後左右に歩くアニメーションは作れたのですが、それをどう適用すれば3D平面を歩かせられるのか分かりません。 参考になるHP等があれば教えていただけませんか? >>567 3Dの横スクロール的なイメージ? ペーパーマリオ的なイメージ? >>569 ありがとうございます! これはアニメーション適用の方法ではないので少し違いますが、当たり判定などもぜひ知りたかったので助かります >>570 ヒエラルキービューがロックされてるんじゃね 右上の錠前アイコンどうなってる? >>571 確かシェーダーで取得したカメラと平行になるように描画する処理あったと思う 敵キャラ複数体のHPデータを管理するのにdotsとかいうやつ使ってみたいんだが良い資料あるだろうか? Assets\preyer.cs(23,42): error CS1001: Identifier expected このエラーメッセージが出ていて、何となくプログラムのスペルミスみたいなことは分かるんですが、どこを直せばいいのか分かりません………… これがプログラムです…よければお答えしてくれると幸いです using System.Collections; using System.Collections.Generic; using UnityEngine; public class preyer : MonoBehaviour { public float speed = 1.0f; // Start is called before the first frame update void Start() } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.LeftArrow)) { if (this.transform.position.x > -4) this.transform.position += Vector3.left * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.RightArrow)) { if (this.transform.position.x < 4) this.transform.position += Vector3.right * speed * Time.deltaTime; Startのスコープがすでにおかしいし普通に}が足りないだけじゃないかな 赤線引いてるとこを右クリックしたらvisual studio先生が教えてくれるよ アセットバンドルを使ってアプリのUIの座標変更とかも反映できる? それともアプリ内で使うバイナリデータぐらいしか変更できない? アセットストアにログインするとき Chrome立ち上がってそこでログインして…って感じなんですが 面倒くさいです 設定で直接ログインできるようにできないですか 狩りゲー用の敵キャラのコライダーってメッシュコライダーとかのほうがいいのかな? >>584 そういうのは複数のコライダーで組み立てる方式で作るみたい MESHは意外と大木のでサークルとかにするといいよ 正確に当てる必要はないで 複雑で細かいメッシュよりも、積み木みたいなほうが軽いし部位破壊とか部位ごとの処理がしやすいからね コライダのことで横から質問なんですが 親オブジェクト>(子)ボディー>(孫)手 コライダあり>(孫)足 コライダあり みたいなの関係で当たり判定取る場合 手と足のオブジェクトにスクリプト貼り付けて判定とるんでしょうか? 親オブジェクトだけにスクリプト貼り付けて手と足の当たり判定取れたりしますか? >>590 部位にスクリプト付けたら簡単だな 攻撃側が食らい側のスクリプトを読み取って部位を判定する 食らい側にintでもstringでも識別できる変数を持たせておけばいい 「伺うな。命じよ」の原則は蔑ろにされるが >>583 昔はそうだった気がするんですが いつからかChrome開いてログインするようになってて なにか設定でもあるのかなと… アセットを買うならブラウザから行くしかないっぽいね。 買ったアセットをプロジェクトに取り込むだけなら当然Unityエディタだけで完結するけど 各部位にスクリプト付けると修正するときとか大変になってくるので自分は親で管理して各部位には当たった際に親にsendmessage送るくらいにしてたなぁ SerializeFieldでインスペクタに表示したBoxColliderに、 BoxColliderが1つだけアタッチされているオブジェクトならドラッグアンドドロップで問題なく設定できるんですが、 オブジェクトにBoxColliderが複数アタッチされてると、ドラッグアンドドロップすると、 設定したいのと別のBoxColliderが設定されてしまうのですが、どうすれば良いでしょうか? ドラドロしなくて右の小さい丸で選択できなかったけか? その丸押しても、「どのオブジェクト持ってくる?」って表示で、オブジェクトの中に複数あった場合、どれを選ぶかは選択できなくない? あまり知られてないがヒエラルキーではなくインスペクタのコンポーネントを個別につかんでドラッグ&ドロップできる >>595 俺は1オブジェクトにつき1コライダーでしか作ったことないな 複数コライダーを付けるメリットってあるのだろうか? 仮に1つのオブジェクトに丸いコライダ、四角いコライダの2種類付けたとして 結局OnTrigerEnterでどっちのコライダの当たり判定も呼ばれるから複数コライダって管理無理じゃない? >>598 それ今関係あります? >>599 例えば、四角形のステージに見えない壁を作るとか >>601 壁1個ごとに1つのオブジェクトで何が問題なのだろうか? >>601 はあ? オブジェクトについてるコライダーコンポーネントを個別に選択してアタッチしたいというのはまさに上でお前が言ってたことだろ? 初心者がまず一冊目に買う教本は 愛美の「Unityの教科書」が無難? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる