読者です 読者をやめる 読者になる 読者になる

くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Unity×AndroidでmBaaSのニフティクラウド mobile backend(NCMB)を使ってみる

unity android

ひさびさにAndroidアプリをリリース! 初の横スクロールアクション「あざらしロジック」(GooglePlay)

f:id:wannabe-jellyfish:20170128222935p:plain

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ
「あざらしロジック」で、Nifty Cloud mobile backend(NCMB)を導入したときの話。

NCMBのUnityプラグインのインストール

NCMBのUnityプラグインは、GitHubにて提供されているので、こちらからダウンロード。

ダウンロードしたzip(NCMB.2.2.0.zip)を解凍すると、「NCMB.unitypackage」が入っているので、そちらをインポート。

【注意】ほかにもSupportLibを利用しているプラグインを入れている場合

support-libやgoogle-play-serviceが競合していると、上手く動かないのでインポート時に外しておく。 f:id:wannabe-jellyfish:20170129203102p:plain

特にNCMBの、v2.2.0のライブラリはバージョンが古く、
AdMob/GPGS/Applovinなどと合わせて利用するとバージョンの整合性が合わず、上手く行かなかった。。。

ただ、AndroidManifest.xmlを除いた場合、必要な項目を手動でマージする必要がある。

使い方

基本的な使い方は以下の感じ。 ドキュメントも日本語でまとまっているため、わかりやすい

更新系

// Insert
NCMBObject obj = new NCMBObject ("Book");
obj["test"] = "value";
obj.SaveAsync ((NCMBException e) => {      
    if (e == null) { //成功時の処理 }
});

// Update(ObjectIdを指定する)
NCMBObject obj = new NCMBObject ("Book");
obj.ObjectId = "xxxxxxxxx";
obj["test"] = "value2";
obj.SaveAsync ((NCMBException e) => {      
    if (e == null) { //成功時の処理 }
});

// Delete
obj.DeleteAsync((NCMBException e) => {      
    if (e == null) { //成功時の処理 }
});

参照系

// Search by objectId
NCMBObject obj2 = new NCMBObject ("Book");
obj2.ObjectId = obj.ObjectId;
obj2.FetchAsync ((NCMBException e) => {        
    if (e == null) { //成功時の処理 }
});

// Search Query
//QueryTestを検索するクラスを作成
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
//Scoreの値が7と一致するオブジェクト検索
query.WhereEqualTo ("Score", 7);
//取得件数の指定
query.Limit = 5;
//取得開始位置の指定
query.Skip = 6;
// Sort
query.OrderByDescending ("Score");  //Scoreを降順で並べ替え
query.AddAscendingOrder ("Age");    //さらにAgeを昇順で並べ替え
// 外部参照も合わせて取得
query.Include("Child");

// 検索を実行
query.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {
    if (e == null) {
        //Scoreが7のオブジェクトを出力
        foreach (NCMBObject obj in objList) {
            Debug.Log ("objectId:" + obj.ObjectId);
        }
    }
});

// 検索件数の取得
query.CountAsync((int count , NCMBException e )=>{
    if(e == null){
        //件数を出力
        Debug.Log("件数 : "+ count);
    }
});

以上!!

参考にしたサイト様

Unity×Android | Admob/Applovinを使ったリワード広告(動画リワード)

unity android

ひさびさにUnityでAndroidアプリを作ってみました! 初の横スクロールアクション「あざらしロジック」!(GooglePlay)

f:id:wannabe-jellyfish:20170128222935p:plain

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ
「あざらしロジック」で、AdMobApplovinを導入したときの話。

AdMobのUnityプラグインのインストール

AdMobのプラグインは、GitHubに公開されているので、以下からダウンロード。
Release Google Mobile Ads Unity Plugin v3.2.0 · googleads/googleads-mobile-unity · GitHub

※すでに他のプラグインで、AndroidManifest.xmlをインポートしている場合は、追加でインポートしない。

ApplovinのUnityプラグインのインストール

Applovinのプラグインは、Applovinの公式サイトからダウンロード
AppLovin - Sign in

※すでに他のプラグインで、AndroidManifest.xmlをインポートしている場合は、追加でインポートしない。

AndroidMainifest.xmlをインポートしなかった場合

AndroidManifest.xmlに追記が必要。追記する内容は以下の通り。
YOUR_PACKAGE_NAMEYOUR_SDK_KEYは、自分の環境に合わせて。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="YOUR_PACKAGE_NAME"
  ・・・・
  >

  <!-- These permissions are mandatory to run AppLovin SDK -->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>

  <!-- These permissions are strongly recommended and will result in higher performance -->
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />

  <application>
    <!-- Applovin's meta-data -->
    <meta-data android:name="applovin.sdk.key" android:value="YOUR_SDK_KEY" />
    <activity android:name="com.applovin.adview.AppLovinInterstitialActivity" android:configChanges="orientation|screenSize"/>
    <activity android:name="com.applovin.adview.AppLovinConfirmationActivity" />
  </application>

</manifest>

リワード広告を表示してみる

使い方は、こんな感じ。(公式のDoc)より
リスナーが用意されているので、動画が表示されたら、報酬を付与するなどの処理ができる。

public class AdRewardManager : MonoBehaviour {

    void Start() {
        // AppLovin SDKの初期化
        AppLovin.InitializeSdk();
        // リワード広告の読み込み
        AppLovin.LoadRewardedInterstitial();
        // リスナーの設定
        AppLovin.SetUnityAdListener(name);
    }

    // リワード広告の表示
    public void ShowAdReward() {
        // 表示の準備ができていたら、広告を表示する
        if(AppLovin.IsIncentInterstitialReady()) {
            AppLovin.ShowRewardedInterstitial();
        }
    }

    // リスナー
    void onAppLovinEventReceived(string ev) {
        if(ev.Contains("REWARDAPPROVEDINFO")) {
            // 動画が再生された
        } else if(ev.Contains("LOADEDREWARDED")) {
            // 読み込み完了
        } else if(ev.Contains("LOADREWARDEDFAILED")) {  
            // 読み込み失敗
        } else if(ev.Contains("HIDDENREWARDED")) {
            //動画の表示し終わり、非表示にされた

            // 次の動画の準備
            AppLovin.LoadRewardedInterstitial();
        }
    }
}

AppLovinは、インタースティシャル広告も表示できる

インタースティシャル広告版はこちら。(公式のDoc)より

public class AdInterstitialManager : MonoBehaviour {

    void Start() {
        // AppLovin SDKの初期化
        AppLovin.InitializeSdk();
        // インタースティシャル広告の読み込み
        AppLovin.PreloadInterstitial();
        // リスナーの設定
        AppLovin.SetUnityAdListener(name);
    }

    // インタースティシャル広告の表示
    public void ShowAdReward(string name) {
        // 表示の準備ができていたら、広告を表示する
        if(AppLovin.HasPreloadedInterstitial()) {
            AppLovin.ShowInterstitial();
        }
    }

    // リスナー
    void onAppLovinEventReceived(string ev) {
        if(ev.Contains("DISPLAYEDINTER")) {
            // 広告が表示された
        } else if(ev.Contains("LOADEDINTER")) {
            // 読み込み完了
        } else if(ev.Contains("LOADINTERFAILED")) {  
            // 読み込み失敗
        } else if(ev.Contains("HIDDENINTER")) {
            // 広告が非表示にされた

            // 次の広告の準備
            AppLovin.PreloadInterstitial();
        }
    }
}

ちなみに、リスナーについては、こっちの公式Docより

以上!!かんたん!!

参考にしたサイト様

(小ネタ) 徐々に透過させて、フェードアウトする

unity

UnityでSpriteをフェードアウトさせる小ネタ。

Time.deltaTimeに応じて、徐々に透過度をさげていく。

ソース

using UnityEngine;

public class Fadeout: MonoBehaviour {
    // フェードアウトするまでの時間(0.5sec)
    public float fadeTime = 0.5f;
    private float time;
    private SpriteRenderer render;


    void Start () {
        render = GetComponent<SpriteRenderer>();
    }

    void Update () {
        time += Time.deltaTime;
        if(time < fadeTime) {
            float alpha = 1.0f - time / fadeTime;
            Color color = render.color;
            color.a = alpha;
            render.color = color;
        } else {
            Destroy(gameObject);
        }
    }
}

参考にしたサイト様

UnityxAndoridでGooglePlayGameServiceを使ったログイン処理

unity android

ひさびさにUnityでAndroidアプリを作ってみました!
拙作、初の横スクロールアクション「あざらしロジック」!(GooglePlay)

f:id:wannabe-jellyfish:20170128222935p:plain

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ
「あざらしロジック」で、Google Play Game Serviceを使ったので、その時の話

Google Play Game Service(GPGS)とは

Google Play ゲーム サービスの機能 - Google Play デベロッパー ヘルプ」によると、以下の感じ。

Google Play ゲーム サービスの機能

Google Play ゲーム サービスを使うと、楽しいソーシャル機能やマルチプレーヤー機能をゲームに追加することができます。

Google Play ゲーム サービスの実装に関する基本事項の解説やドキュメントをご覧いただくには、下記の機能を選択してください。

ランキング(リーダーボード)やGoogleアカウントでのSignin(ログイン)など、ゲームで使う機能を提供しているサービス。
今回は、Signin(ログイン)の部分だけ、利用した。
(リーダーボードも使おうとしたけど、1アカウントにつき1つのスコアしか表示されないので、mBaaSを使うことに)

Google Play Developer Consoleでの準備

ほぼ、この記事のとおりやっただけ。わかりやすくまとまってて、助かりました!

qiita.com

開発中の場合、証明書のフィンガープリントが必要

開発中のアプリで利用する場合は、証明書のフィンガープリント(SHA1)を自分で取得する必要があるので注意。
デバッグ用のkeystoreはC:/Users/<アカウント名>/.android/debug.keystoreにあるので、
「keytool.exe」を使って確認。

keytool -list -keystore C:/Users/<アカウント名>/.android/debug.keystore -v -storepass android

Unityプラグインのインストール/セットアップ

UnityからGPGSを利用するためのプラグインGitHubに公開されているので、そこから入手

GitHub - playgameservices/play-games-plugin-for-unity: Google Play Games plugin for Unity

zipをダウンロードして、

f:id:wannabe-jellyfish:20170129122106p:plain

zipを展開すると、current-buildにある「GooglePlayGamesPlugin-x.x.x.unitypackage」をインポート。

※ AdMobやAppLovinなどを使っている場合、AndroidMainfestやsupport-lib.jarが競合しないように!!
※ 競合すると、メニューが表示されず、セットアップに進めない。。。

f:id:wannabe-jellyfish:20170129122343p:plain

Unityプラグインのセットアップ

メニューの「Window > Google Play Games > Setup > Android setup…」から設定。

f:id:wannabe-jellyfish:20170129123125p:plain

Developer Consoleで追加した、実績/リーダボードの画面からリソースを取得できるので、
それを貼り付けて、「Setup」ボタンを押せば、OK

GPGSを使う(Signin/Signout)

使い方は以下の感じ。

using UnityEngine;
using UnityEngine.UI;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using System;

public class GPGSManager : MonoBehaviour {

    public Text textBtnSign;

    // Use this for initialization
    void Start() {
        if(!IsLogined()) {
            // クライアントの設定
            PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().Build();

            PlayGamesPlatform.InitializeInstance(config);
            PlayGamesPlatform.DebugLogEnabled = true;
            PlayGamesPlatform.Activate();
        }
    }

    // Sign-in
    public void SignIn(Action<bool> callback) {
        Social.localUser.Authenticate((bool success) => {
            callback(success);
        });
    }

    // Sign-out
    public void SingOut() {
        PlayGamesPlatform.Instance.SignOut();
    }

    // Login状態の確認
    public bool IsLogined() {
        return Social.localUser.authenticated;
    }
}

他の使い方も、GitHubのREADME.mdに詳しく書いてあるので、
迷うことは少ないかも。(英語だけど、英語だけど)

以上!!

参考にしたサイト様

Android/KotlinでRxAndroidを使うときに参考にしたサイト

android RxJava RxAndroid

[PR] Android+Kotlin+SpringBootのアプリをリリースました!

迷惑な路上駐車に困っていませんか?
そんなイライラを「路駐密告」ですっきり解消!
路上駐車を密告(情報を共有)するアプリ「路駐密告」

play.google.com

f:id:wannabe-jellyfish:20161002194416p:plain f:id:wannabe-jellyfish:20161002221328p:plain

「路駐密告」を作っていたときに、RxAndoridを初導入!

その際に参考にしたリンク集。まとめはまたいつか。。

参考にしたサイト様

Unity×Androidで多言語化・国際化したときにやった3つのこと

unity android

ひさびさにUnityでAndroidアプリを作ってみました!

拙作、初の横スクロールアクション「あざらしロジック」!(あざらしロジック - Google Play の Android アプリ)

f:id:wannabe-jellyfish:20170128222935p:plain

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ

日・英・中・韓に対応したので、その時の話

どこの記事かは忘れてしまったのだけれど。。。

ゲームで国際化・多言語化する場合は、日・英・中・韓に対応するのがよいらしい。

中国・韓国はアルファベット表記に馴染みがないので、日・英だけではだめなのだとか。

とりあえず、やってみようと思い、以下のことをしてみた。

  1. ゲーム中の文言/画像を国際化
  2. アプリ名を国際化
  3. アプリストアの説明文を国際化

ゲーム中の文言/画像を国際化(Editor拡張)

以下の記事を見つけて、「いいな!」と思ったので、参考にしてEditor拡張してみた。 lightgive.hatenadiary.jp

こっちが、Image版(LocalizeUIImage.cs)で、

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

#if UNITY_EDITOR
using UnityEditor;
#endif

public class LocalizeUIImage : MonoBehaviour {

    [SerializeField] Sprite imageEn;
    [SerializeField] Sprite imageJp;
    [SerializeField] Sprite imageZh;
    [SerializeField] Sprite imageZhCn;
    [SerializeField] Sprite imageZhTw;
    [SerializeField] Sprite imageKo;

    void Awake() {
        Dictionary<SystemLanguage, Sprite>  dict = new Dictionary<SystemLanguage, Sprite>() {
            { SystemLanguage.English, imageEn},
            { SystemLanguage.Japanese, imageJp},
            { SystemLanguage.Chinese, imageZh},
            { SystemLanguage.ChineseSimplified, imageZhCn},
            { SystemLanguage.ChineseTraditional, imageZhTw},
            { SystemLanguage.Korean, imageKo},
        };

        //Change
        SystemLanguage lang = Application.systemLanguage;
        Image mImage = GetComponent<Image>();
        mImage.sprite = dict.ContainsKey(lang) ? dict[lang] : dict[SystemLanguage.English];
    }
}

#if UNITY_EDITOR
[CustomEditor(typeof(LocalizeUIImage))]
[CanEditMultipleObjects]
public class LocalizeEditorImage : Editor {

    SerializedProperty propEn;
    SerializedProperty propJp;
    SerializedProperty propZh;
    SerializedProperty propZhCn;
    SerializedProperty propZhTw;
    SerializedProperty propKo;

    void OnEnable() {
        propEn = serializedObject.FindProperty("imageEn");
        propJp = serializedObject.FindProperty("imageJp");
        propZh = serializedObject.FindProperty("imageZh");
        propZhCn = serializedObject.FindProperty("imageZhCn");
        propZhTw = serializedObject.FindProperty("imageZhTw");
        propKo = serializedObject.FindProperty("imageKo");
    }

    public override void OnInspectorGUI() {
        serializedObject.Update();

        CreateUI("English", propEn, true);
        CreateUI("Japanese", propJp, true);
        CreateUI("Chainese", propZh, true);
        CreateUI("Chainese(Simplified)", propZhCn, true);
        CreateUI("Chainese(Traditional)", propZhTw, true);
        CreateUI("Korean", propKo, false);

        serializedObject.ApplyModifiedProperties();
    }

    private void CreateUI(string label, SerializedProperty prop, bool addSpace) {
        EditorGUILayout.LabelField(label, EditorStyles.boldLabel);
        prop.objectReferenceValue = (Sprite) EditorGUILayout.ObjectField(prop.objectReferenceValue, typeof(Sprite), true);
        if(addSpace) EditorGUILayout.Space();
    }
}
#endif

こっちが、Text版(LocalizeUITextArea.cs)

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

#if UNITY_EDITOR
using UnityEditor;
#endif

public class LocalizeUITextArea : MonoBehaviour {

    [SerializeField] string strEn;
    [SerializeField] string strJp;
    [SerializeField] string strZh;
    [SerializeField] string strZhCn;
    [SerializeField] string strZhTw;
    [SerializeField] string strKo;

    void Awake() {
        Dictionary<SystemLanguage, string> dict = new Dictionary<SystemLanguage, string>() {
            { SystemLanguage.English, strEn},
            { SystemLanguage.Japanese, strJp},
            { SystemLanguage.Chinese, strZh},
            { SystemLanguage.ChineseSimplified, strZhCn},
            { SystemLanguage.ChineseTraditional, strZhTw},
            { SystemLanguage.Korean, strKo},
        };

        //Change
        SystemLanguage lang = Application.systemLanguage;
        Text mText = GetComponent<Text>();
        mText.text = dict.ContainsKey(lang) ? dict[lang] : dict[SystemLanguage.English];
    }
}

#if UNITY_EDITOR
[CustomEditor(typeof(LocalizeUITextArea))]
[CanEditMultipleObjects]
public class LocalizeEditorTextArea : Editor {

    SerializedProperty propEn;
    SerializedProperty propJp;
    SerializedProperty propZh;
    SerializedProperty propZhCn;
    SerializedProperty propZhTw;
    SerializedProperty propKo;

    void OnEnable() {
        propEn = serializedObject.FindProperty("strEn");
        propJp = serializedObject.FindProperty("strJp");
        propZh = serializedObject.FindProperty("strZh");
        propZhCn = serializedObject.FindProperty("strZhCn");
        propZhTw = serializedObject.FindProperty("strZhTw");
        propKo = serializedObject.FindProperty("strKo");
    }

    public override void OnInspectorGUI() {
        serializedObject.Update();

        CreateUI("English", propEn, true);
        CreateUI("Japanese", propJp, true);
        CreateUI("Chainese", propZh, true);
        CreateUI("Chainese(Simplified)", propZhCn, true);
        CreateUI("Chainese(Traditional)", propZhTw, true);
        CreateUI("Korean", propKo, false);

        serializedObject.ApplyModifiedProperties();
    }

    private void CreateUI(string label, SerializedProperty prop, bool addSpace) {
        EditorGUILayout.LabelField(label, EditorStyles.boldLabel);
        prop.stringValue = EditorGUILayout.TextArea(prop.stringValue);
        if(addSpace) EditorGUILayout.Space();
    }
}
#endif

Unity上ではこんな感じ

それぞれをuGUIのText/Imageにアタッチする感じに使う。

f:id:wannabe-jellyfish:20170129010940p:plain

スクリプト上に項目が出てくるので、それぞれ言語で表示してほしいものを設定

あとは、実行すると、言語に応じて設定を表示が変わる!

f:id:wannabe-jellyfish:20170129011133p:plain

※例だと、日本語環境で実行しているので、「Japanese」の設定値になってます。

アプリ名を国際化

アプリ名については、通常のAndoridと同じように「values-xx」を作成する感じ。

ただ、デフォルトのアプリ名については、Unity上で設定が必要なので注意!

techbooster.org

必要なres/values-xxを一括で作成するスクリプトはこちら

  • ./createStringXml.shとすると、その場に、
  • ./createStringXml.sh NewProjectとすると、「NewProject」配下に

必要なファイルを作成してくれるので、あとは編集するだけ。

#!/bin/bash


## set root path
root=$1
test "$root" = "" && root='.'


## create string.xml
langs='
en
ja
zh
zh-rHK
zh-rTW
ko
'

for l in ${langs}; do
  dir=${root}/Assets/Plugins/Android/res/values-${l}
  mkdir -v -p ${dir}
  cat <<EOS > ${dir}/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- <string name="app_name">AppName</string> -->
</resources>
EOS
done

アプリストアの説明文を国際化(Google DocsスプレッドシートGoogle翻訳)

以下の記事で、GoogleDocのスプレットシートに、Google翻訳を呼び出す関数が用意されているらしい! toomva.blog60.fc2.com

GOOGLETRANSLATE(値,ソース言語,ターゲット言語)

こんな感じで使うらしい。

=GOOGLETRANSLATE($A2,“ja”,“en”)

言語は、

言語 記号
日本語 ja
英語 en
中国語(簡体) zh
中国語(簡体) zh-CN
中国語(繁体) zh-TW
韓国語 ko-KR

日本語を書けば、一括で置換できるので、あとは、コピペ。

※本当はちゃんと見ないといけないけれど、わからないので、Google翻訳任せ。。。

以上!!

参考にしたサイト様

Unityでよく使うディレクトリ構成を一括で作成する

unity bash

ひさびさにUnityでAndroidアプリを作ってみました!

拙作、初の横スクロールアクション「あざらしロジック」!

f:id:wannabe-jellyfish:20170128222935p:plain

play.google.com

www.youtube.com

その際にいろいろやったので、忘れないための備忘録φ(..)メモメモ

Unityで新しいプロジェクトを始めるとき、「Script」とか「Prefabs」とか作るけど、

手動で作るのがめんどくさくなったので、スクリプト化した話。

スクリプトはこんな感じ

takishさんの記事を見て、「おぉ!」となったので、参考にして、自分にあうようカスタマイズ。

qiita.com

スクリプトはこんな感じ(initUnityProject.sh)。

  1. Assets配下にディレクトリを作成して、
  2. .gitignoreを作成

また、

  • ./initUnityProject.shとすると、カレントに作成し、
  • ./initUnityProject.sh NewProjectとすると、「NewProject」配下に作成します。
#!/bin/bash

## set root path
root=$1
test "$root" = "" && root='.'


## create Directories in Assets
dirs='
Animations
Audio
Editor
Fonts
Icon
Materials
PhysicsMaterials
Plugins
Prefabs
Resources
Scenes
Scripts
Textures
'

for d in $dirs; do
  mkdir -v -p ${root}/Assets/${d}
done

## create .gitignore

cat <<EOS > ${root}/.gitignore
[Ll]ibrary/
[Tt]emp/
[Oo]bj/

## Autogenerated VS/MD solution and project files
/*.csproj
/*.unityproj
/*.sln
/*.suo
/*.user
/*.userprefs
/*.pidb
/*.booproj
### https://raw.github.com/github/gitignore/afbff9027d02ccfc680e031f6c295f79ad61662d/Unity.gitignore

/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd


# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage


### https://raw.github.com/github/gitignore/afbff9027d02ccfc680e031f6c295f79ad61662d/Global/Vim.gitignore

# swap
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
# session
Session.vim
# temporary
.netrwhist
*~
# auto-generated tag files
tags


### https://raw.github.com/github/gitignore/afbff9027d02ccfc680e031f6c295f79ad61662d/Global/Windows.gitignore

# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk


### https://raw.github.com/github/gitignore/afbff9027d02ccfc680e031f6c295f79ad61662d/Global/VisualStudioCode.gitignore

.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json


### https://raw.github.com/github/gitignore/afbff9027d02ccfc680e031f6c295f79ad61662d/C.gitignore

# Prerequisites
*.d

# Object files
*.o
*.ko
*.obj
*.elf

# Precompiled Headers
*.gch
*.pch

# Libraries
*.lib
*.a
*.la
*.lo

# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib

# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex

# Debug files
*.dSYM/
*.su


### https://raw.github.com/github/gitignore/afbff9027d02ccfc680e031f6c295f79ad61662d/C++.gitignore

# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app
EOS

以上!

参考にしたサイト様

  1. Unityフォルダ構成のルールについて - Qiita
  2. 逆引きシェルスクリプト/ヒアドキュメントをファイルに出力する方法 - Linuxと過ごす