転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

Unityでプロジェクト作成時に出るエラーを解決!Collab service is deprecated and has been replaced with PlasticSCM

Unityでプロジェクトを作成すると、「Collab service is deprecated and has been replaced with PlasticSCM」というエラーが大量に吐かれまくったという経験をしたことは多いのではないでしょうか。

原因としては、Unity Teamsのバージョン管理コンポーネントのUnity CollaborateがUnity Plastic SCMにアップグレードされるため、Unity Collaborateは廃止になるというお知らせです。

Unityのバージョン管理はGitで行っているので、自分はどちらも使いません。とりあえずエラーを止めたいと思ったら、対策方法は色々出てきました。

qiita.com

qiita.com

数ある対策方法の中で、自分が取った対策はこれです。

Project Settings / サービス / Collaborateを開き、Collaborateをオフにする。

どの方法も手間などは大差ないと思いますが、これだとUnity Editor内で操作が完結するので自分はこの方法で対処したいと思います。

時間経過によるイベント処理を簡単に実装する - コルーチンの活用法

Unityでゲームを作る際、自分は時間経過があるイベントが欠かせません。
例えば、RPGで敵を倒した1秒後に報酬品をテキスト表示するなどです。

このような時間経過のイベントには、コルーチンを使います。
ですがこのコルーチン、自分はいつも使い方を忘れてしまいます。
docs.unity3d.com
毎回調べるのも面倒なので、メモとして残しておきます。

コルーチンの使い方

時間経過が必要な処理を書く場合、戻り値の方をIEnumeratorを指定します。
また、yieldも必ず記述が必要です。

IEnumerator ShowMessage() {

    yield return new WaitForSeconds(1.0f);
    finishMessage.gameObject.SetActive(true);
    finishMessage.text = "あなたのゴールタイムは\n" + tc.timerValue.ToString("N2") +"秒です";

    retryButton.SetActive(true);

}

この処理では、ShowMessageメソッドが呼び出されたら、1秒待ってからfinishMessageオブジェクトが有効となり、テキスト表示が行われます。
秒数指定をyield return new WaitForSecounds(1.0f)で行っています。


次に、ShowMessageメソッドの呼び出し方にも注意が必要です。

StartCoroutine(ShowMessage());

このように、StartCoroutineメソッドの引数に呼び出したいメソッドを指定する必要があります。

コルーチンの停止方法

コルーチンをスタートさせたら、止めたい場合もあると思います。
その時は、StopCoroutineを使います。

StopCoroutine(ShowMessage());

StopCoroutineは止めたいコルーチンを引数に指定していますが、複数のコルーチンをまとめて止めたい場合はStopAllCoroutinesを使います。

StopAllCoroutines();

docs.unity3d.com
docs.unity3d.com

自分の場合は、ここらへんを理解できていればゲームを作りで困ることはありません。

レースゲームで、スタートと同時に時間カウントアップの計測を開始させる方法について

unityroomに投稿した以下ゲームですが、車を操作するゲームです。
unityroom.com
車を操作するスクリプト自体はよくあるものなんですが、車をスタートさせると時間カウントアップを開始させるようにしました。
今後のために、メモとして残しておきます。

車の制御について

private void Update() {

    float steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime;
    float moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;

    transform.Rotate(0, 0, -steerAmount);
    transform.Translate(0, moveAmount, 0);

}

steerAmountが曲がる速度、moveAmountが直線の速度です。
こういった移動関連の実装では、Time.deltaTimeを使うことがお約束になっています。

Time.deltaTimeを使う意図として、フレームレートによる動きの差異を減らすためとは分かっているのですが、いつも何となく使っていました。

ちゃんと理解できていなかったので調べてみたら、以下の記事がかなり丁寧にまとめられていました。
qiita.com
nekojara.city

時間カウントアップの開始タイミングについて

時間カウントアップは、以下のように実装しました。
uuc1h.hatenablog.jp
この時間カウントアップを開始するタイミングを、車を操作するためにキーボードの矢印キーを押した瞬間にしたいと思いました。
そこで、さきほどのスクリプトを以下のように変更しました。

private void Awake() {

    timer = FindObjectOfType<TimersComponent>();
    isStart = false;

}

private void Update() {

    if (!timer.countFlg && Input.GetAxis("Vertical") > 0 && !isStart){

        timer.countFlg = true;
        isStart = true;

    }

    float steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime;
    float moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;

    transform.Rotate(0, 0, -steerAmount);
    transform.Translate(0, moveAmount, 0);

}

Updateメソッドにあるif文の制御で、timer.counfFlgをtrueにすることで、カウントアップを開始します。
実装方法はともかく、思った通りに動いてくれるので結果としては満足しています。

unityroomに投稿したゲームのBGMとSEの制御方法

久しぶりにunityroomに投稿した以下ゲームより、メモとして残しておきたい部分を記しておきます。
unityroom.com

BGMとSEの制御について

BGMとSEは、1つのゲームオブジェクトにAudio Sourceコンポーネントを2つ追加して制御しています。
1つがBGM用、もう1つがSE用という感じで。

こうすることで、BGMのボリュームだけ大きくしたり、SEのボリュームを小さくしたりといったことが可能なので重宝しています。

制御に使っているスクリプトは、以下の通りです。

 [SerializeField] AudioSource audioSourceBGM;

 [SerializeField] AudioClip[] audioClipsBGM;

 [SerializeField] AudioSource audioSourceSE;

 [SerializeField] AudioClip[] audioClipsSE;

 public static SoundManager instance;

 private void Awake() {
        
     if (instance == null) {

            instance = this;

     }

}

void Start()
{
    audioSourceBGM.Stop();

    audioSourceBGM.clip = audioClipsBGM[0];
    audioSourceBGM.Play();

}

public void StopBGM() {

    audioSourceBGM.Stop();

}

public void PlaySE(int index) {

    audioSourceSE.PlayOneShot(audioClipsSE[index]);

}  

BGMとSEの音源を、配列として格納可能にしています。

今回作ったゲームでは、BGM音源を1つ、SE音源を3つセットしています。
スクリプトに戻りますと、BGM音源は1つだけなのでStart()メソッドで再生しています。
SE音源に関しては、PlaySE(int index)メソッドを作成し、外部クラスから再生できるようにしています。引数によって、3つあるうち任意のSE音源が再生可能です。

AWSクラウドプラクティショナー合格の勉強方法と経験談

AWSクラウドラクティショナーを受験して、無事に合格しました。
記憶の新しいうちに、自分がやってきた勉強内容などを記録しておきます。

はじめに

自分はIT業界に8年ほどいますが、AWSは未経験でした。それが、2023年に参画した現場でAWSを使用しており、全く会話についていけなかったので受験を決意しました。
そのため、AWSの経験は全くの未経験からスタートしました。

ちなみに勉強した期間は、2か月です。

勉強したこと

  1. AWS認定クラウドラクティショナー 改訂第2版(AWS認定資格試験テキスト)
  2. 【CLF-C02版】この問題だけで合格可能!AWS 認定クラウドラクティショナー 模擬試験問題集(6回分390問)

勉強したことは、この2つのみです。ただ、結果としてAWS認定資格試験テキストは最後まで読んでいないです。途中までしか読んでおらず、結構流し読みでした。
なので、Udemyの講座であるAWS認定クラウドラクティショナー模擬試験問題集をひたすらやっていました。

www.udemy.com

この講座ですが、試験6回分の問題集で構成されています。

まずは、基本レベル①と基本レベル②を全問合格するまで繰り返し解きました。
この講座は解説が充実しているので、「問題を解く→解説を見る」でかなり知識がつきます。なので、結果としてAWS認定資格試験テキストを最後まで読まなかったです。

基本レベル①、基本レベル②が満点になったら、本番レベルにチャレンジします。
基本レベルの知識はしっかりついたので、本番レベルもスラスラ解けると思いきや、40%ほどしか解けず、ここで出鼻をくじかれます。
本番レベルでは、基本レベルでは出てこなかったサービスが多く出てきたり、基本レベルに出てきたサービスであっても、問題の問われ方が違ったりと、難易度はかなり上がります。

で、実際の試験の難易度は、本番レベルでした。

そのため、本番レベルも解けるようにしておく必要があります。

実際の試験を受けて

実際に試験を受けた所感としては、Udemy講座の本番レベルと同程度の難易度だったと感じました。あと当たり前ですが、Udemy講座と全く同じ問題はありませんでした。
似たような問題はありましたが、Udemy講座の解説をしっかり読んで理解していないと、解けない問題が多かったです。

あと、AWSクラウド導入フレームワークのセキュリティパースペクティブや、AWS Well-Architectedは、かなり勉強しておいたほうがいいです。あくまで感覚ですが、これらの問題が多かったと思います。

docs.aws.amazon.com

aws.amazon.com

最後に

ここに書いた勉強方法で、無事に合格しました。ただ点数としては、合格ラインギリギリでしたね。上に書いた、セキュリティパースペクティブAWS Well-Architectedをもっと勉強しておけば、もう少し点数はよかったと思います。

自分の経験をつらつらと書きましたが、これから受験する人の参考に少しでもなれば嬉しいです。

ゲーム制作再開!時間カウントアップ方法を徹底解説

かなり久しぶりに、フリーゲーム投稿サイトのunityroomにゲームを投稿しました。
unityroom.com

操作は矢印キーで車を操作し、障害物にぶつからないようにゴールを目指すシンプルゲームです。
2023年は1本もゲームを作れておらず、このままではゲーム開発をやめてしまう危機が。。。ということで、2024年はなるだけゲームを作る年にします。

久しぶりにunityを起動したのですが、色々と忘れてる。色々と調べなおしながらやっているので、調べたことはメモとして残していきます。

時間のカウントアップ実装方法

このゲームではゴールまでの時間を計測するために、時間のカウントアップを実装しました。
方法としては、Time.deltaTimeを使いました。

public bool counfFlg;

public float timerValue;

[SerializeField] Text time;

private void Update() {

    UpdateTimer();

}

public void UpdateTimer() {

    if (countFlg) {

        timerValue += Time.deltaTime;
        time.text = timerValue.ToString("N2");

    }
        
}

Time.deltaTimeは実装例としてよく使われているので、これまで何も考えずに使っていましたが公式リファレンスを確認してみました。
docs.unity3d.com
Time.deltaTimeはフレーム間の秒数を返すため、フレーム毎のTime.deltaTimeを加算すればカウントアップができる仕組みです。

ちなみに、表示時間としては少数下2桁までの表示にしたかったため、ToStringメソッドに引数を追加しています。
上のソースコードでは、timerValueにTime.deltaTimeを加算していき、最終的にtime.textに表示しています。

ブログを再開しました。

久しぶりのブログです。
このブログは主にゲーム開発に関する内容を投稿していましたが、ブログを更新していない間もゲーム開発は続けていました。直近でリリースしたゲームは、こちらです。

play.google.com

自分としては、かなり力を入れて作ったゲームなんですが、ダウンロード数は10ぐらいという爆死のゲームになりました。
よくゲーム開発を初めてすぐに10万ダウンロードを超えましたとか、ネットの記事で出てきますが、あぁいうのは本当にごく一部だと思います。

自分は平日なかなか時間が取れず、ゲーム開発は主に週末にしています。週末も予定があったりするので、ゲーム開発の進捗はまさに牛歩の歩み。1年に2つのゲームをリリースできればいい方です。

そこで「ダウンロード数も少なくて、ゲーム開発に割ける時間も限られるのなら本当に自分が好きなゲームを開発するべきなのでは!?」と思い始めました。
自分が好きなゲームといえばRPGなのですが、自作ゲーム開発において「RPG」ものはタブーとされています。開発ボリュームが大きすぎて、間違いなく挫折するからです。
けど、「ゲームを作ったあとの結果に期待するのではなく、ゲーム開発の過程を楽しもう」というマインドに切り替えたわけです。自分が好きなゲームなら、開発も楽しいはず。

ということで、今から作り始めるゲームの進捗をブログにあげていきます。完成までかなり時間がかかりそうなので、ブログも過程を楽しむうちの一つです。
ちなみに作ろうとしているゲームは、「ノンフィールドRPG」です。スマホでフィールドを彷徨うRPGスタイルは色々とハードルが高いと思うのでね。

画面もすでに作り始めていて、こんな感じです。

このゲームですが、これまでの反省を生かそうとしています。次のブログでは、そこらへんを書こうかなーと考えています。