【ゲームエンジン】Unity初心者質問スレBuild1
■ このスレッドは過去ログ倉庫に格納されています
フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。 プラットフォームサポートは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質問スレッド35
https://mevius.5ch.net/test/read.cgi/gamedev/1523771570/ >>378
解説本はその解説本が対応しているバージョンのUnityで行いましょう >>378
一番最初というと
[SerializeField]「Animator」 animeData;
という部分ですね
恐らくで申し訳ないがこれは
animeDataというAnimator型の変数を定義していると思うので
[SerializeField]
Animator animeData;
でいいかと思います
その次のfloat定義も
float minPoint = -2; てなってますし。 >>372
すみません、空オブジェクトのUpdateでは無く、
FixedUpdateである方が良い理由を教えてください。 >>379
>>380
回答ありがとうございます
参考にしつつ手順の漏れがないか最初からやり直してみます [SerializeField]ってことはインスペクタでanimeDataを指定しないといけない
たぶんぴーたんをドラッグドロップするんだろう >>381
フレームレート60に設定するとfixedupdateは秒間60回呼ばれる
updateは何回呼ばれるか決まってない
昔のゲームプログラムはフレームレート固定だったので
昔風に書くならfixedupdateがおすすめ >>381
大体固定だからじゃない?でも多分両方必要だとおもうよ。 >>384
でも、描画フレームとは同期できないから使い勝手悪いぞ
素直にUpdate使う方が楽 >>384
もうひとつ付け加えると、FixedUpdateはスレッドで動いてるわけじゃないから、Update(描画フレーム)が処理落ちすると、1フレームに複数回呼ばれるし、その逆もまたしかりなので、結構めんどくさいよ >>381
Updateで昔ながらの60fpsをやるなら、まずコードのどこかでApplication.targetFrameRateに60を設定する
メニューからQuality SettingsのVSync CountをDon’t Syncにする
同じくメニューからTime ManagerのMaximum Allowed Timestepを1/60にする
これでほぼほぼUpdateが60fpsになるはず >>387 >>388
え、、、じゃあUpdateの方がいいんですかね
fixedupdateはPhysics(Physics2D)系以外を呼ぶなって書いてもありました。
>>389
じゃあUpdateの方がいいんですかね
どうすればいいのか頭が混乱してます。
とりあえず、作ってみないと、、
簡単なものから組み立ててみます。 unityでこれって正解はそうそうないからな
みんな自分がうまく行く方法を教えるから意見がぶつかり合う
んで一番割りを食うのはそれを見て学ぶ初心者ってことだなw 専門学校でゲームプログラムやってて、卒業後から最近まで業務システムやってたって人がいるんだけど、昔ゲームプログラムやった人はUnityは結構混乱するらしいな。
そのおっさんはゲームと思わない事がコツとか言ってる。
Unityでやるなら昔の事は忘れた方がいいみたいな気がするわ。 Unityがデフォで提供する可変フレームレートの仕組みのところで、そんなにやり方が分散するとは思えんな
https://docs.unity3d.com/Manual/ExecutionOrder.html
↑ここの下の方の流れ図を見てみ
FixUpdateはUpdateよりも実行される頻度が多い(FixUpdateの所で矢印がぐるぐる回っている)
Updateは描画(Rendering)前に呼ばれる
Updateには描画時のみに必要な処理を書く。つまり、描画コマ落ち時には呼ばなくても良い処理を書く。例えば条件に応じて色合いを変えたりとか。
Updateが固定フレームで呼ばれるようにするのは愚の骨頂だぜ
公式が何のためにわざわざUpdateを分離してくれたと思ってるんだw
>>392
上のWebページの図の流れは、FixedUpdateがフレーム当たり何回も呼ばれる所以外、昔からのゲームの流れそのものなんだが ×FixUpdate
○FixedUpdate
>< >>393
やだなぁ、そんなに上から目線で言わなくても、俺よりみんなの方が出来る人達なのはわかってるって。
昔ながらだと、メモリ配置どうなってんの?から始まるみたいだし。 393が言ってる通り、updateら辺はお決まりだべさ
updateの頻度に関してはupdateのが多い場合がある、ってか、60fps行ってたら、デフォのfixed updateより遥かに頻度は高い。
問題は用法で、 updateはベストエフォートで実施されるから時間が適当。
例えフレームレート固定にしても、結構適当で1秒辺り処理される回数も結構適当。
一方fixed updateはバチっと固定秒を監視してるから固定秒間隔で実施出来る。んで、一秒辺りに処理される回数は決まってる。
1秒辺り何回やっても良い事務処理は updateで。
1秒辺り変化して欲しい量の加算や力の積み上げに関する処理はfixed updateでやると正確な回数処理されるって所かな。まあ、addforceとpositionの加算はfixed updateでやっとけばok >>396
嘘教えるなって!
Updateの処理が重いとfixedUpdateは待たされるから固定秒間隔なんかで来ない
じゃあ、fixedUpdateがなんのためにあるかっていったら物理演算のためだよ
Unityに入ってる物理エンジンはある時点でのスナップショットで判定してるから経過時間が等間隔じゃないと正しく判定できないから擬似的にその状況を作ってくれてるだけ うおおおおおおおおおおおおおおおおお
、、、結局、誰の認識が正しいのですか!? >>397
俺ら初心者スレの猛者達がFixedUpdateを遅らせるような事する訳ないだろ。 >>398
固定フレームレートでやりたいなら、自分で時間見てやりなさい、ってとこかな。Unity公式で紹介されてたなんかの弾幕ゲーはそうやってたよ。 >>398
知識披露したいだけの奴らだから無視してればいい
バグがでて必要になったら覚えりゃいいだけ >>399
実際にUpdateが処理落ちしてるときにFixedUpdateが呼ばれる間隔を計測してみ
等間隔なんかで来てないから
あと余談だけど、昔のゲームはVシンクに同期して作ってるのが多いから処理落ちするとスローモーションみたいになるけど、FixedUpdateだとフレームスキップしたようになる >>398
手っ取り早く、>>389でいいよ。
他のやり方は、他の仕様との兼ね合いとか考慮する事もあるので。 >>398
習うより慣れろ精神で、まず作りましょ
んで何か不具合、またわからないことが出てきたら、具体的に聴けばいいかと 操作に対して移動を優先するか
遅くしてもグラフィックを描画するかはゲームの設計思想の問題
どっちが正解とかない この方の最新ツイート(8/8付)動画の40秒以降のぐるぐる回りながら形が戻っていく動き、どうやって作るんですか?
https://twitter.com/Makan_Gilani
https://twitter.com/5chan_nel (5ch newer account) >>406
パーティクルで、発生位置がメッシュかな。パーティクルはオブジェクトな。
透明なスキンメッシュのオブジェクトがアニメしてて、メッシュの頂点から発生させてるって所か。
最近だとvelocityに回転つけられるんで、それも合わせりゃいいかと >>406
Houdiniでも使ったんかと思ったがProcedural Animationsだけで作ったと書いてある
スクリプトでtransformの制御だけで作ったようだね
恐れ入るよw >>407
>>408
ありがとうございます、やれるだけやってみます。 Raycastについて質問です。
rayを飛ばして当たったオブジェクトの情報を取得することは出来たのですが、ヒットしない場合、指定したY座標に到達した時のXZ座標を取得するにはどうすればいいですか?
例として高い位置(動的)から斜め下にrayを飛ばしてYが0の地点のXとZを取得したいです。 >>410
さくっと考えてみた
d = レイの始点.y ÷ レイの向き.y
p = レイの始点 + レイの向き × -d
これで出来たりしないかな? でっかい地面、四角をおく。
レイと似たようなほっそ長ーい、オブジェクトを用意してそれをカメラの子供にして、z軸をレイと同じ方向で座標調整。
あとは、このオブジェと地面の交点をコリジョンのコンタクトポイントで取得すれば出来上がり。 3次元空間の方程式で解けるんじゃないかね
高校数学だな
覚えてないが まあ、もともとレイキャスト使ってるわけだし、素直に平べったいでかいボックスコライダー敷いて、それとの交点拾った方が楽かもね 現在地(X0,Y0,Z0) 直線の方向(l,m,n)
X=X0-l*Y0/m
Z=Z0-n*Y0/m
あってるかどうかは知らん 410ですありがとうございます
最初412のようなこと考えたんですが、とてつもなく大きくしないとヒットしない場合が出てくるのでやめて、タンジェント使って実現できました
ですが、逆にy0座標を入れた変数の方を基準として操作してもう1つの方も動くようにしましたごめんなさい スクリプトから生成したオブジェクトにアタッチしてるスクリプトのstart()内でtransform.positionに値を入れるのが効かなくて、update()内でやると効くというような現象が起たのでググったら1件バクという記事があったんですが、そんなバグありますか?
スクリプトの読み込み順は生成元を優先にしてます
解決法わかる方いましたらよろしくおねがいします 生成元のInstantiateの直後に生成元でそのオブジェクトのtransform.positionに入れると効くので上書きはしてないと思うんですよね
両方それぞれのメソッドでDebug.Log入れて見てみたんですけど、ファイル実行の優先順位を設定してても、その中のメソッドの処理のタイミングがバラバラで上手くいってない気がしました
がまだ解決はできてません バグという記事のurlよければください
再現できるか確認してみたいと思います 抽象的なこと書かれても誰もどうすることもできんぞ
自分で解決しろとしか Startの綴りが間違ってるとかそんなんだったら笑う 俺は親オブジェクト指定してなくてローカル座標のつもりがワールド座標になってたりその逆だったりならたまにある。 ・unityで、コンビニで買えるプリペイドで購入する方法ありますか?
・DynamicBone ですが、フリー版で似た機能を使えるプラグインとかありますか? 2000x2000とかの大きなterrainだと、遠くの山が描写されず、近づくと表示されて気持ち悪いんですが、描写される距離を設定で変えたりできますか?
木や草を描写する距離などはterrainの設定から出来るんですが、terrainそのものの描写する距離を変える設定が見つかりません テレインのインスペクターの、far、miniだったか?の値を変える。 テレインのインスペクターって、インスペクター上の歯車マーク(terrain settings)のところですよね?
そのfarがないんですよね
unityのバージョンは20182.2f1です 剣を振った時にプレイヤーの前にコライダを出して当たり判定をを作ったんだけど、剣をふってないときにコライダを引っ込めるスクリプトが分からない、誰か助けて 出せたなら、その反対をやればいいと思うけど、出したコ一ドはどんなコードですか? コライダーって出したり引っ込めたりするもんなのか? プレイヤーの前方に当たり判定のコライダとなるこのスクリプトをアタッチしてて
public class AttackController : MonoBehaviour {
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "Enemy")
{
Destroy(coll.gameObject);
Debug.Log("hit Object");
}
} プレイヤーコントローラーのスクリプトは下のスクリプトで右クリックでアタック時にSetActive
でコライダを表示するようにして敵を攻撃する当たり判定にしてるんだけど、一回攻撃するとコライダ出っぱなしになる
消すように色々ためしたけど上手くいかない、アドバイス頼みます
public GameObject AtariHantei;
void Update()
{
//アタック
if (Input.GetMouseButtonDown(1))
{
this.animator.SetTrigger("AttackTrigger"); //アニメ再生
audioSource.PlayOneShot(AttackSE, volumeSE); //AttackSE
AtariHantei.SetActive(true); //コライダon
} 詳しくはわからんけど根本的にやり方間違ってそうな気がするな >>440,441
とりあえず、そのスクリプトを生かしてコード書いてみました
現状ではコライダーをオフにするコードがないので、コライダーにぶつかった際にオフにするという通知をします
public class AttackController : MonoBehaviour
{
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "Enemy")
{
Destroy(coll.gameObject);
Debug.Log("hit Object");
transform.parent.SendMessage("SetOffAtariHantei");
}
}
で、プレイヤーには
void SetOffAtariHantei()
{
AtariHantei.SetActive(false); //コライダOff
}
を追加します
プレイヤーとあたり判定は親子関係にしました
https://i.gyazo.com/d55a5010816e8b2f99b0db403835c96e.png
https://i.gyazo.com/ae2fefe26576b05fecbc233346631b42.png
これで敵を2対置いて、ミギクリした場合としない場合で判定がちゃんとされます
https://imgur.com/a/HCi2D6J あぁテストする際、
void Start()
{
SetOffAtariHantei();
}
に入れて最初は通過、その後クリックで当たるとした方が分かりやすかったかもしれません>< なんで出っぱなしになって困ってる判定を敵にあたったら消すように改修すんの?
剣を振るアニメーション終わった後にとことこ敵の前に歩いていったら攻撃があたんの?
亜空間攻撃とはなかなか見ないゲームだな
どんなゲームかわからんけど普通は一定時間後にオフにすればいい
SetActive falseで消えることはわかってるだろうから一定時間後にその処理を呼ぶようにすればいい
一定時間後に処理を走らせる方法はいろいろあるからググって
わかんなかったらまた聞いて >>444
知らなければ答えなければいい
とか言って他人を煽るんだったら正しく答えてくれません?
なんで初心者が迷うような回答をいつもするんですか? >>441
アニメーションイベントを使うといいよ
具体的なメリットはアニメーションの好きなフレームでコライダーのオンオフできるところ
現状だと、例えば剣を振りかぶる動作の途中なのに敵がダメージ食らったりしてると思う
詳しくはウェブで!!
https://gametukurikata.com/basic/animationevent <<442
>>443
ありがとうございます
攻撃→コライダ出る→敵に当たる→コライダ消えるって感じなので、攻撃を空振りしたあとに
敵に当たるまでコライダ出っぱなしになるんだけど、これはどうすればいいの?
そもそもこの攻撃の当たり判定の仕方は根本的に間違ってるの?入門本三冊持ってるんだけど
どれにも攻撃の当たり判定は載ってなかったからネット検索してやってみたんだけども
アニメーションイベント使ってやった方がいいのだろうか?ちなみに本にはアニメーションイベントのやり方は載ってなくて
ググってみたけどよく分からなかった >>445
>>447
ありがとうございます、一定期間後の処理で出来るようになりました。
アニメーションイベントもわからないので調べて出来るようになろうと思う
void AtariKesu()
{
AtariHantei.SetActive(false);
}
void Update()
{
//アタック
if (Input.GetMouseButtonDown(1))
{
AtariHantei.SetActive(true); //コライダon
Invoke("AtariKesu", 0.3f);
} >>448
間違い。
@コライダー出す→コライダー消す
Aコライダーに当たる、
@Aの判定は別で処理すべき。
Aで当たった判定を@に渡して、途中で消す作りにすべき。 raycastのrayって判定がけっこう曖昧になったりすることありますか?
マウスが乗ってるとこのterrainの座標を取得するのは問題なく出来てるんですが、xz座標を指定して高い位置から真下に飛ばしてヒットしたy座標を取得しようとすると取得できたり出来なかったり違った値が入ったりするんですが
少し感じたのはinfinityにするとしても発射位置を少し高くすると反応しなくなったりしてます >>449
アニメーションEventは一回わかると結構簡単だ
public void AtariKesu()のスクリプトをつける
アニメーションのEventにAtariKesuを入れるとそのコマに来たら呼び出してくれる >>451
曖昧になったと感じたことはない。
私は、な。 >>449
はじめて自分でアニメーションまでつけてやってみた
結構めんどくさかった
剣にコライダーつけてisTrigerをオン・オフにするようにした
コライダーのisTrigerのチェック入れておく(オフの状態)
public Collider2D coll2;
void Start () {coll2=GetComponent<Collider2D>();}
public void collOn(){coll2.isTrigger=true;}
public void colOff(){coll2.isTrigger=false;}
void OnCollisionEnter2D(Collision2D col) {Destroy(col.gameObject);}
あとは剣のanimationで振り始めにEventをつけてcolOnを選んで
振り終わりにcolOffを選ぶ >>452
>>455
ありがとうございます
自分もそれで試してみようと思う 上達するにはチュートリアルやれとしか言われないのですが、
あの数をやり終えてる人はなかなかいないと思います。
興味あるチュートリアルをやっているのか、好きなゲームを作って学んでいるのか、
皆さんはどうやって上達、脱初心者をしたのですか。 聞いたところで何になる?
とにかく作る事。
作りたいものがあれば、それに必要なアルゴリズム、ロジックを構築する、その為にそこをしらべる。
これの繰り返し。 >>457
初心者スレでそれ聴かれても
自分はずっと初心者でいいかなと思ってますよ >>457
チュートリアルはroll a ballしかやらなかったな
その後は作りたいゲームの案から比較的簡単なやつを選んで作っていった
上達の秘訣はググり力だと思うよ
リファレンスを眺めて思いを馳せるのもいいかもしれない 敵がプレイヤーに向かってくるスクリプトはできたんだけど敵の進行方向にspriteを左右に反転させるコードがわかりません
分かる方いたらよろしくお願いします。
public class Chase : MonoBehaviour
{
public GameObject Player;
public float Speed;
void Update()
{
this.transform.position = Vector2.MoveTowards(this.transform.position, new Vector2(Player.transform.position.x, Player.transform.position.y), Speed * Time.deltaTime);
}
} void Update()
{
Vector3 prePosition = transform.position;
this.transform.position = Vector2.MoveTowards(this.transform.position, new Vector2(Player.transform.position.x, Player.transform.position.y), Speed * Time.deltaTime);
if(transform.position.x - prePosition.x >= 0){
transform.localScale.x = 1;
}else{
transform.localScale.x = -1;
}
}
こんな感じでどう?
2Dやったことないけどねw すまん横着した
こっちで
void Update()
{
Vector3 prePosition = transform.position;
this.transform.position = Vector2.MoveTowards(this.transform.position, new Vector2(Player.transform.position.x, Player.transform.position.y), Speed * Time.deltaTime);
Vector3 scale = transform.localScale;
if(transform.position.x - prePosition.x >= 0){
scall.x = 1;
}else{
scall.x = -1;
}
transform.localScale = scale;
} >>466
かなり当てずっぽうで書いたところはあるが…
まあできたのなら…
個人的にはscaleを1倍固定にしてるのが後々問題になりそうな気がするが
そのときはそのときで… あるアニメーション付きのアセットをいじって思ったのですが
歩くアニメーションクリップがありまして
ローカルの座標を歩いてます
そしてスクリプト上からも位置を更新して歩かせているのですが
そうしますと
アニメーションクリップの初めと後でローカル座標をいったり来たりして
グローバル座標の移動も加わって
引き戻されてワープするような歩き方になります
これはモデルだけ使ってこのクリップは使わないほうがいいのでしょうか >>467
いや助かりました、ありがとうございます
素人すぎてどういう問題がでるのか想像できないけど、今のところは大丈夫そうです >>468
その場で歩くモーションないの?もしくはそういうふうにアニメーションを修正できないの?
だとしたらそのアニメーション使うのを諦めるか、アニメーションの終わりを捕まえてそのタイミングで座標を更新するかじゃないかな
後者は相当シビアにやらないと瞬間移動しそうだけど >>470
ご回答ありがとうございます
3Dアニメーションってそういうものなのですね
わかりました
その場で歩くモーションにしてくれたほうが簡単でやりやすい気がしますけど
本格的なゲームを作ろうとする人には
歩き終わるフレームの位置を取得するほうが自然なんですかねえ >>471
いや、普通はその場で歩くモーションで作るよ
モーション終わりを捕まえるのは超苦肉の策だと思って
歩く速度が少し変わったらアニメーション全部修正なんてやってられんでしょ >>469
例えば、このモンスターは大きさ10倍だぁ!!
みたいなときにね、まあ、困れ
>>468
諦める前にAnimationの設定で
Root Transform Position(XZ)項目のBake Into Poseに
チェックが付いてるはずだから外してみてくれないかい?
https://imgur.com/8ToZoar.jpg >>473
ありがとうございます
たしかにclipのほうにはその設定があります
それをいじればたしかにその場で動かすことも可能になりそうですね
Based UponでCenter of Massにすることもできるのですね
しかしRigをHumanoidではなくRegacyでやっているため
アニメーションタブにはその設定は出ないようです
UNITY 逆引き 300の極意という本の
アセットでZombie (Zombie Draft)というフリーのものでやってるんですけど
まだ当方UNITYの3Dについてあまり勉強していないため
アニメーションの読み込みについてよくわかってないので
とりあえずどんなものか知ってみたくて質問しました
何かを作ってるわけではないので
動作の修正を完了できていませんが良しとします >>100
ちと、これは、、、って感じですよね。
If で係数算出だけって言うのが頭整理出来てないって言われちゃってんだよね。
普通はそこで値算出までもっていって最後にposition にぶつけますよね。そしたらdirなんて変数無くせますよ
BASIC と同じ構造化の考え方なんで、このブロックは何をしたいって意識して書いたら良いと思います。
この位のステップで混乱しちゃダメで、もうちょい頭を整理してから臨んで見よう〜 スキンメッシュのキャラクターの肌表面に汗や血を流させるようにしたくて
試行錯誤していますがうまく出来ません。何かやり方がないでしょうか?
Textureを動かすと部分的にはそれっぽい表現ができますが、元モデルのUVマップに
方向が依存するので今一つです。キャラクターの腕と足で流れる方向が違ったり。
液体系のアセットなども見てみましたが、あまりよくわからず、購入にも踏み切れません。
どなたかご教示くださいー ■ このスレッドは過去ログ倉庫に格納されています