🌥制作記録🌥

創作に関することを書いていきます。だいたいゲーム系

【Unity 2019.3.0f3/ビルド】Android NDK not found 修正方法

概要

NDKが読み込めないケースの修正方法説明

f:id:sim-mokomo:20191215120558p:plain
エラー画面

環境

  • Unity Hub 2.2.1
  • Unity.2019.3.0f3

原因

自動で設定されるNDKのパス先のファイル構成に誤りがある。

修正方法

NDK 読み込みの状態を確認

Edit → Preference → External Tools のAndroidの項目に Android NDK Installed with Unity の項目があります。ここでWarningが出ているかまず確認します。

f:id:sim-mokomo:20191214135414p:plain
NDK Error

NDK 参照先を確認

チェックボックスを外すとNDK参照先を確認することができます。

f:id:sim-mokomo:20191214135718p:plain
NDK Location

NDKファイル構成の編集

NDKフォルダ直下に android-ndk-r19 が存在することを確認します。

f:id:sim-mokomo:20191214135440p:plain
NDK 直下ファイル構成

このフォルダの中身をすべてNDKフォルダ直下に移動させます。

f:id:sim-mokomo:20191214140109p:plain
android-ndk-r19ファイル構成

f:id:sim-mokomo:20191214135739p:plain
解消されたエラー

Unity ゲームエフェクト マスターガイド

Unity ゲームエフェクト マスターガイド

Privacy Poricy -Android-

Privacy Policy

MokomoGames built the Geister app as an Ad Supported app. This SERVICE is provided by MokomoGames at no cost and is intended for use as is.

This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.

If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Geister unless otherwise defined in this Privacy Policy.

Information Collection and Use

For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way.

The app does use third party services that may collect information used to identify you.

Link to privacy policy of third party service providers used by the app

Log Data

I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.

Cookies

Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.

This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.

Service Providers

I may employ third-party companies and individuals due to the following reasons:

  • To facilitate our Service;
  • To provide the Service on our behalf;
  • To perform Service-related services; or
  • To assist us in analyzing how our Service is used.

I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.

Security

I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.

Links to Other Sites

This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.

Children’s Privacy

These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions.

Changes to This Privacy Policy

I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page.

Contact Us

If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at simurasakimokomoapp@gmail.com.

This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator

Unity App Privacy Policy -iOS-

Privacy Policy

built the Geister app as an Ad Supported app. This SERVICE is provided by at no cost and is intended for use as is.

This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.

If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Geister unless otherwise defined in this Privacy Policy.

Information Collection and Use

For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way.

The app does use third party services that may collect information used to identify you.

Link to privacy policy of third party service providers used by the app

Log Data

I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.

Cookies

Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.

This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.

Service Providers

I may employ third-party companies and individuals due to the following reasons:

  • To facilitate our Service;
  • To provide the Service on our behalf;
  • To perform Service-related services; or
  • To assist us in analyzing how our Service is used.

I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.

Security

I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.

Links to Other Sites

This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.

Children’s Privacy

These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions.

Changes to This Privacy Policy

I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page.

Contact Us

If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at simurasakimokomoapp@gmail.com.

This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator

【Unity/PUN】ネットワークゲームにおける楽な動作確認方法

概要

ネットワークゲームの簡単な動作確認方法書きます

こんな人がよむ

動作確認の度にビルドして実行ファイルを書き出すのが面倒な人

前提

基本的なgitの使い方がわかっている

やり方

流れ

  1. ローカルマシーンに同様のプロジェクトを2つクローンする
  2. UnityEditorを2つ開く
  3. 片方のプロジェクトでコーディングを行う
  4. 2つのローカルリポジトリを同期させる (準備)
  5. 2つのローカルリポジトリを同期させる

ローカルマシーンに同様のプロジェクトを2つクローンする

とりあえず該当するプロジェクトをクローンしてきましょう。
今回はテスト用のプロジェクトをクローン。

github.com

$ git clone https://github.com/sim-mokomo/LocalGitRepoSyncTest.git
$ git clone https://github.com/sim-mokomo/LocalGitRepoSyncTest.git LocalGitRepoSyncTest2

UnityEditorを2つ開く

無事開けました。
片方の変更がもう一方に反映できていれば満足の結果です。

f:id:sim-mokomo:20191007220836p:plain
Unity Editor ひらいた

片方のプロジェクトでコーディングを行う

(LocalGitRepoSyncTest内)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("同期できてる!!!");
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

2つのローカルリポジトリを同期させる (準備)

LocalGitRepoSyncTest に移動して以下のコマンドをたたきましょう。
remote add はいつも Github の リポジトリ Url をたたき込んでるかもしれません。

代わりに2つめにクローンしてきたプロジェクトの相対パスを打ち込みます。
これで変更をもう一方のローカルgitリポジトリに適用することができるようになりました。

$ git remote add LocalGitRepoSyncTest2Proj ../LocalGitRepoSyncTest2
$ git remote -v
LocalGitRepoSyncTest2Proj       ../LocalGitRepoSyncTest2 (fetch)
LocalGitRepoSyncTest2Proj       ../LocalGitRepoSyncTest2 (push)
origin  https://github.com/sim-mokomo/LocalGitRepoSyncTest.git (fetch)
origin  https://github.com/sim-mokomo/LocalGitRepoSyncTest.git (push)

2つのローカルリポジトリを同期させる

準備ができたので早速プッシュしてみます。

$ git add .
$ git commit -m "同期テスト"
$ git push LocalGitRepoSyncTest2Proj master
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 12 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 852 bytes | 426.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: is denied, because it will make the index and work tree inconsistent
remote: with what you pushed, and will require 'git reset --hard' to match
remote: the work tree to HEAD.
remote:
remote: You can set the 'receive.denyCurrentBranch' configuration variable
remote: to 'ignore' or 'warn' in the remote repository to allow pushing into
remote: its current branch; however, this is not recommended unless you
remote: arranged to update its work tree to match what you pushed in some
remote: other way.
remote:
remote: To squelch this message and still keep the default behaviour, set
remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ../LocalGitRepoSyncTest2
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '../LocalGitRepoSyncTest2'

怒られました。

プッシュ先で以下のコマンドをたたくと許されます。
詳細はこちらを見てください。

www.nekotricolor.com

~/Documents/UnityProjects/LocalGitRepoSyncTest2 (master)
$ git config receive.denyCurrentBranch updateInstead

動作確認

f:id:sim-mokomo:20191007223603p:plain
同期できてる!!!!

宣伝

Unityネットワークゲーム開発 実践入門 UNET/ニフティクラウド mobile backend版

Unityネットワークゲーム開発 実践入門 UNET/ニフティクラウド mobile backend版

【Unity2019.3.0a4】関数名を取得する方法。引数として必要になった時など

問題点

下のような関数名を引数として取る関数を使用する際に以下のような問題が起きる。

  • ベタ打ちによるタイポが発生
  • 関数名を修正する時に大変になる
  • methodNameとして渡す関数が、どこで使用されているか探す事が困難になる
public void RPC(string methodName, PhotonTargets target, params object[] parameters)
public void Invoke(string methodName, float time)

以下の章ではいくつかの解決方法を参考コードと共に記述したよー。
実際に使ってるコードから抜き出しました。若干見にくいかも。

解決方法①(本命じゃない)

Actionでラップする。
目的の関数名はActionのプロパティから取得する。

コード

public void UpdateColorByBelong(PhotonView photonView,int belongType)
{
 var rpcMethod = new Action(RpcUpdateColorByBelong);        
 photonView.RPC(rpcMethod.Method.Name,PhotonTargets.All,belongType);
}

[PunRPC]
private void RpcUpdateColorByBelong(int ghostType)
{
 _renderer.color = _colorTable[ghostType];
}

問題点

関数を実行するたびにインスタンスを生成するのは負荷的に心配。

解決方法②(本命じゃない)

Actionにキャストする。 大体問題点もコードも①と同じ。

コード

public void UpdateColorByBelong(PhotonView photonView,int belongType)
{
 var rpcMethod =  (Action<int>)RpcUpdateColorByBelong;        
 photonView.RPC(rpcMethod.Method.Name,PhotonTargets.All,belongType);
}

[PunRPC]
private void RpcUpdateColorByBelong(int ghostType)
{
 _renderer.color = _colorTable[ghostType];
}

問題点

毎回キャストするコストがどれだけ安く済むのか。
地味に引数に対応したActionを打ち込む手間がある。

解決方法③ (本命)

nameof演算子を用いる。
定数式らしいので実行時の計算負荷に影響がない。(下記URL先で定数式である事が確認できる。)

nameof演算子は関数を引数に取る。
なのでIDEにより容易に使用箇所が検索できる。
また、Renameの際にも文字列で参照している箇所がないかと恐れる必要がなくなる。

docs.microsoft.com

public void UpdateColorByBelong(PhotonView photonView,int belongType)
{
 photonView.RPC(nameof(RpcUpdateColorByBelong),PhotonTargets.All,belongType);
}

[PunRPC]
private void RpcUpdateColorByBelong(int ghostType)
{
 _renderer.color = _colorTable[ghostType];
}

終わりに

ベタ打ちタイポの恐怖から解放されました

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

Unity1Week「10」に参加した話

はじめに

作ったゲームは下記URLから遊べます!まだ遊んでいない人はまず遊んでから読んでください!!() to-10-Mix | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

Unity1week参加までのとりとめのない話

突然ですが最近はコンテストと名のつくものにはとりあえず参加するようにしています 直近だと「ぷちコン」や「〇〇デジタルソフトウェアコンテスト」にゲームを投稿してみました。

コンテストはゲームを完成まで持っていくためのモチベーションを生み出してくれ、かつ 投稿後には何故か冷静に自分の作品の長短を評価できるので参加するようにしているのです。

今回 Unity1week に参加した理由は前述の理由 + 「UnityRoom」と言う素敵なプラットフォーム上で不特定多数の人から感想を貰えるからです!!!

企画を立てよう!

今回のUnity1weekのお題が「10」であることからまず既存のアプリ「Make 10」を思い出しました。

このアプリは数字を合計10にするようにパズルを組み立てていくと言うものなので、僕も「数字の合計を10にする」事を軸として企画を考えるようにしました。

Make 10

Make 10

  • GalacticThumb
  • ゲーム
  • 無料

プロトを作ろう!

以下の点に注意して色々考えました  - 注目してもらいやすいように綺麗な見た目を心がける  - 後々スマホ向けにリリースしたいので操作はスマホを前提にする

ということなのでとりあえず、合計して10にする事ができるようなものである事を前提に、見た目が綺麗に表現できるような要素を考えました。

合計 -> くっつく -> (なぜか)シャボン玉 が思いついたので早速プロトを作りました。

指でシャボン玉同士をくっつけて最後美しく割れれば楽しいかなっていう気持ちから生まれたゲームです。シャボン玉がポコポコくっつく様子は見ていて気持ちいいのでこのままの企画でよしとしました。

味付けをしよう!

ただ単に数を合成して10を作るだけだとゲームとして味気がないので「連鎖」の要素を加えました、これのおかげでプレイヤースキルが上がるにつれてたくさん連鎖を組めるようになるのでプレイするたびに楽しく遊べるように出来たんじゃないかなと思います。

完成

そして(多少遅刻しながらも)完成!

結果は UnityRoom で ❤️100 もらえた & コメントをもらえたのでそこそこ満足しています。次回は❤️200-300 くらいを目標にしてゲームを作りたい...! こうやって次回に向けた目標も立てやすいのがUnityRoomの良いところっぽいですね

改善点

連鎖が決まった時はそこそこ綺麗な絵に出来たんじゃないかなと思ったのですが、組んでいる最中のゲーム画面が地味になってしまった点

UnityRoom上のゲームアイコンが地味&ゲーム画面が想像しにくい状態だった点が反省点かなと思ってます。

チュートリアル要素がなかったのでうまくゲームを楽しむところ、つまり連鎖を弾けさせるところまでうまく誘導できていない感じがあるので次回から時間がないときでもチュートリアルをつけることを前提に予定を組むとより良いなと思いました。

おわり

まともな振り返り記事を書けたのかも怪しいですがアウトプットできただけよしとしよう!

次回もUnity1week参加します、その時はもっとエモ面白いゲームを作ることを目指しますので僕の名前を見かけたらぜひプレイしてみてくださいな💪

【UE4.20.3】ラスタースクロールマテリアルを作成/解説の回

はじめに

ラスタースクロールマテリアルの作り方を書きます。 テリーのワンダーランドでよく見ていた表現を試しに作ってみました。

結果

www.youtube.com

作り方

全体のノード

f:id:sim-mokomo:20181021220612p:plain

流れ

  1. 縦方向に波打つSin波を作成する。
  2. 1.の sin波を UV座標の横方向に対して加算してゆがみを作成する。
  3. sin波の調整パラメータを作成する。

1. 縦方向に波打つSin波を作成する。

f:id:sim-mokomo:20181021222122p:plain

縦方向に波打つ Sin波を作成したいので UV座標の縦方向成分を取り出してSin波のパラメータとして使用することで縦方向のSin波を実現させることができます。

これは後で画面をゆがませるために使用します。

2. 1のsin波を UV座標の横方向に対して加算してゆがみを作成する。

f:id:sim-mokomo:20181021222149p:plain

1で作成した縦方向のSin波を画面描画のUV座標の横方向に適用させることで描画を横に歪ませることができます。

3 sin波の調整パラメータを作成する。

f:id:sim-mokomo:20181021222122p:plain

Sin波は出力に乗算を用い、 -1~1 の値を変更させることで並みの振れ幅を大きくも小さくもできます。 調整パラメータ DestritionIntensity がこの役割を持っています。

またSin波は入力パラメータを増減させることで並みの周波数を変えることができます。つまり細かく揺らしたり大雑把に揺らすことができるということです。

これは DestritionIntensityに比例させて値を渡しています。 調整パラメータの数が1つのほうが個人的に使いやすいのでこうしましたが、周波数調整用のパラメータを用意してもいいと思います。

終わりに

前回の記事で質問があった場合には @sim_mokomo までと言いましたが記事内のコメントで質問していただいたほうが後に閲覧する人たちにとって見返しやすいとおもったので記事内のコメントで質問等はお願いします。

UnrealEngine4マテリアルデザイン入門 第2版

UnrealEngine4マテリアルデザイン入門 第2版