Notifications
bg
Yoshihiko Uchida
Interesting VR - Programmer
Tokyo, Japan
0
Likes
3
Followers
0
Connections
All
Articles0
Games0
Showcases0
Column0
Jobs0
みなさん、こんにちは!
Unityを勉強中のコロンビア内田です。

実はまだオリジナルゲームを作ったことがなくて、作ろう作ろうと思っては後回しになってしまっていました。

そこで「1時間でゲームの骨格を作る」というコンセプトのもと、もくもく会を開催することにしました。

渋谷のイベントスペースで8/17(金)19:30から開く予定なので、ご興味ある方は以下のURLから詳細ご確認くださいませ!

https://mokumokuunity.connpass.com/event/98050/


さいごに、tamtamさん、投稿許可いただきまして、ありがとうございます。
この初心者に温かいコミュニティを運営していらっしゃること、いつも尊敬しています!
これからも何卒よろしくお願いいたします。

コロンビア内田

Unity初心者の人たちが初めてオリジナルゲームを作るもくもく会 (2018/08/17 19:30〜)
## ごあいさつ Unityを学び始めて4ヶ月、作ったゲームはゼロ本、こんにちは、コロンビア内田です! 今回の企画は、Unityのことはなんとなく理解しているけど、いざ制作をはじめてみると、途端に萎えてしまう人向けです。 最近、萎えないためのコツを掴んできたので、特別に教えちゃいます。 ずばり…、必要最小限でゲームとして動くものを作る、ということです。 プログラミング全般における話ではありますが、最初からすごいものを作ろうとすると、現実とのギャップにやられます、自分はやられていました。 このギャップを埋めるためには、かんたんなゲームを作りまくることが重要だと最近気付きました。...
https://mokumokuunity.connpass.com/event/98050/
Yoshihiko Uchida
2 months ago
tamtamさんに来ていただければ、イベントもより一層盛り上がるかと思うので、ご予定合うときにぜひよろしくお願いいたします! それまでにもくもく会大きくしときます(笑)
tamtam
2 months ago
(ちなみに私はちょうど帰国の飛行機内・・・orz)
tamtam
2 months ago
みんなでもくもく、楽しんでください!
こんにちは。
2DRouguelikeチュートリアルについて質問させてください。
現在私は、MovingObjectという抽象クラスについて理解を深めている最中です。
下記のコードがどうしてもわからず、理解に苦しんでおります。。
お助けいただければ幸いです。

public float moveTime = 0.1f;
private float inverseMoveTime;

protected virtual void Start() {
.
.
inverseMoveTime = 1f / moveTime;
}

protected IEnumerator SmoothMovement(Vector3 end) {
float sqrRemainingDistance = (transform.position - end).sqrMagnitude;
while (sqrRemainingDistance > float.Epsilon) {
Vector3 newPosition = Vector3.MoveTowards(rb2d.position, end, inverseMoveTime * Time.deltaTime);
}
}

おそらく私は、MoveTowadsについての理解が浅いために、なぜ逆数を使うとより効率的な計算になるのかわかっていないです。
MoveTowardsは第三引数の最大移動距離をもとに、一定速度で移動するメソッドだと捉えておりますが、逆数にTime.deltaTimeを掛けている理由がいまいちつかめておりません。
10 * 0.016666(60frame/secondの場合)をすると、1秒間に60分割して10進むということでしょうか・・・?
また、moveTime = 0.1;というのは、本来であればどういった意味で使っているものでしょうか、0.1秒かけて移動を完了する…と理解しておりますが、そうすると頭の中がハテナだらけになってしまいます・・・><

曖昧な質問で申し訳ありませんが、ご回答いただけると嬉しくです。



該当チュートリアルURL)
https://unity3d.com/learn/tutorials/projects/2d-roguelike-tutorial/moving-object-script?playlist=17150

Moving Object Script - Unity
This is part 6 of 14 of the 2D Roguelike tutorial in which we write the MovingObject script which the Player and Enemy scripts will inherit from to share movement code.
https://unity3d.com/learn/tutorials/projects/2d-roguelike-tutorial/moving-object-script?playlist=17150
Yoshihiko Uchida
3 months ago
YASUHARAさん、slipさん、ご親切に教えていただきありがとうございます。 inverseMoveTime = 1.0f / 0.1f; こちらの式が下記の式のmaxDistanceDeltaに入ることで MoveTowards(start, end, inverseMoveTime * Time.deltaTime); - フレームが変わっても一定の速度でスケーリングする - 1.0fという移動距離を0.1fかけて行う この2点について理解することができました。 重ねてわかりやすく解説していただきましたYASUHARAさんにお礼申し上げます。
Yuji YASUHARA
3 months ago
〜ミス修正〜 誤>とはいえ生の0.1fでは調整しづらい 正>とはいえ生の0.2fでは調整しづらい 誤>そしてこの 0.1f には、結果的に、物理的な意味があります。 正>そしてこの 0.1f の逆数には、結果的に、物理的な意味があります。
Yuji YASUHARA
3 months ago
これはチュートリアルとしては不親切かもしれません。けっこう理解するのは難しいと思います。 Vector3 newPosition = Vector3.MoveTowards(rb2d.position, end, inverseMoveTime * Time.deltaTime); について、さいごの inverseMoveTime * Time.deltaTime の代わりに「小さな値(例えば0.2f)」つまり Vector3 newPosition = Vector3.MoveTowards(rb2d.position, end, 0.2f); こうしてもゲームは普通に動作するはずです。0.2fは「フレームごとの移動距離」になります。まずはこれで動くよね、と。 とはいえ生の0.1fでは調整しづらい、特にフレームレートが変わったときに動きが変わって欲しくない、ので何らかの式にしたいわけです。 とりあえず Time.deltaTime を使用すればフレームレートが変わっても動きは変わらないので、 Vector3 newPosition = Vector3.MoveTowards(rb2d.position, end, Time.deltaTime/0.1f); こうしてみよう。これでフレームレートが変わっても動作は変わらないね。 と、まあこのぐらいの理解で、先に進んで良いと思います。チュートリアルであらかじめ逆数を取っているのは、計算効率上の意味からでしょう。 そしてこの 0.1f には、結果的に、物理的な意味があります。slipさんのおっしゃる通り、速度です。 inverseMoveTime = 1f / moveTime; という式から、inverseMoveTimeは「1fという距離をmoveTime秒で移動するのに必要な速度」になります。(inverseMoveTimeという命名から、最初から速度を意図してはいないと思います) おそらくこのチュートリアルの、プレイヤーキャラクターの大きさが1fぐらいなのだと思います。きっと「自キャラぶんの移動距離を0.1秒で到達するように」調整されたことになるんでしょうね。
slip
3 months ago
こんにちは。slipと申します。逆数にするのは疑似的に速度として扱うためです。https://docs.unity3d.com/ja/current/ScriptReference/Vector3.MoveTowards.html
こんばんは!
ただいまUnityの公式チュートリアルの2Dローグライクをやらせてもらってるのですが、シングルトンについてわからないことがあったので、質問させてください。

参考URL: https://unity3d.com/learn/tutorials/projects/2d-roguelike-tutorial/writing-game-manager?playlist=17150

GameManager.csにて

public static GameManager instance = null;

void Awake() {
if (instance == null) {
instance = this;
} else if (instance != this) {
Destroy(gameObject);
}
DontDestroyOnLoad(gameObject);
}

上記のコードでシングルトンの実装をしているかと思いますが、else ifの処理が理解があやふやなので、教えていただきたいです。

私の理解はこうです、まずinstanceがnullのとき、というのはすなわち1回目にAwakeが呼び出された時のことで、thisをinstanceに代入しています。この1回目にAwakeが呼ばれたときのthisこそ、シングルトンによってずっと保持したいインスタンスです。その後すかさず、DontDestroyOnLOad(gameObject)でシーンをまたいだとしても、このスクリプトがアタッチされているゲームオブジェクトは消さないでねとしています。そして2回目以降にAwake()が呼び出された場合、1回目でinstanceに代入されたthisとは違うものなので、もしそうならGameManagerがアタッチされているゲームオブジェクトは削除してくださいね、という意味かと思います。
これによって最初に生成されたGameManagerがアタッチされているゲームオブジェクトは永続的に生きることができる…という解釈をしています。

こんな感じの解釈であっていますか…?

また、InspectorでDebugモードにするとinstanceIDというものがありますが、これがスクリプトでいうところのthisが指すものということでしょうか?

もし間違っていたらご指摘いただけると嬉しいです!

Yoshihiko Uchida
4 months ago
たむたむさんへ かなり理解が深まって助かっています。 書いた条件がすべて実行される…と頭の中で知らぬ間に認識してしまして、どうもinstance != thisが成立する条件がぱっとしなかったのですが、このチュートリアルでは呼ばれないということで…ハッ、そうか、呼ばれないというパターンもあるんだったと気付かされました。 教えていただきありがとうございます><!
tamtam
4 months ago
Yoshihiko Uchidaたむたむさん、毎度お世話になっております! なるほど、this = classということでしたか、そこらへん理解が曖昧だったのでわかりやすく教えていただけてよかったです、ありがとうございます。 このinstance != thisという部分がまだ解像度が低く、、 instanceにはthisが入っている状態でGameManagerのAwakeが呼ばれた2回目以降でinstance != thisに飛ぶと思うのですが、instanceがこのクラス自身ではなかった場合とは、どういうときを想像すればよろしいでしょうか。 1回目と2回目のAwakeでthisが指すクラス自身とは、IDのようなもので管理されていて、1回目のIDとthisが違っていたら破棄する・・・ということですか…?
まずAwakeは、そのゲームオブジェクトがゲームシーンで生成される際に一度しか発生しません。ではinstance != thisのほうが呼び出されるのはどういう時かと言うと、GameManagerスクリプトが付いたゲームオブジェクトが再度生成される場合、たとえばInstantiate(【GameManagerスクリプトが付いたゲームオブジェクト】);をもう一度実行した時などです。 ちなみに2D Roguelikeの完成プロジェクト(_Complete-Gameフォルダ)では、instance != thisが呼び出されることはないので、Loader.csでInstantiate(gameManager);をもう一行追加して実験してみると分かると思います。その際、if文に{}が無いので追記しておきましょう。また、GameManager.csにDebug.Logを仕掛けておいて、どこが呼び出されているかをコンソールで眺めると分かるかと思います。
Yoshihiko Uchida
4 months ago
たむたむさん、毎度お世話になっております! なるほど、this = classということでしたか、そこらへん理解が曖昧だったのでわかりやすく教えていただけてよかったです、ありがとうございます。 このinstance != thisという部分がまだ解像度が低く、、 instanceにはthisが入っている状態でGameManagerのAwakeが呼ばれた2回目以降でinstance != thisに飛ぶと思うのですが、instanceがこのクラス自身ではなかった場合とは、どういうときを想像すればよろしいでしょうか。 1回目と2回目のAwakeでthisが指すクラス自身とは、IDのようなもので管理されていて、1回目のIDとthisが違っていたら破棄する・・・ということですか…?
tamtam
4 months ago
"this"の理解の仕方が少し違います。この"this"が指しているものはGameManagerというゲームオブジェクトではなく、GameManagerというスクリプト=クラスの方を指しています。そして、変数・instanceはstatic宣言されていますので、instanceはゲームシーン内で共通の1つの存在になる、・・・厳密には変数の中身はインスタンスではなくクラス自身とも言えます。つまりゲームシーン内で1つしか存在できないinstanceがnullなら自分自身=GameManagerスクリプト(クラス)を代入し、すでにクラスが代入されていたらその(GameManagerスクリプト・クラスが付いている)ゲームオブジェクトを破棄する・・・というのが流れです。
いまSurvivalShooter Tutorialをやっているのですが、PlayerShooting.csのUpdate()の中に書いてあるTime.timeScale != 0 はどういった意図で付けているかわかりません。

調べたところ、スローモーションにしたり一時停止する際につかうプロパティだ
ということがわかりました。が、今回の場合だと、一時停止する処理はないかと思うので、質問させていただきました!

Yoshihiko Uchida
4 months ago
あらま! ESCキーでメニューが開くのですね! たったいまSurvivalShooterのチュートリアルを完了しましたが、最後まで気付きませんでしたw 教えていただきありがとうございます! たしかにそれならTime.timeScale != 0の意味が腑に落ちました、あーすっきりです!
Tatsunori IshibashiTime.timeScaleを0にするのは、Pause処理を実装するときが多いです。
送信されちゃいました。続きです。 実際に、SurvialShooterでも、ESCキーを押すとポーズになります。 そこで、Time.timeScale != 0の処理を外して、ゲームを動かしボーズしてからマウスクリックしてみると、 ポーズ中なのに弾が撃てるバグが発生してることが確認できると思います。
Time.timeScaleを0にするのは、Pause処理を実装するときが多いです。
GameOverしたあとのシーンの再読み込みについて質問があります。

現在SpaceShooterとSurvivalShooterを学習して、銃々チュートリアルを進めさせていただいているのですが(わかりやすいチュートリアルありがとうございます)、GameOverになったあとに

Application.LoadLevel (Application.loadedLevel);

として、現在のSceneを読み込んでいますが、現在だとObsoluteしているとの表記だったので

using UnityEngine.SceneManagement;

SceneManager.LoadScene("Main");

としつつ、BuildSettingsからMainを読み込ませているのですが、この方法は正しいでしょうか?

Yoshihiko Uchida
4 months ago
合っているならよかったです! ちょっと前にでたチュートリアルなのに、全然エラーが出ないので、たとえUnityのバージョンが4系でも物怖じせず進められそうです。 バージョンごとの差異を吸収して、いまはこれが使えるからこれはNG!みたいな、知見をどんどん溜めて適切に使っていきたいです:)
tamtam
4 months ago
はい、合ってます! Unity5.3から入った仕様なので、Unity4系のチュートリアルだと残っちゃっているんでしょうね。すいません・・・。
こんにちは!
tamtamさんのTwitter投稿をみて、これだ!と思い参加させていただきました。
最近はUnityのチュートリアルをやったりしています。
挨拶代わりにRoll-A-Ballを改造した動画を貼り付けておきますね!笑
まだまだ初心者の域をでませんが、tamtamさんに褒めてもらうためにがんばります。

Yoshihiko Uchida
5 months ago
tamtamここまでのコースを想像するクリエイティビティはすごい! このコミュニティに投稿してもらって本当に感謝です!
はじめてそんなこと言われました。 最高の気分です!
Yoshihiko Uchida
5 months ago
ゆに丸1号こんにちは!魔改造されてますね。素晴らしいです!背景や階段等は ProBuilder を使ってモデリングされたのでしょうか??
まだまだ使える機能やテクニックがたくさんあると思うので、精進していきたいです!
Yoshihiko Uchida
5 months ago
ゆに丸1号こんにちは!魔改造されてますね。素晴らしいです!背景や階段等は ProBuilder を使ってモデリングされたのでしょうか??
ですです!
tamtam
5 months ago
ここまでのコースを想像するクリエイティビティはすごい! このコミュニティに投稿してもらって本当に感謝です!
About Me
No description
See more
Skills
No skills added yet
Certifications (0)
Import
See all
Yoshihiko Uchida's liked projects (2)
Following (1)
Followers (3)
Following Companies (0)
Not following anyone yet