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

くらげになりたい。

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

Androidで着信に関するあれこれ

Androidで着信拒否アプリを作るかもしれなかったときに、集めた参考サイト様たち。

いつか使うかもしれないので、備忘録。

UnityでiTweenを使って簡単アニメーション

[PR] ★目指せ!絶対RGB感!★ シンプルな色当てゲーム「色博士(いろはかせ)」をリリースしました!

久々に新作をリリースしました!!(色博士(いろはかせ) - Google Play)
かわいい博士が主役のシンプルな色当てゲーム!全465色でボリュームたっぷり♪デザイナーだけでなく、色遊びが好きな方はぜひ!

色博士を作っているときに、前から使いたかったiTweenを使ってみたので、その時の備忘録。

iTweenのインストー

iTweenはAsset Storeからインストールできる。

iTween for Unity by Bob Berkebile (pixelplacement)にも詳しく書いてあるので、参照しながら~

iTweenを使ってみる

使い方はとても簡単で、基本は以下のような感じ。

iTween.<用意されているアニメーション>(<対象のオブジェクト,
    iTween.Hash(
      <パラメタのKey>, <パラメタのValue>
    );
);

<用意されているアニメーション>はたくさんあって、以下の様なのある。

  • iTween.MoveTo … 指定の場所まで移動
  • iTween.ScaleTo … 指定のスケールに変更
  • iTween.RotateTo … 指定の角度まで回転

<パラメタのKey><パラメタのValue>は、アニメーションによって変わるので、要ドキュメント参照

実際に使ったものをいくつか。

例:MoveTo(指定の場所まで移動)

iTween.MoveTo(gameObject, 
    iTween.Hash(
        "x", 100,       // Xが100まで移動
        "time", 1,      // アニメーションの時間は1秒
        "islocal", true // localPositionで計算
    )
);

uGUIとかだと"islocal", trueでないと、変な感じになる。

例:終了時になにかする

public class AnimSample: MonoBehaviour {
    public void StartAnim() {
        RectTransform rt = gameObject.GetComponent<RectTransform>();
        iTween.MoveTo(gameObject, 
            iTween.Hash(
                "x", 100, "time", 1, "islocal", true,
                "oncomplete", "FinishAnim",            // アニメーション終了時に実行するメソッド名
                "oncompletetarget", gameObject,        // oncompleteで呼び出すメソッドを持つオブジェクト
                "oncompleteparams", rt                 // oncompleteで呼び出すメソッドに渡す引数のオブジェクト
            )
        );
    }

    void FinishAnim(RectTransform rt) {
         // アニメーション終了時の処理
    }
}

例:ScaleTo(指定のスケールに変更)

iTween.ScaleTo(gameObject, 
    iTween.Hash(
        "x", 5  ,       // スケールのXを5に変更
        "y", 5  ,       // スケールのYを3に変更
        "time", 1,      // アニメーションの時間は1秒
    )
);

例:拡大しながら移動する

同じオブジェクトに対して、複数のアニメーションをつけたいときはXxxxAdd()系を使ってつなげる。
XxxxAdd()以外は、アニメーションの終了してから、次のアニメーションが開始するけど、
XxxxAdd()の場合は、その終了を待たず、次のアニメーショを開始する。

iTween.ScaleAdd(gameObject,
    iTween.Hash("x", 5, "y", 5, "time", s)
);
iTween.MoveTo(gameObject,
    iTween.Hash("x", 100, "y", 100, "time", 1, "islocal", true)
);

例:複数のアニメーションをつなげる

複数のアニメーションをまとめて実行したい場合は、コルーチンをつかう。

public void StartAnim {
    StartCoroutine(MultiAnimations());
}

IEnumerator MultiAnimations() {
    iTween.MoveTo(gameObject, iTween.Hash("x", 10, "time", 1, "islocal", true));
    yield return new WaitForSeconds(2);

    iTween.ScaleTo(gameObject, iTween.Hash("x", 2, "time", 1));
    yield return new WaitForSeconds(2);

    iTween.MoveTo(gameObject, iTween.Hash("x", -200, "time", 1, "islocal", true));
    yield return new WaitForSeconds(2);

    iTween.ScaleTo(gameObject, iTween.Hash("x", 1, "time", 1));
}

ここまで複雑になると、Animationを使うほうがよいかもしれないですが。。。

例:アニメーションのスピードを変える

アニメーションの変化のさせ方は、easetypeで変更できる。(はじめはたくさん変化して、最後はあまり変化しないとか)   たくさんのパターンがあるので、デモのサイトを見るのがいい感じ。

iTween.MoveTo(gameObject,
    iTween.Hash("x", 100, "y", 100, "time", 1, "islocal", true,
        "easetype", "easeInCubic"
    )
);

以上!!

参考人したサイト様

[PR] ★目指せ!絶対RGB感!★ シンプルな色当てゲーム「色博士(いろはかせ)」をリリースしました!

久々に新作をリリースしました!!(色博士(いろはかせ) - Google Play)

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

かわいい博士が主役のシンプルな色当てゲーム!
全465色でボリュームたっぷり♪デザイナーだけでなく、色遊びが好きな方はぜひ!

UnityのuGUIでボタン以外でもタップイベントを取得する

[PR] ★目指せ!絶対RGB感!★ シンプルな色当てゲーム「色博士(いろはかせ)」をリリースしました!

久々に新作をリリースしました!!(色博士(いろはかせ) - Google Play)
かわいい博士が主役のシンプルな色当てゲーム!全465色でボリュームたっぷり♪デザイナーだけでなく、色遊びが好きな方はぜひ!

色博士を作っているときに、Imageもタップイベントを取得したいなーと思ったので、その時の備忘録。

まさに、この記事!という記事があったので、これを読めばOK!(感謝!!)

indie-du.com

やり方は、以下の通り。

  1. 追加したいオブジェクトに、EventTriggerコンポーネントを追加
  2. 下にあるAdd New Event Typeボタンを押下して、Pointer Ckickを選択
  3. すると、みなれたButtonのOn Click()っぽいものが追加されるので、
  4. 同じ感じで、オブジェクトクリック時に呼ぶ関数を設定

以上!

参考にしたサイト様

[PR] ★目指せ!絶対RGB感!★ シンプルな色当てゲーム「色博士(いろはかせ)」をリリースしました!

久々に新作をリリースしました!!(色博士(いろはかせ) - Google Play)

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

かわいい博士が主役のシンプルな色当てゲーム!
全465色でボリュームたっぷり♪デザイナーだけでなく、色遊びが好きな方はぜひ!

Unity×Android×SocialConnectorでツイート(シェア)機能をつけてみる

[PR] ★目指せ!絶対RGB感!★ シンプルな色当てゲーム「色博士(いろはかせ)」をリリースしました!

久々に新作をリリースしました!!(色博士(いろはかせ) - Google Play)

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

かわいい博士が主役のシンプルな色当てゲーム!
全465色でボリュームたっぷり♪デザイナーだけでなく、色遊びが好きな方はぜひ!

結果画面をツイートしてみる

色博士を作るときに、よくある「結果を共有」というのをしてみたいなぁと思ったので、その時の備忘録。

Social Connectorを使えば簡単にできるよう!すごい!

Social Connectorのダウンロードとデプロイ

使い方は簡単。

  1. GitHubから、SocialConnector.unitypackageをダウンロードして、
  2. Unityでカスタムアセットを取り込むだけ

ただ、僕の環境(Windows10/Unity5.5.2f1 parsonal)では、Assets/SocialConnector/Editor/SocialConnectorPostProcess.cs
using UnityEditor.iOS.Xcode;コンパイルエラーが。。。(-_-;)
SocialConnectorPostProcess.csを削除することで上手くいったので、そのまま。

シェアしてみるコード

使い方はこんな感じ。

using System;
using System.IO;
using UnityEngine;
using SocialConnector;

public class ShareController : MonoBehaviour {

    public void Share() {
        StartCoroutine(ShareScreenShot());
    }

    IEnumerator ShareScreenShot() {
        //スクリーンショット画像の保存先を設定。ファイル名が重複しないように実行時間を付与
        string fileName = String.Format("image_{0:yyyyMMdd_Hmmss}.png", DateTime.Now);
        string imagePath = Application.persistentDataPath + "/" + fileName;

        //スクリーンショットを撮影
        Application.CaptureScreenshot(fileName);
        yield return new WaitForEndOfFrame();

        // Shareするメッセージを設定
        string text ="ツイート内容\n#hashtag ";
        string URL = "url";
        yield return new WaitForSeconds(1);

        //Shareする
        SocialConnector.SocialConnector.Share(text, URL, imagePath);
    }
}

はまったポイントは、以下の3つ

  1. スクリーンショットの保存に時間がかかるのでコルーチンを使う
  2. 保存先のファイル名はその都度、変える
    • ファイル名が重複すると、意図していない前の画像をシェアしてしまうので。
  3. ハッシュタグの後ろには、スペースを含める。
    • ツイートする文字は、textURLをconcatした文字列になる。
    • そのため、スペースが無いとハッシュタグの直後にURLが来てしまい、意図したタグにならない。。。

SocialConnector.csをいじって、Twitterだけにする

Social Connectorは高性能なので、Twitter以外にもLINEなどへのシェアができる。
ただ今回は、Twitterだけにしぼりたいなぁと思っていたので、少しいじってみることに。

ueno-yuheiさんの記事(Gmail・Line・Facebook・Twitter 公式アプリで共有させたい時のIntentの投げ方 - Qiita)を参考に、以下のように変更。

--- a/Assets/SocialConnector/SocialConnector.cs
+++ b/Assets/SocialConnector/SocialConnector.cs
@@ -34,8 +34,7 @@ namespace SocialConnector
         {
             using (var intent = new AndroidJavaObject ("android.content.Intent")) {
                 intent.Call<AndroidJavaObject> ("setAction", "android.intent.action.SEND");
+                intent.Call<AndroidJavaObject>("setPackage", "com.twitter.android");
                 intent.Call<AndroidJavaObject> ("setType", string.IsNullOrEmpty (textureUrl) ? "text/plain" : "image/png");

                 if (!string.IsNullOrEmpty (url))
                     text += "\t" + url;

これだけで、Twitterだけになりましたヽ(=´▽`=)ノ

以上!!

参考にしたサイト様

Unity×AdMob×Androidで広告を表示する

Unityでアプリを作っていると何度も公式ドキュメントを見に行くので、よく使うものの備忘録

AdMobのUnityプラグインをダウンロード&デプロイ

ここ(Release Google Mobile Ads Unity Plugin v3.4.0 · googleads/googleads-mobile-unity · GitHub)から、
GoogleMobileAds.unitypackageをダウンロードして取り込めばOK!

基本的なバーナーリクエス

ドキュメント(Get Started  |  AdMob for Unity  |  Google Developers)から

using UnityEngine;
using GoogleMobileAds.Api;


public class AdMobBanner : MonoBehaviour {
    private string adUnitId = "INSERT_ANDROID_BANNER_AD_UNIT_ID_HERE";
    private BannerView bannerView ;

    void Start () {
        // Create a banner at the top of the screen.
        bannerView = new BannerView(adUnitId, AdSize.SmartBanner, AdPosition.Top);

        // Create an ad request.
        AdRequest request = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
            .Build();
        
        // Add Event Handler
        bannerView.OnAdLoaded             += HandleOnAdLoaded;             // ad request has successfully loaded.
        bannerView.OnAdFailedToLoad       += HandleOnAdFailedToLoad;       // ad request failed to load.
        bannerView.OnAdOpened             += HandleOnAdOpened;             // ad is clicked.
        bannerView.OnAdClosed             += HandleOnAdClosed;             // the user returned from the app after an ad click.
        bannerView.OnAdLeavingApplication += HandleOnAdLeavingApplication; // the ad click caused the user to leave the application.

        // Load
        bannerView.LoadAd(request);
    }

    public void HandleOnAdLoaded(object sender, EventArgs args) {}
    public void HandleOnAdFailedToLoad (object sender, AdFailedToLoadEventArgs args) {}
    public void HandleOnAdOpened(object sender, EventArgs args) {}
    public void HandleOnAdClosed(object sender, EventArgs args) {}
    public void HandleOnAdLeavingApplication(object sender, EventArgs args) {}
}

バーナーサイズ(AdSize)とポジション(AdPosition)は、以下な感じ。

AdSize WxH AdPosition
Banner 320x50 Top
MediumRectangle 300x250 Bottom
IABBanner 468x60 TopLeft
Leaderboard 728x90 TopRight
SmartBanner BottomLeft
BottomRight
Center

基本的なインタースティシャル広告リクエス

基本的にはバーナー広告と同じ感じ。 終了時などに使うので、Application.Quit()を呼んだりすると、Handlerの処理が必要に。

using System;
using UnityEngine;
using GoogleMobileAds.Api;

public class AdMobInterstitial : MonoBehaviour {
    private string adUnitId = "INSERT_ANDROID_INTERSTITIAL_AD_UNIT_ID_HERE";
    private InterstitialAd interstitial ;


    // Use this for initialization
    void Start() {
        // Initialize an InterstitialAd.
        interstitial = new InterstitialAd(adUnitId);

        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
            .Build();

        // Add Event Handler
        interstitial.OnAdLoaded             += HandleOnAdLoaded;             // ad request has successfully loaded.
        interstitial.OnAdFailedToLoad       += HandleOnAdFailedToLoad;       // ad request failed to load.
        interstitial.OnAdOpened             += HandleOnAdOpened;             // ad is clicked.
        interstitial.OnAdClosed             += HandleOnAdClosed;             // the user returned from the app after an ad click.
        interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication; // the ad click caused the user to leave the application.

        // Load the interstitial with the request.
        interstitial.LoadAd(request);
    }

    public void Show() {
        if(interstitial.IsLoaded()) {
            interstitial.Show();
        } else {
            Application.Quit();
        }
    }

    public void HandleOnAdLoaded(object sender, EventArgs args) {}
    public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) {}
    public void HandleOnAdOpened(object sender, EventArgs args) {}
    public void HandleOnAdClosed(object sender, EventArgs args) {
        Application.Quit();
    }
    public void HandleOnAdLeavingApplication(object sender, EventArgs args) {}
}

基本的な動画リワード広告リクエス

ドキュメント(動画リワード広告メディエーション  |  AdMob by Google  |  Firebase)から。
動画見たあとの報酬受取処理(rewardedHandler)とか、一度再生したら再読込が必要などめんどくさい。。

using System;
using UnityEngine;
using GoogleMobileAds.Api;

public class AdMobReward : MonoBehaviour {
    private string adUnitId = "INSERT_AD_UNIT_HERE";
    private AdRequest adRequest;
    private RewardBasedVideoAd rewardBasedVideo;
    private Action rewardedHandler;
    private static bool rewardBasedEventHandlersSet = false;

    // Use this for initialization
    void Start() {
        rewardBasedVideo = RewardBasedVideoAd.Instance;
        
        // Create an empty ad request.
        adRequest = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
            .Build();

        // Reward based video instance is a singleton. Register handlers once to avoid duplicate events.
        if (!rewardBasedEventHandlersSet) {
            rewardBasedVideo.OnAdLoaded             += HandleRewardBasedVideoLoaded;          // ad has been received.
            rewardBasedVideo.OnAdFailedToLoad       += HandleRewardBasedVideoFailedToLoad;    // ad has failed to load.
            rewardBasedVideo.OnAdOpening            += HandleRewardBasedVideoOpened;          // ad is opened.
            rewardBasedVideo.OnAdStarted            += HandleRewardBasedVideoStarted;         // ad has started playing.
            rewardBasedVideo.OnAdRewarded           += HandleRewardBasedVideoRewarded;        // ad has rewarded the user.
            rewardBasedVideo.OnAdClosed             += HandleRewardBasedVideoClosed;          // ad is closed.
            rewardBasedVideo.OnAdLeavingApplication += HandleRewardBasedVideoLeftApplication; // ad is leaving the application.

            rewardBasedEventHandlersSet = true;
        }

        // Load
        rewardBasedVideo.LoadAd(adRequest, adUnitId);
    }


    public void Show(Action handler) {
        if (rewardBasedVideo.IsLoaded()) {
            rewardedHandler = handler;
            rewardBasedVideo.Show();
        }
    }

    public void HandleRewardBasedVideoLoaded(object sender, EventArgs args) {}
    public void HandleRewardBasedVideoFailedToLoad(object sender, EventArgs args) {}
    public void HandleRewardBasedVideoOpened(object sender, EventArgs args) {}
    public void HandleRewardBasedVideoStarted(object sender, EventArgs args) {}

    public void HandleRewardBasedVideoRewarded(object sender, Reward args) {
        //報酬受け取り時の処理
        rewardedHandler();
    }

    public void HandleRewardBasedVideoClosed(object sender, EventArgs args) {
        //動画を閉じたときに、次の動画を読み込む
        if(!rewardBasedVideo.IsLoaded()) {
            rewardBasedVideo.LoadAd(adRequest, adUnitId); // Load
        }
    }

    public void HandleRewardBasedVideoLeftApplication(object sender, EventArgs args) {}
}

参考にしたサイト

DjangoのMyチートシート(随時更新予定)

Djangoでよく調べなおすので、個人的なチートシート

Model

リレーション

ref: 【django】多対多の (many-to-many) リレーション - metabo346の日記

クエリー

ref: クエリーセットのfilterメソッド - at_yasuの日記もといメモ書き ref: Django の order_by の 注意点 - Qiita

マイグレーション

ref: マイグレーション | Django documentation | Django

View

refs: Django shortcut functions | Django documentation | Django

Template

組み込み

ref: 組み込みタグとフィルタ | Django documentation | Django

カスタム

ref: Djangoのテンプレートで、キーに変数を指定して辞書にアクセス - Misc Notes

PythonのMyチートシート(随時更新)

Pythonでよく調べなおすので、個人的なチートシート

map, filter

items = [1, 2, 3]
map(lambda n:n+20, items)
# => [21, 22, 23]

[x+20 for x in items] 
# => [21, 22, 23]


filter(lambda n:n%2==1, items)
# => [1, 3]

[x for x in items if x%2==1]
# => [1, 3]

ref: map, reduce, filterによるシーケンス操作 | Python Snippets

文字列

フォーマット

num =5
"{0}, {0:02d}".format(num)
#=> '5, 05'

ref: format関数による文字列フォーマット(新しい形式 / 3.6対応) | Python Snippets ref: 2. 字句解析 — Python 3.6.1 ドキュメント

文字列リストを連結

words = ['This', 'is', 'a', 'pen']
print ' '.join(words)
# => This is a pen

ref Pythonで文字列リストを連結 - 超言理論

URLエンコード

import urllib
import urlparse

# Encode
urllib.parse.quote("テスト")
# => %E3%83%86%E3%82%B9%E3%83%88

# Decode
urllib.parse.unquote("%E3%83%86%E3%82%B9%E3%83%88")
# => テスト

ref: PythonのURLとクエリパラメータのパースまとめ - Qiita

日付

要素の取得

import datetime
now = datetime.datetime.now()
now.year
now.month
now.day
now.hour
now.minute
now.second
now.microsecond
datetime.weekday()    # 月曜日を 0、日曜日を 6 として、曜日を整数で返す

date = now.date()     # date
time = now.time()     # TimeZoneなしのtime
timetz = now.timetz() # TimeZoneありのtime


# timedelta
delta = datetime.timedelta()
delta.days            # 日
delta.seconds         # 秒
delta.microseconds    # ミリ秒
delta.total_seconds() # この期間に含まれるトータルの秒数を返します。td / timedelta(seconds=1) と等価です。

ref 8.1. datetime — 基本的な日付型および時間型 — Python 3.6.1 ドキュメント

フォーマット

import datetime
now = datetime.datetime.now()
now.strftime("%Y/%m/%d %H:%M:%S")
# => '2012/01/01 20:29:39'
DIRECTIVE MEANING
%Y 上 2 桁付きの西暦年を表す 10 進数。
%m 月を表す 10 進数 [01,12]。
%d 月の始めから何日目かを表す 10 進数 [01,31]。
%H (24 時間計での) 時を表す 10 進数 [00,23]。
%M 分を表す 10 進数 [00,59]。
%S 秒を表す 10 進数 [00,61]。
%a ロケールにおける省略形の曜日名。
%b ロケールにおける省略形の月名。

ref 日付フォーマット(datetime⇔文字列) | Python Snippets

加算・減算

# $ pip install dateutils
import datetime
from dateutil.relativedelta import relativedelta
datetime.datetime(2016, 12, 1) + relativedelta(months=1)  #年をまたいだ1ヶ月加算
datetime.datetime(2017, 1, 1, 0, 0)

ref 日付に月単位で加算減算する (relativedelta) | Python Snippets

基本

例外

""" 例外ハンドリング"""
try:
  # [失敗して例外名1もしくは例外名2の例外を発生させる可能性のある処理(関数呼び出し)...]
except [例外名1] as [例外オブジェクト1]:
  # [例外名1の例外が発生した場合の処理...]
except [例外名2] as [例外オブジェクト2]:
  # [例外名2の例外が発生した場合の処理...]
# ...
else:
  # [いずれの例外も発生しなかった場合の処理...]

"""例外の発生"""
raise [例外名] ([引数...])


"""ユーザ定義例外"""
class MyException (Exception):
  def __str__ (self):                      # エラーメッセージ
    return ('MyException')

ref: Pythonの例外とその処理に関する覚え書き(ユーザ定義の例外など) - 試験運用中なLinux備忘録

参考にしたサイト様