そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】Humanoid型モデルで使用するAnimationClipのキーフレームをスクリプトから変更する方法 SetCurve モバイル不可

はじめに

Humanoid型モデルのアニメーションをスクリプトから行いたかったのでメモ

私の調べた結果ですと、
Humanoid型モデルのアニメーションを変更できるのはエディター内のみで、
モバイル上で変更する方法は無いようです。

前提知識

AnimationClipは、特定のプロパティ(Transformなど)の
数値を登録することで、アニメーションさせています。

Hunanoide型のキャラクターをアニメーションさせる場合には、
キャラクターの各ボーンの角度ではなく、マッスル値で設定するのが一般的なようです。
(私は調べるまでボーンの角度を調整していると思っていました...)

↓これは、あるポーズのAnimationClipの設定画面です。
 Animatorの中のマッスル値が登録されています。
f:id:marumaro7:20220310054457p:plain:w200

マッスル値に関してはこちらの記事に書いています。

marumaro7.hatenablog.com

キーフレームをスクリプトから変更

方法は簡単で次の2ステップです。
1.AnimationCurveで変化内容を設定
2.AnimationClip.SetCurveで変化内容を適用

AnimationClipへの「指定したプロパティのキーフレーム」は、
AnimationClip.SetCurveで変更することができます。

docs.unity3d.com

このSetCurveで指定したプロパティがAnimationClipに
存在するかどうかで挙動は少し変わります。
・同じプロパティ無:AnimationClip内に新規作成
・同じプロパティ有:内容の更新

サンプル

3種類のマッスル値をAnimationClipに追加するスクリプトです。

public AnimationClip animationClip;//変更するアニメーションクリップを割り付け

public void Test()
{
     //animationClip = new AnimationClip();//アニメーションクリップを作成 スクリプト内でAnimationClipを新規作成する場合
     //値の変化を設定
        //Linear⇒直線的な変化
        //引数(開始時間, 開始値, 終了時間, 終了値)
        AnimationCurve curve1 = AnimationCurve.Linear(0, 0.5f, 0, 0);
        AnimationCurve curve2 = AnimationCurve.Linear(0, 0.5f, 0, 0);
        AnimationCurve curve3 = AnimationCurve.Linear(0, 0.5f, 0, 0);

        //アニメーションカーブの中にキーフレームを追加(必要であれば)
        //引数(時間, 値)
        //時間:キーを追加する時間(カーブグラフにおける水平軸)
        //値 :キーの値(カーブグラフにおける垂直軸)
        //Keyframe key = new Keyframe(10f, 10f);


        //アニメーションカーブ1にキーフレームを追加(必要であれば)
        //curve1.AddKey(key);

        //アニメーションクリップにアニメーションカーブをセット
        //引数(パスの指定, タイプ, 操作項目名, アニメーションカーブ)
        //SetCurveはユニティ上ではできるがモバイル実機ではできない 公式に記述あり https://docs.unity3d.com/ScriptReference/AnimationClip.SetCurve.html
        animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[1], curve1);
        animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[2], curve2);
        animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[4], curve3);
}

空のAnimationClipを使ってこちらのコードを実行すると、
アニメーションクリップ内に指定したプロパティのキーフレームを打つことができます。
注意:AnimationClipの内容は保存されます。 f:id:marumaro7:20220311054156p:plain

1.AnimationCurveで変化内容を設定

AnimationCurve型の変数を宣言し内容を設定します。
AnimationCurve.カーブの種類(開始時間, 開始値, 終了時間, 終了値); で設定します。  

AnimationCurve curve1 = AnimationCurve.Linear(0, 0.5f, 0, 0);

2.AnimationClip.SetCurveで変化内容を適用

AnimationClipにアニメーションカーブをセットします。
AnimationClip.SetCurve(パスの指定, プロパティの型, 操作項目名, アニメーションカーブ)で設定します。

animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[1], curve1);

引数1:パスの指定
""で自動的に現在のパスが割り付けられるので""で問題ありません。

引数2:プロパティの型
今回設定するマッスル値は、Animatorの中の値なのでAnimatorと書きます。

引数3:操作項目名
"引数2"で設定したプロパティの型の中のどの項目の数値を変更・追加するかをを設定します。
今回、型はAnimatorの中のマッスル値を設定したいので、マッスル値の名前を設定します。
マッスル値の名前は、
HumanTrait.MuscleName[マッスル値の配列番号]
で取得することができます。

引数4:アニメーションカーブ
「1.AnimationCurveで変化内容を設定」で設定したAnimationCurveの情報を入れます。

補足:アニメーションカーブにキーフレームを追加

私は使用していないので紹介のみですが、
サンプルでコメントアウトしている下記のコードで
アニメーションカーブの中にキーフレームを追加できるようです。

      //アニメーションカーブの中にキーフレームを追加(必要であれば)
        //引数(時間, 値)
        //時間:キーを追加する時間(カーブグラフにおける水平軸)
        //値 :キーの値(カーブグラフにおける垂直軸)
        //Keyframe key = new Keyframe(10f, 10f);


        //アニメーションカーブ1にキーフレームを追加(必要であれば)
        //curve1.AddKey(key);

モバイル不可

今回使用したAnimationClip.SetCurveをモバイルで使用するには、
このコードを追加する必要があります。([詳細は公式参照]
(https://docs.unity3d.com/ScriptReference/AnimationClip.SetCurve.html))

animationClip.legacy = true;

しかし、この設定は、
AnimationClipを 廃止予定であるAnimationコンポーネントで使用するためのものです。
Animationコンポーネントではマッスル値は対応していないようで追加ができませんでした。

逆にAnimationコンポーネントで制御できるプロパティであれば、
モバイルからでも設定変更ができます。

余談

全然関係ないですが、
SpriteRendererをアニメーションさせる場合の
PropertyNameは”m_Size.x”のように m _が必要なようです。

プロパティ名は予測変換ではでなかったので、
一旦手動でアニメーションを作ってプロパティ名を確認する作業が必要です。

参考
teratail.com

おわりに

モバイルで動作させたかったのですが、現状無理なようでとても残念でした。
できないことがわかったということで良しとしています。

もし、AnimatorのAnimationClipのプロパティをモバイルから変更する方法を
ご存知の方がいらっしゃいましたら情報お待ちしています。


また、Animationコンポーネントのアニメーションならモバイルで設定できるわけですが、
それなら神アセットのDoTween使えばいいやと思っています。

エディター上でアニメーション作る際、今回の知見が使えそうですが、
自分で環境整えるより、Very Animationを使った方が遥かに早そうです。

assetstore.unity.com

他の記事

marumaro7.hatenablog.com

参考

www.natsuneko.blog

teratail.com

buravo46.hatenablog.com

learning-collection.com

mebiustos.hatenablog.com

【Unity】Humanoid型アバターのマッスル値をスクリプトから変更してポーズ変更する

はじめに

Humanoid型アバターの姿勢変更について調べたメモです。

Humanoid型アバターの姿勢を変更する方法として
私が把握しているのは次の2つです。
・マッスル値を変更する
・ボーンの角度を変更する

今回はマッスル値による姿勢の変更について書きます。

ちなみにボーンの角度変更はこちらで可能です。

marumaro7.hatenablog.com

マッスル値とは?

Unity上ではmusclesという値です。

マッスル値は、文字通り筋肉の収縮を制御するイメージです。
-1 ~ +1の値となっており、人間の骨格ルールが適用されたものになっています。

例えば、左膝(Left Lower Leg Stretch)の設定を変えた場合はこのようになります。

・マッスル値 -1
 限界まで曲げる

・マッスル値 0
  -1と+1の中間

・マッスル値 +1
 限界まで伸ばす

このように -1 〜 +1 の値の範囲であれば、
骨格的にありえないポーズにならないようにしてくれる仕組みです。

ちなみに使いどころはあまり無いかと思いますが、
-1 〜 +1を超えた入力もできます。
(例)マッスル値 -1.62
 足がヤバい方向に・・・
 



マッスル値の種類ですが、こちらの95個から構成されています。
gist.github.com

スクリプトからのマッスル値変更

では、スクリプトからマッスル値を変更していきます。

具体例

サンプルから載せます。
ボタンを押すことで現状のポーズを取得し、
スライダーで左足のマッスル値を-1~+1の範囲で変更しています。

前提
アバターが設置されている
アバターにAnimatorが設定されている
・Animatorにアニメーションが設定されている
・ボタンが設置されている
・スライダーが設置されている

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

public class MusclesTest : MonoBehaviour
{
    public Slider slider;//操作するスライダーを割り当て スライダーの値は-1~+1の範囲設定にして下さい。
    public Animator animator;//対象のキャラクターのAnimatorコンポーネントを割り当て

    private HumanPoseHandler humanPoseHandler;
    private HumanPose humanpose;

    private bool isSetPose = false;//ポーズがセットされたかどうか
   
    //この関数をボタンに割り付け
    public void AAA()
    {
        humanPoseHandler = new HumanPoseHandler(animator.avatar, animator.transform);
        humanpose = new HumanPose();

        humanPoseHandler.GetHumanPose(ref humanpose);//現状のマッスル値を取得   なぜかアバターのY方向が180度回転する トランスフォームの値が変わるわけではない
        humanPoseHandler.SetHumanPose(ref humanpose);//マッスル値をセット      GetHumanPoseで回転→SetHumanPose回転しない→GetHumanPoseで回転するので回転を相殺するため GetHumanPoseを2回呼ぶ  ※GetHumanPoseを連続しても変わらない
        humanPoseHandler.GetHumanPose(ref humanpose);//現状のマッスル値を取得

        animator.enabled = false;//Animatorをオフ Animatorで実行しているアニメーションが優先されるためオフにする
        isSetPose = true;//マッスル値を取得してからtrueにする
    }

    
    void Update()
    {
        if (isSetPose == true)
        {
            //マッスル値の値を変更
            //今回は配列[21]でLeft Upper Leg Front-Backを動かす。
            //musclesの配列番号の対応はこちらを参考
            //https://gist.github.com/neon-izm/0637dac7a29682de916cecc0e8b037b0#file-humantrait-musclenames-csv
            humanpose.muscles[21] = Mathf.Clamp(slider.value, -1.0f, 1.0f);

            humanPoseHandler.SetHumanPose(ref humanpose);//マッスル値をセット
        }       
    }
}

このコードで動かしたものがこちら

処理流れ

処理の流れです。
マッスル値は、アバターが持っている
HumanPoseHandlerの中のHumanPoseの中に入っています。

なので、下記のように処理します。
1.アバターからHumanPoseHandlerを取得
2.HumanPoseHandlerからHumanPoseを取得
3.HumanPoseが持っているマッスル値を変更
4.変更したマッスル値を適用

1.アバターからHumanPoseHandlerを取得

HumanPoseHandlerを取得するのに必要な
第一引数:Avatar
第二引数:Transform
の情報をアバターに割りついているAnimatorから取得します。

HumanPoseHandler humanPoseHandler = new HumanPoseHandler(animator.avatar, animator.transform);

2.HumanPoseHandlerからHumanPoseを取得

HumanPoseHandlerからポーズ情報を取得します。
取得はGetHumanPosed(引数はHumanPose型)で行います。

humanPoseHandler.GetHumanPose(ref humanpose);

refは参照渡しの意味なので、これを実行することでhumanposeの変数が更新されます。

3.HumanPoseが持っているマッスル値を変更

マッスル値の変更は下記で変更しています。

humanpose.muscles[マッスル値の配列番号] =  マッスル値の値;



今回のサンプルコードでは、
配列番号[21]のLeft Upper Leg Front-Back のマッスル値を変更しています。
また、Mathf.Clampクラスを使用し、 下限の値と上限の値を設定しています。
(スライダーの範囲設定を-1~+1にしているので、
今回はMatuf.Clampは無くても同じ挙動になります。)

humanpose.muscles[21] = Mathf.Clamp(slider.value, -1.0f, 1.0f);

4.変更したマッスル値を適用

最後にHumanPoseHandlerに設定したポーズ情報を反映します。
反映は、SetHumanPose(引数はHumanPose型)で行います。

humanPoseHandler.SetHumanPose(ref humanpose);

refは参照渡しの意味なので、これを実行することでhumanposeの変数が更新されます。


追記 マッスル値列挙型

マッスル値の列挙型を載せておきます。

// マッスル値の列挙型
    public enum Muscle_TYPE
    {
        SpineFrontBack = 0,
        SpineLeftRight = 1,
        SpineTwistLeftRight = 2,
        ChestFrontBack = 3,
        ChestLeftRight = 4,
        ChestTwistLeftRight = 5,
        UpperChestFrontBack = 6,
        UpperChestLeftRight = 7,
        UpperChestTwistLeftRight = 8,
        NeckNodDownUp = 9,
        NeckTiltLeftRight = 10,
        NeckTurnLeftRight = 11,
        HeadNodDownUp = 12,
        HeadTiltLeftRight = 13,
        HeadTurnLeftRight = 14,
        LeftEyeDownUp = 15,
        LeftEyeInOut = 16,
        RightEyeDownUp = 17,
        RightEyeInOut = 18,
        JawClose = 19,
        JawLeftRight = 20,
        LeftUpperLegFrontBack = 21,
        LeftUpperLegInOut = 22,
        LeftUpperLegTwistInOut = 23,
        LeftLowerLegStretch = 24,
        LeftLowerLegTwistInOut = 25,
        LeftFootUpDown = 26,
        LeftFootTwistInOut = 27,
        LeftToesUpDown = 28,
        RightUpperLegFrontBack = 29,
        RightUpperLegInOut = 30,
        RightUpperLegTwistInOut = 31,
        RightLowerLegStretch = 32,
        RightLowerLegTwistInOut = 33,
        RightFootUpDown = 34,
        RightFootTwistInOut = 35,
        RightToesUpDown = 36,
        LeftShoulderDownUp = 37,
        LeftShoulderFrontBack = 38,
        LeftArmDownUp = 39,
        LeftArmFrontBack = 40,
        LeftArmTwistInOut = 41,
        LeftForearmStretch = 42,
        LeftForearmTwistInOut = 43,
        LeftHandDownUp = 44,
        LeftHandInOut = 45,
        RightShoulderDownUp = 46,
        RightShoulderFrontBack = 47,
        RightArmDownUp = 48,
        RightArmFrontBack = 49,
        RightArmTwistInOut = 50,
        RightForearmStretch = 51,
        RightForearmTwistInOut = 52,
        RightHandDownUp = 53,
        RightHandInOut = 54,
        LeftThumb1Stretched = 55,
        LeftThumbSpread = 56,
        LeftThumb2Stretched = 57,
        LeftThumb3Stretched = 58,
        LeftIndex1Stretched = 59,
        LeftIndexSpread = 60,
        LeftIndex2Stretched = 61,
        LeftIndex3Stretched = 62,
        LeftMiddle1Stretched = 63,
        LeftMiddleSpread = 64,
        LeftMiddle2Stretched = 65,
        LeftMiddle3Stretched = 66,
        LeftRing1Stretched = 67,
        LeftRingSpread = 68,
        LeftRing2Stretched = 69,
        LeftRing3Stretched = 70,
        LeftLittle1Stretched = 71,
        LeftLittleSpread = 72,
        LeftLittle2Stretched = 73,
        LeftLittle3Stretched = 74,
        RightThumb1Stretched = 75,
        RightThumbSpread = 76,
        RightThumb2Stretched = 77,
        RightThumb3Stretched = 78,
        RightIndex1Stretched = 79,
        RightIndexSpread = 80,
        RightIndex2Stretched = 81,
        RightIndex3Stretched = 82,
        RightMiddle1Stretched = 83,
        RightMiddleSpread = 84,
        RightMiddle2Stretched = 85,
        RightMiddle3Stretched = 86,
        RightRing1Stretched = 87,
        RightRingSpread = 88,
        RightRing2Stretched = 89,
        RightRing3Stretched = 90,
        RightLittle1Stretched = 91,
        RightLittleSpread = 92,
        RightLittle2Stretched = 93,
        RightLittle3Stretched = 94
    }

GetHumanPoseをするとキャラクターの向きが180度反転します。
・キャラクターのトランスフォームの値は変わっていない
・humanpose.bodyRotationでキャラクターの回転情報?を見てみると
 同じポーズでもGetHumanPoseをするたびに数値が変わっていました。

今は無理矢理2回呼び出して修正している感じです。
改善点ご存知の方がおられましたらご指導お願い致します。

余談

アバターの設定をミスったときによくみるこの中腰のポーズ

これはマッスル値の値がすべて0のときのポーズになっています。

ずっと「なんでこのポーズなんだろう?」と思っていたので謎が解けてスッキリしました。

Unity本を出版しました!

突然ですが、Unity本を出版しました!
こちらを読むことで、スクリプトの基礎固めができます!
現在、kindle unlimitedで読み放題設定中です。今のうちにどうぞ!


もっと早く教えてほしかった!Unity C#入門

他の記事

marumaro7.hatenablog.com

参考

zenn.dev

docs.unity3d.com

docs.unity3d.com

【Unity】Humanoid型で設定されたボーンを取得して回転させる GetBoneTransform

はじめに

Humanoid型のアバターで設定されているボーンを動かしたかったのでメモ

具体例

まずは左膝を回転させる具体例

  //操作したいアバターに付けているのAnimatorコンポーネントを割り付け
    [SerializeField] private Animator anim;

    public void BoneRotateTest()
    {
        //トランスフォームコンポーネントの変数を宣言
        Transform leftLowerLeg;

        //左膝に設定されているTransformを取得
        leftLowerLeg = anim.GetBoneTransform(HumanBodyBones.LeftLowerLeg);

        //回転
        leftLowerLeg.Rotate(new Vector3(0, 0, 60f));
    }

詳細

指定したボーンのTransformコンポーネントは、
Animatorコンポーネントに入っている情報からGetBoneTransformで取得が可能です。

Animator.GetBoneTransform(指定したボーン);


指定のボーンはHumanBodyBonesの列挙型で指定することができます。

HumanBodyBones.対象部位



対象部位はこちらで確認するとわかりやすいです。
引用: Unity Humanoid Avatarの解説 [VirtualCast]

f:id:marumaro7:20220307060511p:plain

注意

アニメーション実行中はボーンの操作ができません。
簡易的に試すならAnimatorコンポーネントをオフにすることで動かすことができます。

参考

www.hanachiru-blog.com

kan-kikuchi.hatenablog.com

docs.unity3d.com

docs.unity3d.com

【Unity】ScrollViewにEventTriggerコンポーネントを付けるとスクロールしなくなる現象の対応

はじめに

タイトル通りでScrollViewのスクロールさせる要素に
EventTriggerコンポーネントを付けたところスクロールしなくなりました。

現象はこちらのぱふさんの記事がわかりやすいです。

pafu-of-duck.hatenablog.com

記事内ではEventTrigger の PointerClickを使用されていますが、
私の場合、PointerDown、PointerUpを使用したかったのでメモします。

対応

下記のスクリプトをスクロールの要素に付ける

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

public class ListEventTrigger : MonoBehaviour,  IPointerDownHandler, IPointerUpHandler
{

    //触った時
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        //処理
    }

    //指を離した時
    public void OnPointerUp(PointerEventData pointerEventData)
    {
        //処理
    }
}

他のコールバック受け取り

EventTriggerの他のコールバックを受け取りたいときは、
リファレンスの左側 Interfacesの項目から例文を使うと良いです。

docs.unity3d.com

f:id:marumaro7:20220225053819p:plain

【Unity】2022年 AdMobのUnityAdsメディエーション設定 

はじめに

2022年 AdmobにおけるUnityAdsのメディエーション実装の備忘録です。

過去記事
marumaro7.hatenablog.com

バージョン

GoogleMobileAds-v6.1.2
GoogleMobileAdsUnityAdsMediation-2.7.2

2022年8月6日追記
GoogleMobileAds-v7.0.2
GoogleMobileAdsUnityAdsMediation-3.2.1
にて動作確認

説明書

前回と同様に説明書に沿って進めます。
・コード初期化 developers.google.com

・設定 developers.google.com

説明書「ステップ1:Unity広告を設定する」のつまづきポイント

このステップでは、
・GameIDs (ゲームID)
・PlacementID (配置ID)
API Key
・Organization core ID (組織コアID)
の取得方法が説明されています。(これらは後の設定で必要)

下記の方法で取得できます。

GameIDs (ゲームID)

Monetization→Enable Adsを押す。



設定ウインドウが出てくるので、私は下記の設定で進めました。
・MediationPartnerはThird Party Mediationを選択
・Mediation Partnerの選択欄はAdMob Mediationを選択
→OK Third party mediationの欄の訳はこちら

アイアンソースやアドモブなどのサードパーティメディエーションパルトフォームを使用して、アドソースからプロジェクトに広告を配信しています。

すると、iOSAndroidのGameIDsが表示されます。

PlacementID (配置ID)

広告設定 名前変更 (読まずに飛ばしてOK)

同様の画面でこのような画面となり、既に広告が作られている。 PlacementID取得の前に広告の名前を変えておきます。


このままでも問題なさそうですが、広告の名前を変えておきたいので
変えたい広告の種類をクリックして変更していきます。
今回はAndroidのリワード広告をクリック。



変えたい項目があれば、右のペンマークで変更可能です。
今回は名前だけ変更しました。

PlacementIDの場所

PlacementIDはPlacementsの各広告のIDのところに表示されています。




PlacementIDを変更したい場合は、
Add Placementを押して、




→Placement Nameを入力(自動的にPlacementIDも同じ文字列になります。)
→backfill/auto-eCPM Placement(単価の自動設定) にチェック
→Add Placement




そして、もともとある広告をArchiveすることで変更(置き換え)することができます。

API Key

API Keyの場所はここです。
→Monetization
→Setup
API Management

Organization core ID (組織コアID)

Organization core IDはここです。
→Monetization
→Setup
→Organization Settings

API Key と Organization core ID (組織コアID)の設定場所

次の2つの情報はメディエーション→広告のソース→編集で設定します。
API Key
・Organization core ID (組織コアID)の設定場所

説明書「ステップ5:実装をテストする」のつまづきポイント

Test Modeのメニューはこちらです。
→Monetization
→Settings →一番下にスクロールするとあります。

ビルドエラー対応<追記>

↓のようなエラーが大量に出たので対応しました。
(UnityAds入れてないのですが重複エラーになっているのはなぜ)

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':launcher:checkReleaseDuplicateClasses'. 1 exception was raised by workers: java.lang.RuntimeException: Duplicate class com.unity3d.ads.BuildConfig found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5) Duplicate class com.unity3d.ads.IUnityAdsInitializationListener found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5) Duplicate class com.unity3d.ads.IUnityAdsListener found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5) Duplicate class com.unity3d.ads.IUnityAdsLoadListener found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5) Duplicate class com.unity3d.ads.IUnityAdsShowListener found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5) Duplicate class com.unity3d.ads.UnityAds found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5) Duplicate class com.unity3d.ads.UnityAds$1 found in modules jetified-UnityAds-runtime.jar (:UnityAds:) and jetified-unity-ads-3.7.5-runtime.jar (com.unity3d.ads:unity-ads:3.7.5)

対処方法1<追記>

説明書の通り対応します。

説明書に書いてある通り、こちらのファイルを開きます。 Assets/GoogleMobileAds/Editor/UnityMediationDependencies.xml

参考情報:xmlコメントアウト

 <!--コメントアウトする内容-->

↓実際のコード 中段のコードをコメントアウトしただけです。

<dependencies>
  <androidPackages>

    <androidPackage spec="com.google.ads.mediation:unity:3.7.5.0">
      <repositories>
        <repository>https://repo.maven.apache.org/maven2/</repository>
        <repository>https://dl.google.com/dl/android/maven2/</repository>
      </repositories>
    </androidPackage>

    <!-- If using the Unity Ads Service from Unity3D, comment out this dependency to avoid
    including the Unity Android SDK twice. -->

    <!--Unityadsが重複したのでコメントアウトする-->
    <!--
    <androidPackage spec="com.unity3d.ads:unity-ads:3.7.5">
      <repositories>
        <repository>https://repo.maven.apache.org/maven2/</repository>
      </repositories>
    </androidPackage>
    -->
    

  </androidPackages>

  <iosPods>
    <iosPod name="GoogleMobileAdsMediationUnity" version="3.7.5.0">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

対処方法2<追記>

対処方法1の方でビルドは通るようになりましたが、
広告が表示されなくなってしまいました。
対処方法1で行ったコードは元に戻してください。

少し調べてみると、PakagesのAdvertisementの中にUnityAdsが入っていました。
(訳もわからずいれたやつです。)

UnityAdsはメディエーションのコネクター?を入れるだけで動作するので
パッケージマネージャーから検索してこれを削除します。

これでビルドしたところ、ビルドが通り、広告も問題なく表示されました。

おわりに

残りは手順通り進めて
無事に新アプリリリース前に広告を表示することができました。

ちなみに
「UnityAdsサービスでのUnityアダプターの使用」は、
プロジェクト内にUnityAdsを実装していないので実施していません。

marumaro7.hatenablog.com

【Unity】共有アセットNatShareビルドエラー  AdMobプラグインとの競合を解消する方法

はじめに

共有アセットを探していたら
「NatShare」なる評価が高め共有アセットを見つけました。

試しにAdMobプラグインが入った状態でAndroidでビルドしてみると
エラーが出たので、その解消方法になります。

assetstore.unity.com

環境

・Unity2020.3.18f1
・NatShare1.2.5
・GoogleMobileAds-v6.1.2

エラー内容

f:id:marumaro7:20211216044746p:plain

原因

NatShareにandroidサポートライブラリ
 core-1.0.0-rc02.aar
が含まれています。
これはAdMobプラグイン(GoogleMobileAds-v6.1.2)
にも含まれているため競合エラーが発生します。

対策

NatShareのcore-1.0.0-rc02.aarを削除し、
インラインパッケージ化(埋め込みパッケージ化)すれば良いようです。

手順1.manifest.jsonからapi.natsuite.natshareを削除

エクスプローラー(Win)もしくは Finder(Mac )から
プロジェクトファイルの中の
Packages → manifest.json を開きます。

f:id:marumaro7:20211216051931p:plain

その中の

"api.natsuite.natshare":"1.2.5",

を削除し、ファイルをセーブします。

f:id:marumaro7:20211216052212p:plain

手順2.GitHubからNatShareをダウンロード

NatShareのGitHubのページから
NatShareのZIPファイルをダウンロードします。

github.com

f:id:marumaro7:20211216053938p:plain

手順3.ファイルからcore-1.0.0-rc02.aarを削除

ダウンロードしたファイルを解凍して開きます。

→Plugin
Androidから次の2つのファイルを削除します。
 core-1.0.0-rc02.aar.meta
 core-1.0.0-rc02.aar

f:id:marumaro7:20211216054412p:plain:w300

手順4.プロジェクトのパッケージフォルダへつっこむ!!!

ダウンロードして編集したフォルダを
プロジェクトのパッケージフォルダへつっこめば完了です。

つっこむ前にフォルダ名を変更します。(不要かも)
 変更前:NatShare-main-2
 変更後:NatShare

f:id:marumaro7:20211216060558p:plain:w300

このNatShareのフォルダを
エクスプローラー(Win)もしくは Finder(Mac )から
プロジェクトファイルの中の
Packagesフォルダ内へフォルダごとつっこみます。
(先程編集したmanifest.jsonファイルがあるフォルダです。)

f:id:marumaro7:20211216061859p:plain:w300

これで対策完了です。

確認

ビルドしてみたところ、問題無くビルドされました。

(最低APIレベル Android API level 24が必要です。) f:id:marumaro7:20211216060244p:plain

おわりに

まだビルドエラーを解決しただけなので、
正常に動くかはこれから試していきます。

参考

github.com

shibuya24.info

nobushiueshi.com

UnityAds 出金設定をしてみました。

はじめに

ちまちま貯めたUnityAdsの広告収入を確認したら100ドルを超えていたので
出金手続きをした備忘録です。

手続きメニューを開く

手続きメニューは、ユニティのダッシュボードから操作します。
ダッシュボードへは、私はいつもアセットストアから入っていますw

f:id:marumaro7:20211123093724p:plain


ダッシュボードを開いたら
→Monetization Ads
→Finance
→Go to Payout profile
をクリックします。

f:id:marumaro7:20211123093940p:plain


遷移先の画面でAdd profileで設定していきます。 f:id:marumaro7:20211123094251p:plain


2段階認証を有効にしろと言われるので設定します。 f:id:marumaro7:20211123094356p:plain:w400


二要素認証を有効にする
追加の支払いプロファイルを追加し、現在のプロファイルを編集するには、
2要素認証をアクティブ化する必要があります。

→Start setup
f:id:marumaro7:20211123094702p:plain:w400

→2段階認証コードの受け取り設定です。
 今回、私は電話番号を設定しました。 f:id:marumaro7:20211123094900p:plain:w400


2段階認証コードを受け取る電話番号を入力します。
番号が080-1234-5678であれば
8012345678といった具合に先頭の0は入力不要です。

f:id:marumaro7:20211123095003p:plain:w400

入力した電話番号に
認証コードが書かれたSMSが送られてくるのでそれを入力します。 f:id:marumaro7:20211123100216p:plain:w400



認証が終わると、このような2段階認証の設定画面になります。
f:id:marumaro7:20211123095550p:plain:w400


本来の目的である受け取り設定を行いたいので、
Organizations→Payout Profileから先ほどの設定画面に戻ります。
改めてAdd profileを押します。
f:id:marumaro7:20211123100110p:plain:w400


また認証コードの入力になるので、
再度送付された認証コードを入力します。
f:id:marumaro7:20211123100216p:plain:w400

すると、このような画面になるので、必要事項を入力します。
「Payment recipient is」(支払い先)は、
Company か Private individual(個人)の選択式なので
今回は個人を選択しました。 f:id:marumaro7:20211123101735p:plain

これでようやく支払い設定画面にこれました。
まずは、税務情報を入力していきます。
Payout Tax Infoの「Create」を押します。

税務情報

注意書きを読んでContinueを押します。
f:id:marumaro7:20211123102542p:plain:w400


個人情報を入力します。
最初の項目は個人を示す
「Individual / sole proprietor or single-member LLC *」
を選択しました。

「FirstName」は名前
「LastName」は名字を入力します。
f:id:marumaro7:20211123104029p:plain:w400



必須入力のところは自動で入力されていたのでそのままContinueしました。
f:id:marumaro7:20211123104631p:plain:w400



電子証明書の提供と情報報告文書の受け取りに同意 f:id:marumaro7:20211123105247p:plain:w400



あなたは米国居住者ですか的なことを聞かれるので「No」を選択
f:id:marumaro7:20211123105523p:plain:w400



「受益者のタイプ?」を聞かれますがIndividual(個人)が入力されており、
変更もできないのでこのままContinueします。 f:id:marumaro7:20211123105941p:plain:w400



サービス提供時の所在を聞かれるので米国外で実施にチェックします。 f:id:marumaro7:20211123110458p:plain:w400



米国で事業をしているか聞かれるので「No」をチェックしてContinueします。 f:id:marumaro7:20211123110819p:plain:w400



フォームが自動で入力されるので内容を確認して、Continueを押します。 f:id:marumaro7:20211123111143p:plain:w400



いろいろチェックボックスが出てくるので当てはまるものを選択します。
特に、「Capacity in which acting」が謎すぎるのですが、
こちらの情報から個人と書けば良いようなので「Individual」と書いておきました。

"Capacity in which acting" on the W-8BEN … - Apple Community

入力後、「Submit W-8BEN」を押して提出します。
f:id:marumaro7:20211123112529p:plain:w400


これで終了ですと言われるのでボタンを押します。 f:id:marumaro7:20211123112949p:plain:w400

支払い方法

次に、支払い情報を設定するので
「+Add payout method」を押します。
f:id:marumaro7:20211123113437p:plain:w400

支払い方法は銀行かPaypalを選択します。 f:id:marumaro7:20211123113709p:plain


銀行を選択すると、海外送金手数料が1500円とられるらしいので、
今回はPaypalで設定してみました。
f:id:marumaro7:20211123114344p:plain

これで設定完了です!
f:id:marumaro7:20211123114630p:plain

おわりに

まだ、設定をしただけで、
今後どのような形で日本円にしていくか決めていませんが、
進捗ということで共有しておきます。

<追記> 11/23に設定して12/30に入金されました! ご参考までに!