Unity : 移動を完璧に理解したい!
チュートリアルを真似していろんなゲームを作れるようにはなったものの、自分流にアレンジしようと思うと、いつも頓挫する。まず基本の「移動」からして、なんとなくうろ覚え。
Transform.position += Time.deltaTime みないなのを使うのかと思うと、別の人はAddForceというのを使っていたり、Rigibody.velocityというのが出てくるのもあるし、Vector3( 1.0, 0, 0) みたいなのもある。それのまわりにTime.deltaTimeがくっついている場合もあるし、transform.forwardというのもあったな・・・
要するにUnityを操る言葉使いは、一つしかないわけではなく、いろんな言い回しができるということらしい。人によって、あるいは、その時の目的によって、複数の言い回しが出来、その中から目的にあったものを的確に選ぶのが正しいようではある。
しかし、初心者としては、どれでもいいから「これだけは使いこなせている!」と感じられるものが欲しい。この方式なら、アレンジもできるというものが欲しい。
今日はそれを分かりたくて、時々お世話になっているこのサイトを見て学んでみた。
https://dkrevel.com/makegame-beginner/make-2d-aciton-move/
れいさんは解説が丁寧で、初心者でもわかるように書いてくださっているので、ありがたい。
transform.position で動かす方式と、Rigibody.velocity で動かす方式があって、どちらでも動かせるが、その時の目的によってふさわしい方式を選ぶのがよいとのこと。
当たり判定を付けたい場合は、だいたいRigibody.velocityを使っておけば、間違いないようだ。このvelocityの意味がよく分からないまま、今まで真似して使っていたが、これが動くスピードということらしい。
float xSpeed = 2.0f;
float ySpeed = 0.0f;
rb.velocity = new Vector2(xSpeed, ySpeed);
これをUpdate()関数の中に書くと、これでオブジェクトは動くらしい。
これをTransform.positionを使って書くと
Transform.position += Time.deltaTime ; とか
Transform.position = new Vector3(+2, 0, 0 ); とかになるのかな??(曖昧w)
Rigidbody.velocityを使う方式はだいぶ理解できて来たような気がする。
今日は、れいさんのサイトにあったスクリプトを真似して、オブジェクトがキー操作によって、右に動くというのをまず書いてみた。そのあと、少しずつアレンジを加えたバージョンのスクリプトをいくつか書いて、自分流にアレンジできるかどうかテストしてみた。
テストしてみたのはこれ↓
①れいさんのスクリプトそのまま、左右キーを押すと、左、右と動かせるもの。
②①に縦の動きも加えたもの。
③キー操作でなく、勝手に動くもの。
④③に更に手を加え、一定時間が経過すると今までと反対方向に動くもの。
⑤一定時間が経過するとランダムに上下左右(斜めも含む)に動くもの。
その記録は次の記事にまとめたい。
(こん)
ボスとの闘いの準備
いよいよ、ボス戦のシーンに取り掛かる時が来た。
どういう戦いのシステムにするかが、まず問題なのだが、ぽんさんと話し合いでは、
- シューティングのスタイル
- トップダウンのスタイル
- 横スクロールのスタイルなど、、、候補が出たが、
トップダウン風のものにしようということになった。自由自在にボスとキツネ君を動かすほどのスクリプト力もまだないわけで、できる範囲のテクニックでなんとかボス戦らしい雰囲気にして、いままでの「まっくら森」「花咲き森」よりは難易度が少しは高いものにしたいね、ということで話はまとまった。
しかし、その先、どういう攻撃にするのかが、まだ曖昧。投射物でお互いに戦うのが、今の私たちの実力では、ちょうど良いところ。斧や剣のような武器を振りかざして、ボスに切りつけるというのは、アニメーション的にも難しくなりそうだし、ちょっと残酷になっていまうのも、わたしたちの好みではない。
というわけで、ボスのテリトリーに脚を踏み入れると、ボスが岩の弾丸を投げつけてくるのを、かわしつつボスをやっつけるというのが、メインストーリーということに。
直接切りつけたり、殴ったりするのではなく、何か所かに配置されたボスのエネルギー源、絶つことで、ボスが動けなくなってゲームクリアにするか、またはその何か所かのポイントを全部タッチすることで、そのポイントを結ぶ線が現れて結界のようなものを形作り、その中にボスを閉じ込めることで、ゲームクリアにするか、、、そんな感じにしようかと今のところ考えている。
そして、今日はボスが岩弾丸を投げつけてくるのをかわすことができるようにバリアになるオブジェクトを配置するのを試してみた。大岩と切り株を配置して、それにコライダー2Dをつけて、それにぶつかった弾丸はそこでDestroy(GameObject);となるようにしてみた。
まあ、身を隠す場所はそんな感じでやればよいなと、手ごたえを得た。が、映像的には寂しい。ボス戦なのに、派手さが全くない。そこで切り株と大岩に「Barrier」といTagをつけて、岩弾丸が当たったもののTagがBarrierだったら、particleを発生させることにした。
パーティクルを発生させるやり方は、とんプログラミングさんのサイトを参考にさせて頂きました。
https://programming.sincoston.com/unity-oncollision-start-effect/
パーティクルはまだ研究をしていないジャンルなので、とりあえず基本のparticleをそのまま発生させることに。ほんとは一瞬でればよいので、ずーっと長くでる必要はないのだが、試しにやってみただけなので、今日のところはやれることが分かったので上出来!
まあわたしは今日はここまで。ぽんさんは、ボスのアニメーションとか進んだかな?(こん)
たぬきのセリフの2番がどうしても出続ける問題( ;∀;)
UIのCanvasの中に、吹き出しのイメージを入れて、それの子どもとして、6つのテキストを入れている。それがInvokeを使って、順番に表示される仕組みを作った。
これを再生してみると、text1 text2 までは順調に2秒間隔くらいでこちらの設定どおりに表示される。ところが、そのあと、text2はずっと居座りつづけ、text3 text4 text5 text6 が順番に表示されるのにかぶさる形で、表示され続けるではないか!!!
スクリプトはtext1からtext6まで、同じ調子で書いてあるので、なぜtext2だけが異常な動きをするのか、理解できない。
Invokeを使ったスクリプトの他に、elapsedTimeを使って途中から経過時間を計測するやり方も試してみたが、それでも2番が特別。2が呪われているのなら、ラッキーセブンの7に変更してみたらと、ゲン担ぎのようなこともしてみたが、それだとtext7が居座ることになり、結果は同じ。お手上げ状態。この数日それにかかりきりなのに、いまだ原因が分からず、停滞している。スクリプトは以下。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class FukidashiController : MonoBehaviour
{
[SerializeField] GameObject text1Text;
[SerializeField] GameObject text2Text;
[SerializeField] GameObject text3Text;
[SerializeField] GameObject text4Text;
[SerializeField] GameObject text5Text;
[SerializeField] GameObject text6Text;
// Start is called before the first frame update
void Start()
{
DisplayFukidashi0();
// CanvasFukidashi.SetActive(false);
Invoke("DisplayFukidashi1", 2.0f); // 関数 DisplayFukidashi1()を2秒後に実行
Invoke("DisplayFukidashi0", 3.0f);
Invoke("DisplayFukidashi2", 5.0f);
Invoke("DisplayFukidashi0", 6.0f);
Invoke("DisplayFukidashi3", 7.0f);
Invoke("DisplayFukidashi0", 9.0f);
Invoke("DisplayFukidashi4", 10.0f);
Invoke("DisplayFukidashi0", 13.0f);
Invoke("DisplayFukidashi5", 14.0f);
Invoke("DisplayFukidashi0", 15.0f);
Invoke("DisplayFukidashi6", 17.0f);
Invoke("DisplayFukidashi0", 18.0f);
Invoke("GotoMainScene", 19.0f);
}
void DisplayFukidashi0()
{
text1Text.SetActive(false);
text2Text.SetActive(false);
text3Text.SetActive(false);
text4Text.SetActive(false);
text5Text.SetActive(false);
text6Text.SetActive(false);
}
void DisplayFukidashi1()
{
text1Text.SetActive(true);//セリフ1 こんにちはぼくは
}
void DisplayFukidashi2()
{
text2Text.SetActive(true);//セリフ2 いつのまにか森にすみついた
}
void DisplayFukidashi3()
{
text3Text.SetActive(true);//セリフ3 だから森の木たちがおこって
}
void DisplayFukidashi4()
{
text4Text.SetActive(true);//セリフ4 このびんにはいったくすりを
}
void DisplayFukidashi5()
{
text5Text.SetActive(true);//セリフ5 きつねくん手伝ってくれない
}
void DisplayFukidashi6()
{
text6Text.SetActive(true);//セリフ6 ゾンビにおそわれて
}
public void GotoMainScene()
{
SceneManager.LoadScene("MainScene");
}
}
いつの日か、これのミスがわかるようになる日がくるだろうけど、、、。
早く解決したいものだ。
しばらくこの問題からは離れて、ほかの事をやってみようかな。(こん)
頑張った!!あちこちの不具合を修正できた(*^_^*)
この二日ほどで、いろんな問題点がみつかった「キツネくん森へいく」ゲーム。
その問題点を、かなり解決することができた。
問題1.
一昨日から急にフレームレートが爆上がりして、もともとはほわほわ飛んでいた蛍のような光がミサイルのように飛び回るようになってしまった問題。
フレームレートはGAMEが画面右上の「Stats」タブを開いて見ていたので、とにかくものすごい数字(900を超える瞬間もあり)になっているのは確認できていた。数日前まではそんなことはなかったのに、なぜこうなってしまったのかは謎のまま。しかし、解決策は見つけることができてその通りにやったところ、標準的な60という数字に落ちけることができた。
参考サイト https://ekulabo.com/frame-rate-time
こちらのサイトに出ていたコード↓をそのままコピーさせて頂いた。
void Start() | |
{ | |
Application.targetFrameRate = 60; | |
} |
これをFPS_Controllerというスクリプトを作って、これだけをペーストして保存。
そして、これを各シーンに入れたかったので、どのシーンにもあるメインカメラにアタッチしたところ、すべてのシーンのfpsが60前後で落ち着き、蛍もほわほわと飛ぶようになった。因みに、ProjectSettingのQualityの VSyncCountは Don't Sync にして、 左上にある表のチェックは全部外してみたが、フレームレートにはなんの変化もなかったので、これの意味はよくわからなかった。しかしスクリプトで指示するのが効果を発揮してくれたので、まあ良かった!
問題2.
画面が横長になっていたりシーンによってそろっていない問題。これはメインカメラの位置があっちゃこっちゃにあるようなので、それが原因かと推測。メインカメラはどのシーンでも触らずに、その中にうまく収まるように、シーンの方を拡大したり、場所を移動させることで、落ち着いた。シーンを作り始めるときは、メインカメラは常にポジションもスケールも同じにしようとポンさんと話あった。Z軸の位置は-10で。プレーヤーを配置するとVcamがプレーヤーをおいかけ、メインカメラもそれに従うのでXとYはそのあとは変化するのだと理解しているが、最初はメインカメラの位置を軸にしてオブジェクトを配置することに。ほかのシーンのオブジェクトをすべてコピーしてペーストしたようなときに、ずれたりしていたのかも。
問題3.
メイズシーンでゲームオーバーになった時に、ゲームオーバーというテキストを出した後、3秒してから、元の振り出し位置に戻されるようにしたかったのに、3秒待たずに元のシーンをリロードしていまう問題。これは、コードを書く場所が間違っていたことが分かった。
if (currentHealth <= 0)
{
//Debug.Log("体力ゼロ");
text1Text.SetActive(true);//ゲームオーバー、やりなおしのテキスト表示する
// Invoke(" GotoMazeScene", 3.0f );
//↑これだとシーン開始からの時間になるので使えなかった。
//時間の経過を計測し始める
elapsed += Time.deltaTime;
Debug.Log("経過時間は" + elapsed +"です");
if (elapsed > 3.0f)
{
GotoMazeScene();//Mazeシーンをリロードする関数を呼びだす。
}
}
アンダーラインの部分は、Updete()関数の中に入れなくてはいけなかったのに、ChangeHealth()関数の中に書いていたので、時間の計測ができなかったわけだ。
そしてStart()関数の中に、elapsed = 0f; を書き加えておいた。
因みにスクリプトの最初の部分に、 public float elapsed = 0.0f;と宣言してはあったが、Start()の中にも書いて初期化しておかないと、ダメだった。
問題4.
キャンバスのボタンにくるくる回るお花のアニメーションをくっつけて、ボタンにマウスが乗ったらActiveになり、マウスが離れるとFalseになるインジケーターとして利用したかったのに、最初からクルクル回るお花が見えてしまっていた問題。
これは新しいスクリプト、「IndicatorController」というのを作り、最初はFalseですよと書いただけ。
public class UIIndicator : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
this.gameObject.SetActive(false);
}
// Update is called once per frame
}
この単純なスクリプトをヒエラルキーにあるImage(Indicator)にアタッチするだけで、問題解決。
(こん)
キツネくんゲームに異変が!
一昨日からぽんさんが、東京にきたので、一緒に「キツネくん森へいく」ゲームを手直しなどしている。
普段、栃木と東京で別々に作業を進めているので、一緒に話しながらやれるチャンスはなかなかない。このチャンスにお互いに作ったパーツを組み合わせて一つのゲームにまとめるという算段でやっている。
昨日もタイトルシーン、Mazeシーン、お話シーンなど、かなり作り込んだ。
ところが今日そのプロジェクトを開いてみるといろいろ異変が😨
異変その1
シーンのサイズが昨日より随分横長になっている。二人共、そんなことしていないのに!夜中に小人さんでも来たとしか想えない。ゲームのアスペクト比を見ると、フリーアスペクトになっている。昨日は、違ったはず。
異変その2
フレームレートがおかしくなったのか???昨日、UIのマスクの子どものテキストが、ゆっくりスクロールしてだんだん見えてくる場面を作ったり、蛍のような光がシーン乃奈加をフワフワ飛ぶのを実装して、いい感じになっていたのに、今日みてみると、高射砲のようにビュンビュンとびかっていて、思っている動きと全く違うことになっている😫
異変その3
これは、スクリプトを別のプロジェクトからインポートしたためかと思われるが。スクリプトを開くと見たことのないエディターで拓けてしまう。これは、Edit>Preference>ExternalTool>Editerで、再度MicrosoftVisualStudioの連携をセットし直してなおったので、良かった👍
しかし、異変その1とその2はどう考えてても変!
その2に関しては、フレームレートが突然変わったとしか思えない。
ゲーム画面の右上Staticsを押して、fpsを見ながら再生してみた。
300~600くらいで、目まぐるしくフレームレートが変化している。たまに、100代や800代も混ざる。
試しに、前に保存してあった古いバージョンのを再生してみると、fpsは55~60くらいで途中で大きな変化は起きていない。ホタルもフワフワとんでいる。
これは、どうすりゃ直るんだ?
スクリブトで60に設定することはできると、ネットの情報には出ているが、今までそんなことしなくても、ほぽ変化しないフレームワークレートだったのに、、、、。
この異常なプロジェクトを苦労して手直ししても、また状態が突然変化したら、努力が水の泡になってしまうしな、、、。🤔
完成目前と思っていた、「キツネくん森へ行く」ゲーム、、足踏みというか、後退してしまった感。
(こん)
Tentacleがちょっと進化・・・これでいいのかな~?
さっき進捗をアップしたばかりだが、そのあとやっぱり気になって、いろいろやってみた。
テンタクルの端っこを透明度100%にして、色も2色のグラデーションにしてみた。
そうすると結構、Blackthornprodさんのテンタクルと似た感じに!(*^_^*)
気をよくした私、動画でBlackthornprodさんがやっていたよに、3本の尻尾にしてみた。
これはますますいい感じ!ゴクラクチョウの羽根のよう(見たことないけど)
さて、明日は、これもしょっちゅうYouTubeで動画を拝見して、元気をもらっている
ひろはすさんの初のブートキャンプにオンライン参加するのだ。
会場で参加したかったが、気づいたときはもう満員締め切りになっていてダメだった。
でもオンラインでも生でひろはすさんと一緒にUnityでゲーム制作できるのは、とても楽しみ(*^_^*)
(こん)