masa's blog

Masa's Gamesの開発ブログ

FirestoreとFunctionsでシンプルなカウンターを作る

概要

アクセスカウンターのように認証なしでカウントする機能をFirebaseで提供されているFirestoreとFunctionsで実現します。
HTTPトリガーを利用して、/counterにアクセスする度に数値が増えていくようにします。

環境

Firebaseのプロジェクト作成や環境構築についてはここでは割愛します。
無料プランではFunctionsが利用できないようなのでご注意ください。

方法

Firestore

まず、Firestoreに数値を保持するデータを作成しておきます。
ここでは適当に以下のように作成しました。

counter: {
  counter: {
    count: 0
  }
}


Functions

functions/index.jsに関数を作成してデプロイします。

const functions = require("firebase-functions");
const firebase = require("firebase-admin");

firebase.initializeApp();

exports.counter = functions.https.onRequest(async (request, response) => {
  const docRef = firebase.firestore().collection("counter").doc("counter");
  await docRef.update({
    count: firebase.firestore.FieldValue.increment(1),
  }, {merge: true});
  return docRef.get().then((s) => {
    response.send(s.data().count.toString());
  });
});

FieldValue.incrementで指定した分だけ数値を増加させることができます。
トランザクション処理も特に気にしなくてよいので便利です。
https://firebase.blog/posts/2019/03/increment-server-side-cloud-firestore

ただし、更新頻度は最大で1回/1秒ということなので、用途によっては注意が必要かもしれません。
https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja

サーバーサイドからFirestoreを操作する形なので、ルールはデフォルトのallow read, write: if false;のままで大丈夫です。

動作確認

デプロイした関数のurlにアクセスすると数値が増えていきます。

UnityのiOSビルドでMissing signing identifier at ".../UnityFramework.framework/Frameworks/libswiftCore.dylib"と出てValidateできない

環境

  • Unity 2021.3.12f1
  • Xcode 14.2
  • Admob SDK 7.1.0

問題

UnityでiOSビルドしたものをXcodeで開きApp Store ConnectにアップロードするためにValidateしたところ、タイトルのエラーが発生

Missing signing identifier at ".../Frameworks/UnityFramework.framework/Frameworks/libswiftCore.dylib".


Failed to cloud sign ".../Frameworks/UnityFramework.framework/Frameworks/libswiftCore.dylib". Please file a bug report at https://feedbackassistant.apple.com.

解決方法

https://developer.apple.com/forums/thread/711238
原因は不明ですが、上記の回答で解決しました。
スクリーンショットのように、AVFoundation.frameworkを赤い矢印の-ボタンで一度削除してから+ボタンで追加し直して再度Validateします。

【Unity】DOTweenでシーク的なことをする


概要

DOTweenはUnityで簡単にアニメーションを作れるアセットです。
DOTweenのアニメーションに対して、YouTubeのシークバーのようにプレイヤーが再生位置を調整できるようにしたい場面があったので、その実装方法について書いていきます。

方法

GoToメゾットを使えば、時刻(秒)で再生位置を指定できます。
ここでは、Sliderをシークバーにして、EventTriggerもアタッチしてマウスを離したタイミングで再びPlayされるようにしています。

ソースコード

using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class SeekSample : MonoBehaviour
{
    public Transform cube;
    public Slider slider;

    private Sequence sequence;

    void Start()
    {
        //適当なアニメーションを作成
        sequence = DOTween.Sequence()
            .Append(cube.DOShakeRotation(3.0f))
            .Join(cube.DOJump(cube.position, 2.0f, 3.0f, 3.0f))
            .SetAutoKill(false);
    }

    void Update(){
        slider.SetValueWithoutNotify(sequence.position / sequence.Duration());
    }

    public void OnSliderValueChanged(){
        sequence.Goto(slider.value * sequence.Duration());
    }

    public void OnPointerUp(){
        sequence.Play();
    }
}

余談

以下のゲームでは、実際にこの方法を使っています。
masasgames.com

【Blender】細分化を適用しつつ一部の辺だけシャープにする

概要

Subdivision SurfaceのModifierを使うとオブジェクトを滑らかにできます。
この時、一部の辺だけはシャープなままにしたいことがよくあります。

環境

Blender 3.0.1

方法

クリースを使います。

  1. シャープにしたい辺を選択(複数選択も可能)
  2. [N]キーを押して右側のメニューを開く
  3. Itemタブの、Edges Data → Mean Creaseを調整

1.0にすると完全にシャープになります。

【Unity】数値の増減ボタンで%(あまり)を使って一周したら戻るようにする


概要

パスコードを入力させるときによくある数値の増減ボタンで、9の状態で↑を押したら0、0の状態で↓を押したら9になるように、一周したら戻ってくる仕様にするとボタンを押す回数が減って入力が楽になります。
if文で簡単に実装できますが、今回は%(あまり)を使ってより簡単に実装する方法を書きます。

結論

↑を押したらOnClickUpButton、↓を押したらOnClickDownButtonが呼ばれることを想定しています。

public class NumberUpDown : MonoBehaviour
{
    public Text text;
    public int value = 0;

    public void OnClickUpButton(){
        value = (value + 1) % 10;
        text.text = value.ToString();
    }

    public void OnClickDownButton(){
        value = (value + 9) % 10;
        text.text = value.ToString();
    }
}

解説

増加時(7行目)

ここは直感的だと思います。
(value + 1)が1~9のときは、1 % 10 = 1, ..., 9 % 10 = 9なので普通に1を足した時と変わりません。
(value + 1)が10になるタイミングで、10 % 10 = 0となり、0に戻ってきます。

減少時(12行目)

1減らすのに9を足すという直感的でないことをしていますが、計算してみると

  • value = 9のとき、(value + 9) % 10 = 18 % 10 = 8
  • value = 8のとき、(value + 9) % 10 = 17 % 10 = 7
  • value = 7のとき、(value + 9) % 10 = 16 % 10 = 6

のように、確かに1ずつ減っていきます。
また、value = 0のとき、
(value + 9) % 10 = 9 % 10 = 9
なので、一周して9に戻ります。

(value - 1) % 10じゃダメなの?

C#の仕様では-1 % 10 = -1なので、0から減少させたとき9に戻らなくなってしまいます。

数字が10種類でない場合は?

今回は0~9の10種類の数字を使うことを想定しましたが、それ以外の場合でも同じ方法が使えます。
N種類の数字を使う場合、

とすればよいです。