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

くらげになりたい。

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

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

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アプリを作ってみました!
拙作、初の横スクロールアクション「あざらしロジック」!(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を使うときに参考にしたサイト

[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アプリを作ってみました!

拙作、初の横スクロールアクション「あざらしロジック」!(あざらしロジック - 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で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と過ごす

jQuery.floatTheadでスクロールしても常にテーブルヘッダを表示する

テーブルの列が多くなると、スクロールしてもテーブルヘッダが見えなくなってしまう。。。

テーブルヘッダの固定して、スクロールしても常に表示されるようにした際の、備忘録。

便利なjQueryプラグイン(jQuery.floatThead)があったので、それを使ってみた

使い方

使い方はこんな感じ

<html>
<head>
・・・
<!-- Include Floaing Table Header -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/floatthead/1.4.5/jquery.floatThead.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  var $table = $('table');
  $table.floatThead({
      top:50,
      responsiveContainer: function($table){
          return $table.closest('.table-responsive');
      }
  });
});
</script>
</head>

<body>
・・・
</body>

</html>

jQuery.floatTheadはCDNが用意されているので、そっちを利用

<script src="https://cdnjs.cloudflare.com/ajax/libs/floatthead/1.4.5/jquery.floatThead.js"></script>

あとはテーブルに対して、floatThead()をするだけ。

<script type="text/javascript">
$(document).ready(function(){
  var $table = $('table');
  $table.floatThead({
      top:50,
      responsiveContainer: function($table){
          return $table.closest('.table-responsive');
      }
  });
});
</script>

Bootstrap3と一緒に使うときの注意

ここではまった。。。

  1. .teble-responsiveを使っているときは、responsiveContainerを設定する
  2. jQuery.floatTheadのUsageにあるとおり
  3. レスポンシブテーブルを利用しているときは、設定が必要
  4. <nav class="navbar">を使っているときは、top:50を追加する
  5. 設定しないと、ウィンドウの上部に固定されるので、ナビゲーションの後ろに隠れてしまう。
  6. topで、固定する位置を調節できるので、ナビゲーションの下に固定されるように設定

以上!!

参考にしたサイト様

AWS EC2でメモリ利用率とディスク容量をCloudWatchで監視する

AWS EC2を使ってたときに、メモリがー、ディスク容量がーとなったので、

CloudWatchで監視することに。その際の備忘録。

OSは、Amazon Linux

手順メモ

# 1. 必要なパッケージをインストール
sudo yum -y install perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https

# 2. Amazon CloudWatch Monitoring Scripts for Linuxのインストールディレクトリを作成
sudo mkdir /usr/local/cloudwatch


# 3. Amazon CloudWatch Monitoring Scripts for Linuxのダウンロード&展開
cd /usr/local/cloudwatch
sudo wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
sudo rm CloudWatchMonitoringScripts-1.2.1.zip

# 4. スクリプトの実行に、AWSのKeyが必要なので、設定
cd aws-scripts-mon
sudo cp awscreds.template awscreds.conf
sudo vim awscreds.conf
# 「awscreds.conf」に、以下を記載
# AWSAccessKeyId=[アクセスキーID]
# AWSSecretKey=[シークレットキー]

# 5. cronで情報を送信するスクリプトの定期実行を設定
crontab -e
# 「crontab -e」で以下を記載。
# */5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --from-cron
# */5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --disk-space-util --disk-path=/ --from-cron

以上!!

参考にしたサイト様