Unity3d C#でWeChatミニゲームのスクリーンショット共有機能を開発(ソースコード含む)

序文

共有はゲーム プロモーションの重要な基礎の 1 つであり、ゲーム コミュニケーションにおいて重要な役割を果たします。共有の意味にはさまざまな側面が含まれますが、最も重要なのはユーザー間のコミュニケーションと交流を促進することであり、同時にゲームのユーザー規模を拡大し、ゲーム側のユーザー粘度を高めることができます。
ここではまず、私が開発した小さなゲームを共有します (ご都合がよければ、クリックして体験してください)。
ここに画像の説明を挿入

以前、著者は「写真、友達の輪、その他の機能を共有するための WeChat ミニゲームを開発するための Unity3d C# 」もまとめました。必要な場合は、最初に確認できます。
フレンドとスクリーンショットを共有する機能は、ゲーム内の画面を直感的に共有・表示することができます。Object オブジェクト)または Canvas.toTempFilePathSync(Object オブジェクト))、具体的な実装は以下に説明されており、いくつかの制限があります。

達成

ここでは、ロビーの共有ボタンのスクリーンショット共有を例に挙げて説明します。つまり、ロビーに共有ボタン UI を配置し、クリックしてロビー内のシーンのスクリーンショットを撮り、それを共有します。ロビーの様子は以下の通りです。
ここに画像の説明を挿入

ここでは、シーン内の車両の近くの位置をキャプチャして共有したいと考えています。

ここに画像の説明を挿入

ここでの位置は、スコープを達成するために次のパラメータを制御する必要があります。

x = 0,
y = 0,
width = 375,
height = 300,
destWidth = 375,
destHeight = 300,

x はインターセプトされたキャンバスの左上隅の横座標 (つまり、スクリーンショットの開始 x 座標)、
y はインターセプトされたキャンバスの左上隅の縦座標 (つまり、スクリーンショットの開始 y 座標) );
width はインターセプトされたキャンバスの幅;
height はインターセプトされたキャンバスの高さ;
destWidth はターゲット ファイルの幅で、インターセプトされた部分はこの値に引き伸ばされるか圧縮されます;
destHeight はターゲット ファイルの高さです、インターセプトされた部分はこの値まで引き伸ばされるか、圧縮されます。

ここには落とし穴があって、以前 WX.GetSystemInfoSync(); を使って画面の幅と高さを取得していましたが、変換で得られた情報は携帯電話や開発ツールでは正しくありませんでした。自分でテストすることもできます。

var sys= WX.GetSystemInfoSync();
Debug.Log("screenWidth:" + sys.screenWidth);
Debug.Log("screenHeight:" + sys.screenHeight);
Debug.Log("windowWidth:" + sys.windowWidth);
Debug.Log("windowHeight:" + sys.windowHeight);

そして、Unity の画面情報を使用します。

 Debug.Log("UnityEngine.Screen.width;" + UnityEngine.Screen.width);
 Debug.Log("UnityEngine.Screen.height;" + UnityEngine.Screen.height);

共有画像のプレビューは基本的に長さと幅が等しいため、幅が広すぎると完全に表示されない場合があります。
ここに画像の説明を挿入

したがって、スクリーンショットの縦横は基本的に同じになるはずですが、ここでは上下中央の1/3の比率でスクリーンショットを撮ります。

          int ShareHeight = UnityEngine.Screen.height / 3;
            WXCanvas.ToTempFilePath(new WXToTempFilePathParam()
            {
    
    
                x = (Screen.width-ShareHeight) / 2,
                y = ShareHeight,
                width = ShareHeight,
                height = ShareHeight,
                destWidth = ShareHeight,
                destHeight = ShareHeight,
                success = (result) =>
                {
    
    
                    Debug.Log("ToTempFilePath success" + JsonUtility.ToJson(result));
                    WX.ShareAppMessage(new ShareAppMessageOption()
                    {
    
    
                        title = "这是你的标题",
                        imageUrl = result.tempFilePath,
                    });
                },
                fail = (result) =>
                {
    
    
                    Debug.Log("ToTempFilePath fail" + JsonUtility.ToJson(result));
                },
                complete = (result) =>
                {
    
    
                    Debug.Log("ToTempFilePath complete" + JsonUtility.ToJson(result));
                },
            });

送信による効果は以下の通りです。
ここに画像の説明を挿入

公式ドキュメントによると、次の同期方法も使用できます(著者は検証していません)。

           int ShareHeight = UnityEngine.Screen.height / 3;
            var tf = WXCanvas.ToTempFilePathSync(new WXToTempFilePathParam()
            {
    
    
                x = (Screen.width - ShareHeight) / 2,
                y = ShareHeight,
                width = ShareHeight,
                height = ShareHeight,
                destWidth = ShareHeight,
                destHeight = ShareHeight,
            });
            WX.ShareAppMessage(new ShareAppMessageOption()
            {
    
    
                title = "这是你的标题",
                imageUrl = tf,
            });

その他のパラメータ:
fileType 対象ファイルには jpg と png の 2 種類があり、デフォルトは png です。
品質 jpg 画像の品質。fileType が jpg の場合にのみ有効です。値の範囲は、0 を除く 0.0 (最低) ~ 1.0 (最高) です。範囲外の場合は 1.0 として扱われます。

特別な注意は、キャプチャされた画像は単なる一時ファイルであることです。つまり、現在のスクリーンショットに設定されているキャンバス (Canvas) が一時ファイルとして保存されます。
オープン データ ドメインが使用されている場合、生成されたファイルは次のインターフェイスでのみ使用できます。

wx.saveImageToPhotosAlbum、
wx.shareAppMessage、
wx.onShareAppMessage、
wx.previewImage、
wx.previewMedia、
wx.onShareTimeline、
wx.showShareImageMenu

おすすめ

転載: blog.csdn.net/qq_33789001/article/details/132109469