@@ -0,0 +1,110 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 27f253e451b91484b9dddd97028c0699 | |||||
TextureImporter: | |||||
fileIDToRecycleName: {} | |||||
externalObjects: {} | |||||
serializedVersion: 9 | |||||
mipmaps: | |||||
mipMapMode: 0 | |||||
enableMipMap: 0 | |||||
sRGBTexture: 1 | |||||
linearTexture: 0 | |||||
fadeOut: 0 | |||||
borderMipMap: 0 | |||||
mipMapsPreserveCoverage: 0 | |||||
alphaTestReferenceValue: 0.5 | |||||
mipMapFadeDistanceStart: 1 | |||||
mipMapFadeDistanceEnd: 3 | |||||
bumpmap: | |||||
convertToNormalMap: 0 | |||||
externalNormalMap: 0 | |||||
heightScale: 0.25 | |||||
normalMapFilter: 0 | |||||
isReadable: 0 | |||||
streamingMipmaps: 0 | |||||
streamingMipmapsPriority: 0 | |||||
grayScaleToAlpha: 0 | |||||
generateCubemap: 6 | |||||
cubemapConvolution: 0 | |||||
seamlessCubemap: 0 | |||||
textureFormat: 1 | |||||
maxTextureSize: 2048 | |||||
textureSettings: | |||||
serializedVersion: 2 | |||||
filterMode: -1 | |||||
aniso: -1 | |||||
mipBias: -100 | |||||
wrapU: 1 | |||||
wrapV: 1 | |||||
wrapW: -1 | |||||
nPOTScale: 0 | |||||
lightmap: 0 | |||||
compressionQuality: 50 | |||||
spriteMode: 1 | |||||
spriteExtrude: 1 | |||||
spriteMeshType: 1 | |||||
alignment: 0 | |||||
spritePivot: {x: 0.5, y: 0.5} | |||||
spritePixelsToUnits: 100 | |||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||||
spriteGenerateFallbackPhysicsShape: 1 | |||||
alphaUsage: 1 | |||||
alphaIsTransparency: 1 | |||||
spriteTessellationDetail: -1 | |||||
textureType: 8 | |||||
textureShape: 1 | |||||
singleChannelComponent: 0 | |||||
maxTextureSizeSet: 0 | |||||
compressionQualitySet: 0 | |||||
textureFormatSet: 0 | |||||
platformSettings: | |||||
- serializedVersion: 2 | |||||
buildTarget: DefaultTexturePlatform | |||||
maxTextureSize: 2048 | |||||
resizeAlgorithm: 0 | |||||
textureFormat: -1 | |||||
textureCompression: 1 | |||||
compressionQuality: 50 | |||||
crunchedCompression: 0 | |||||
allowsAlphaSplitting: 0 | |||||
overridden: 0 | |||||
androidETC2FallbackOverride: 0 | |||||
- serializedVersion: 2 | |||||
buildTarget: Standalone | |||||
maxTextureSize: 2048 | |||||
resizeAlgorithm: 0 | |||||
textureFormat: -1 | |||||
textureCompression: 1 | |||||
compressionQuality: 50 | |||||
crunchedCompression: 0 | |||||
allowsAlphaSplitting: 0 | |||||
overridden: 0 | |||||
androidETC2FallbackOverride: 0 | |||||
- serializedVersion: 2 | |||||
buildTarget: Android | |||||
maxTextureSize: 2048 | |||||
resizeAlgorithm: 0 | |||||
textureFormat: -1 | |||||
textureCompression: 1 | |||||
compressionQuality: 50 | |||||
crunchedCompression: 0 | |||||
allowsAlphaSplitting: 0 | |||||
overridden: 0 | |||||
androidETC2FallbackOverride: 0 | |||||
spriteSheet: | |||||
serializedVersion: 2 | |||||
sprites: [] | |||||
outline: [] | |||||
physicsShape: [] | |||||
bones: [] | |||||
spriteID: | |||||
vertices: [] | |||||
indices: | |||||
edges: [] | |||||
weights: [] | |||||
spritePackingTag: | |||||
pSDRemoveMatte: 0 | |||||
pSDShowRemoveMatteOption: 0 | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,110 @@ | |||||
fileFormatVersion: 2 | |||||
guid: b712e65990021194795e721125b0ad46 | |||||
TextureImporter: | |||||
fileIDToRecycleName: {} | |||||
externalObjects: {} | |||||
serializedVersion: 9 | |||||
mipmaps: | |||||
mipMapMode: 0 | |||||
enableMipMap: 0 | |||||
sRGBTexture: 1 | |||||
linearTexture: 0 | |||||
fadeOut: 0 | |||||
borderMipMap: 0 | |||||
mipMapsPreserveCoverage: 0 | |||||
alphaTestReferenceValue: 0.5 | |||||
mipMapFadeDistanceStart: 1 | |||||
mipMapFadeDistanceEnd: 3 | |||||
bumpmap: | |||||
convertToNormalMap: 0 | |||||
externalNormalMap: 0 | |||||
heightScale: 0.25 | |||||
normalMapFilter: 0 | |||||
isReadable: 0 | |||||
streamingMipmaps: 0 | |||||
streamingMipmapsPriority: 0 | |||||
grayScaleToAlpha: 0 | |||||
generateCubemap: 6 | |||||
cubemapConvolution: 0 | |||||
seamlessCubemap: 0 | |||||
textureFormat: 1 | |||||
maxTextureSize: 2048 | |||||
textureSettings: | |||||
serializedVersion: 2 | |||||
filterMode: -1 | |||||
aniso: -1 | |||||
mipBias: -100 | |||||
wrapU: 1 | |||||
wrapV: 1 | |||||
wrapW: -1 | |||||
nPOTScale: 0 | |||||
lightmap: 0 | |||||
compressionQuality: 50 | |||||
spriteMode: 1 | |||||
spriteExtrude: 1 | |||||
spriteMeshType: 1 | |||||
alignment: 0 | |||||
spritePivot: {x: 0.5, y: 0.5} | |||||
spritePixelsToUnits: 100 | |||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0} | |||||
spriteGenerateFallbackPhysicsShape: 1 | |||||
alphaUsage: 1 | |||||
alphaIsTransparency: 1 | |||||
spriteTessellationDetail: -1 | |||||
textureType: 8 | |||||
textureShape: 1 | |||||
singleChannelComponent: 0 | |||||
maxTextureSizeSet: 0 | |||||
compressionQualitySet: 0 | |||||
textureFormatSet: 0 | |||||
platformSettings: | |||||
- serializedVersion: 2 | |||||
buildTarget: DefaultTexturePlatform | |||||
maxTextureSize: 2048 | |||||
resizeAlgorithm: 0 | |||||
textureFormat: -1 | |||||
textureCompression: 1 | |||||
compressionQuality: 50 | |||||
crunchedCompression: 0 | |||||
allowsAlphaSplitting: 0 | |||||
overridden: 0 | |||||
androidETC2FallbackOverride: 0 | |||||
- serializedVersion: 2 | |||||
buildTarget: Standalone | |||||
maxTextureSize: 2048 | |||||
resizeAlgorithm: 0 | |||||
textureFormat: -1 | |||||
textureCompression: 1 | |||||
compressionQuality: 50 | |||||
crunchedCompression: 0 | |||||
allowsAlphaSplitting: 0 | |||||
overridden: 0 | |||||
androidETC2FallbackOverride: 0 | |||||
- serializedVersion: 2 | |||||
buildTarget: Android | |||||
maxTextureSize: 2048 | |||||
resizeAlgorithm: 0 | |||||
textureFormat: -1 | |||||
textureCompression: 1 | |||||
compressionQuality: 50 | |||||
crunchedCompression: 0 | |||||
allowsAlphaSplitting: 0 | |||||
overridden: 0 | |||||
androidETC2FallbackOverride: 0 | |||||
spriteSheet: | |||||
serializedVersion: 2 | |||||
sprites: [] | |||||
outline: [] | |||||
physicsShape: [] | |||||
bones: [] | |||||
spriteID: | |||||
vertices: [] | |||||
indices: | |||||
edges: [] | |||||
weights: [] | |||||
spritePackingTag: | |||||
pSDRemoveMatte: 0 | |||||
pSDShowRemoveMatteOption: 0 | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,8 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 82c5dbbc9224d6a48a69171dfbe330bc | |||||
folderAsset: yes | |||||
DefaultImporter: | |||||
externalObjects: {} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,41 @@ | |||||
using UnityEngine; | |||||
using System.Collections; | |||||
using System; | |||||
namespace ETModel | |||||
{ | |||||
namespace com.commsdk.unity3d | |||||
{ | |||||
public class AndroidImpl : CommSDKImpl | |||||
{ | |||||
private AndroidJavaObject currActivity; | |||||
public AndroidImpl(string callbackObj, string callbackMethod) | |||||
{ | |||||
currActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); | |||||
InitSDK(callbackObj, callbackMethod); | |||||
} | |||||
private string WxAppId = "wxe3784691d154266f"; | |||||
private string WxAppSecret = "e11c9277651822d48a00425d4ffc08e2"; | |||||
public override void InitSDK(string callbackObj, string callbackMethod) | |||||
{ | |||||
if (currActivity != null) | |||||
{ | |||||
currActivity.Call("initSdk", callbackObj, callbackMethod, WxAppId, WxAppSecret); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Authorize the specified platform. | |||||
/// </summary> | |||||
public override void Authorize(int type, int reqID) | |||||
{ | |||||
if (currActivity != null) | |||||
{ | |||||
currActivity.Call("authorize", type, reqID); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,5 +1,5 @@ | |||||
fileFormatVersion: 2 | fileFormatVersion: 2 | ||||
guid: ae686ed626ce4f844bd3b8a007577ae7 | |||||
guid: 7aa1e0ac5ca98644d896e65604559a3f | |||||
MonoImporter: | MonoImporter: | ||||
externalObjects: {} | externalObjects: {} | ||||
serializedVersion: 2 | serializedVersion: 2 |
@@ -0,0 +1,92 @@ | |||||
using UnityEngine; | |||||
using System.Collections; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Text; | |||||
using System.Reflection; | |||||
using ETModel.com.commsdk.unity3d; | |||||
using ETModel; | |||||
namespace ETHotfix | |||||
{ | |||||
namespace com.commsdk.unity3d | |||||
{ | |||||
/// <summary> | |||||
///公用的原生sdk | |||||
/// </summary> | |||||
public class CommSDKComponent : MonoBehaviour | |||||
{ | |||||
private int WeReqID; | |||||
private CommSDKImpl commSdkUtils; | |||||
public EventWechatHandler responseHandler; | |||||
public void Init() | |||||
{ | |||||
if (Application.platform == RuntimePlatform.Android) | |||||
{ | |||||
Debug.Log("GameObject.name = " + gameObject.name); | |||||
commSdkUtils = new AndroidImpl(gameObject.name, "_Callback"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// callback the specified data. | |||||
/// </summary> | |||||
/// <param name='data'> | |||||
/// Data. | |||||
/// </param> | |||||
private void _Callback(string data) | |||||
{ | |||||
if (data == null) | |||||
{ | |||||
Debug.Log("OnWechatLogin DataIsNull" + data + "DataIsNull Data"); | |||||
return; | |||||
} | |||||
Hashtable res = (Hashtable)MiniJSON.jsonDecode(data); | |||||
if (res == null || res.Count <= 0) | |||||
{ | |||||
Debug.Log("OnWechatLogin ResIsNull" + data + "ResIsNull Data"); | |||||
return; | |||||
} | |||||
int status = Convert.ToInt32(res["status"]); | |||||
int reqID = Convert.ToInt32(res["reqID"]); | |||||
int action = Convert.ToInt32(res["action"]); | |||||
Hashtable resp = null; | |||||
switch ((RespState)status) | |||||
{ | |||||
case RespState.Success: | |||||
case RespState.Fail: | |||||
resp = (Hashtable)res["res"]; | |||||
break; | |||||
case RespState.Cancel: | |||||
break; | |||||
} | |||||
if (resp == null) | |||||
{ | |||||
Debug.Log("OnWechatLogin RespIsNull" + data + "RespIsNull"); | |||||
} | |||||
if (null != responseHandler) | |||||
{ | |||||
responseHandler(reqID, (ActionType)action, (RespState)status, resp); | |||||
} | |||||
} | |||||
public int Authorize(int type) | |||||
{ | |||||
WeReqID++; | |||||
commSdkUtils.Authorize(type, WeReqID); | |||||
return WeReqID; | |||||
} | |||||
/// <summary> | |||||
/// Event result listener. | |||||
/// </summary> | |||||
public delegate void EventWechatHandler(int reqID, ActionType type, RespState state, Hashtable data); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 359fd104cc365a345847d9b6c9bf8d75 | |||||
timeCreated: 1485338619 | |||||
licenseType: Pro | |||||
MonoImporter: | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,22 @@ | |||||
using UnityEngine; | |||||
using System.Collections; | |||||
namespace ETModel | |||||
{ | |||||
namespace com.commsdk.unity3d | |||||
{ | |||||
public abstract class CommSDKImpl | |||||
{ | |||||
public abstract void InitSDK(string objName, string methodName); | |||||
/// <summary> | |||||
/// Authorize the specified platform. | |||||
/// </summary> | |||||
public abstract void Authorize(int type, int reqID); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,11 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 276cac4abf4b98e47bd6304ab6ed6e6d | |||||
MonoImporter: | |||||
externalObjects: {} | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,67 @@ | |||||
using UnityEngine; | |||||
using System.Collections; | |||||
namespace ETHotfix | |||||
{ | |||||
namespace com.commsdk.unity3d | |||||
{ | |||||
/// <summary> | |||||
/// Response state. | |||||
/// </summary> | |||||
public enum RespState | |||||
{ | |||||
Begin = 0, //Begin | |||||
Success = 1, //Success | |||||
Fail = 2, //Failure | |||||
Cancel = 3 //Cancel | |||||
} | |||||
/// <summary> | |||||
/// action type | |||||
/// </summary> | |||||
public enum ActionType | |||||
{ | |||||
Begin = 0, | |||||
Authorize = 1, //授权 | |||||
Share = 2, //分享 | |||||
Pay = 3, //支付 | |||||
Location = 4, // 定位返回 | |||||
XianLiaoAuthorize = 5, //闲聊授权 | |||||
DuoLiaoAuthorize = 6 //多聊授权 | |||||
} | |||||
public enum PlatformType | |||||
{ | |||||
WeChat = 0, //微信好友 | |||||
WeChatMoments = 1, //微信朋友圈 | |||||
XlChat = 2, //闲聊 | |||||
DuoLiao = 3, //多聊 | |||||
MoWang = 4 //默往 | |||||
} | |||||
/// <summary> | |||||
/// Content type. | |||||
/// </summary> | |||||
public enum ContentType | |||||
{ | |||||
Auto = 0, //自动(iOS为自动,安卓仅为Text) | |||||
Text = 1, //文字分享 | |||||
Image = 2, //图文分享 | |||||
Webpage = 4, //链接分享 | |||||
Music = 5, //音乐分享 | |||||
Video = 6, //视频分享 | |||||
App = 7, //应用分享 | |||||
File = 8, //附件分享 | |||||
Emoji = 9, //表情分享 | |||||
LINK = 10 //闲聊链接分享 | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 8ffdaed2b28fc2348988d036464d68b1 | |||||
timeCreated: 1485338619 | |||||
licenseType: Pro | |||||
MonoImporter: | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,745 @@ | |||||
using System; | |||||
using System.Collections; | |||||
using System.Text; | |||||
using System.Collections.Generic; | |||||
namespace ETModel | |||||
{ | |||||
/* Based on the JSON parser from | |||||
* http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html | |||||
* | |||||
* I simplified it so that it doesn't throw exceptions | |||||
* and can be used in Unity iPhone with maximum code stripping. | |||||
*/ | |||||
/// <summary> | |||||
/// This class encodes and decodes JSON strings. | |||||
/// Spec. details, see http://www.json.org/ | |||||
/// | |||||
/// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. | |||||
/// All numbers are parsed to doubles. | |||||
/// </summary> | |||||
public class MiniJSON | |||||
{ | |||||
private const int TOKEN_NONE = 0; | |||||
private const int TOKEN_CURLY_OPEN = 1; | |||||
private const int TOKEN_CURLY_CLOSE = 2; | |||||
private const int TOKEN_SQUARED_OPEN = 3; | |||||
private const int TOKEN_SQUARED_CLOSE = 4; | |||||
private const int TOKEN_COLON = 5; | |||||
private const int TOKEN_COMMA = 6; | |||||
private const int TOKEN_STRING = 7; | |||||
private const int TOKEN_NUMBER = 8; | |||||
private const int TOKEN_TRUE = 9; | |||||
private const int TOKEN_FALSE = 10; | |||||
private const int TOKEN_NULL = 11; | |||||
private const int BUILDER_CAPACITY = 2000; | |||||
/// <summary> | |||||
/// On decoding, this value holds the position at which the parse failed (-1 = no error). | |||||
/// </summary> | |||||
protected static int lastErrorIndex = -1; | |||||
protected static string lastDecode = ""; | |||||
/// <summary> | |||||
/// Parses the string json into a value | |||||
/// </summary> | |||||
/// <param name="json">A JSON string.</param> | |||||
/// <returns>An ArrayList, a Hashtable, a double, a string, null, true, or false</returns> | |||||
public static object jsonDecode(string json) | |||||
{ | |||||
// save the string for debug information | |||||
MiniJSON.lastDecode = json; | |||||
if (json != null) | |||||
{ | |||||
char[] charArray = json.ToCharArray(); | |||||
int index = 0; | |||||
bool success = true; | |||||
object value = MiniJSON.parseValue(charArray, ref index, ref success); | |||||
if (success) | |||||
MiniJSON.lastErrorIndex = -1; | |||||
else | |||||
MiniJSON.lastErrorIndex = index; | |||||
return value; | |||||
} | |||||
else | |||||
{ | |||||
return null; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Converts a Hashtable / ArrayList / Dictionary(string,string) object into a JSON string | |||||
/// </summary> | |||||
/// <param name="json">A Hashtable / ArrayList</param> | |||||
/// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns> | |||||
public static string jsonEncode(object json) | |||||
{ | |||||
var builder = new StringBuilder(BUILDER_CAPACITY); | |||||
var success = MiniJSON.serializeValue(json, builder); | |||||
return (success ? builder.ToString() : null); | |||||
} | |||||
/// <summary> | |||||
/// On decoding, this function returns the position at which the parse failed (-1 = no error). | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public static bool lastDecodeSuccessful() | |||||
{ | |||||
return (MiniJSON.lastErrorIndex == -1); | |||||
} | |||||
/// <summary> | |||||
/// On decoding, this function returns the position at which the parse failed (-1 = no error). | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public static int getLastErrorIndex() | |||||
{ | |||||
return MiniJSON.lastErrorIndex; | |||||
} | |||||
/// <summary> | |||||
/// If a decoding error occurred, this function returns a piece of the JSON string | |||||
/// at which the error took place. To ease debugging. | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public static string getLastErrorSnippet() | |||||
{ | |||||
if (MiniJSON.lastErrorIndex == -1) | |||||
{ | |||||
return ""; | |||||
} | |||||
else | |||||
{ | |||||
int startIndex = MiniJSON.lastErrorIndex - 5; | |||||
int endIndex = MiniJSON.lastErrorIndex + 15; | |||||
if (startIndex < 0) | |||||
startIndex = 0; | |||||
if (endIndex >= MiniJSON.lastDecode.Length) | |||||
endIndex = MiniJSON.lastDecode.Length - 1; | |||||
return MiniJSON.lastDecode.Substring(startIndex, endIndex - startIndex + 1); | |||||
} | |||||
} | |||||
#region Parsing | |||||
protected static Hashtable parseObject(char[] json, ref int index) | |||||
{ | |||||
Hashtable table = new Hashtable(); | |||||
int token; | |||||
// { | |||||
nextToken(json, ref index); | |||||
bool done = false; | |||||
while (!done) | |||||
{ | |||||
token = lookAhead(json, index); | |||||
if (token == MiniJSON.TOKEN_NONE) | |||||
{ | |||||
return null; | |||||
} | |||||
else if (token == MiniJSON.TOKEN_COMMA) | |||||
{ | |||||
nextToken(json, ref index); | |||||
} | |||||
else if (token == MiniJSON.TOKEN_CURLY_CLOSE) | |||||
{ | |||||
nextToken(json, ref index); | |||||
return table; | |||||
} | |||||
else | |||||
{ | |||||
// name | |||||
string name = parseString(json, ref index); | |||||
if (name == null) | |||||
{ | |||||
return null; | |||||
} | |||||
// : | |||||
token = nextToken(json, ref index); | |||||
if (token != MiniJSON.TOKEN_COLON) | |||||
return null; | |||||
// value | |||||
bool success = true; | |||||
object value = parseValue(json, ref index, ref success); | |||||
if (!success) | |||||
return null; | |||||
table[name] = value; | |||||
} | |||||
} | |||||
return table; | |||||
} | |||||
protected static ArrayList parseArray(char[] json, ref int index) | |||||
{ | |||||
ArrayList array = new ArrayList(); | |||||
// [ | |||||
nextToken(json, ref index); | |||||
bool done = false; | |||||
while (!done) | |||||
{ | |||||
int token = lookAhead(json, index); | |||||
if (token == MiniJSON.TOKEN_NONE) | |||||
{ | |||||
return null; | |||||
} | |||||
else if (token == MiniJSON.TOKEN_COMMA) | |||||
{ | |||||
nextToken(json, ref index); | |||||
} | |||||
else if (token == MiniJSON.TOKEN_SQUARED_CLOSE) | |||||
{ | |||||
nextToken(json, ref index); | |||||
break; | |||||
} | |||||
else | |||||
{ | |||||
bool success = true; | |||||
object value = parseValue(json, ref index, ref success); | |||||
if (!success) | |||||
return null; | |||||
array.Add(value); | |||||
} | |||||
} | |||||
return array; | |||||
} | |||||
protected static object parseValue(char[] json, ref int index, ref bool success) | |||||
{ | |||||
switch (lookAhead(json, index)) | |||||
{ | |||||
case MiniJSON.TOKEN_STRING: | |||||
return parseString(json, ref index); | |||||
case MiniJSON.TOKEN_NUMBER: | |||||
return parseNumber(json, ref index); | |||||
case MiniJSON.TOKEN_CURLY_OPEN: | |||||
return parseObject(json, ref index); | |||||
case MiniJSON.TOKEN_SQUARED_OPEN: | |||||
return parseArray(json, ref index); | |||||
case MiniJSON.TOKEN_TRUE: | |||||
nextToken(json, ref index); | |||||
return Boolean.Parse("TRUE"); | |||||
case MiniJSON.TOKEN_FALSE: | |||||
nextToken(json, ref index); | |||||
return Boolean.Parse("FALSE"); | |||||
case MiniJSON.TOKEN_NULL: | |||||
nextToken(json, ref index); | |||||
return null; | |||||
case MiniJSON.TOKEN_NONE: | |||||
break; | |||||
} | |||||
success = false; | |||||
return null; | |||||
} | |||||
protected static string parseString(char[] json, ref int index) | |||||
{ | |||||
string s = ""; | |||||
char c; | |||||
eatWhitespace(json, ref index); | |||||
// " | |||||
c = json[index++]; | |||||
bool complete = false; | |||||
while (!complete) | |||||
{ | |||||
if (index == json.Length) | |||||
break; | |||||
c = json[index++]; | |||||
if (c == '"') | |||||
{ | |||||
complete = true; | |||||
break; | |||||
} | |||||
else if (c == '\\') | |||||
{ | |||||
if (index == json.Length) | |||||
break; | |||||
c = json[index++]; | |||||
if (c == '"') | |||||
{ | |||||
s += '"'; | |||||
} | |||||
else if (c == '\\') | |||||
{ | |||||
s += '\\'; | |||||
} | |||||
else if (c == '/') | |||||
{ | |||||
s += '/'; | |||||
} | |||||
else if (c == 'b') | |||||
{ | |||||
s += '\b'; | |||||
} | |||||
else if (c == 'f') | |||||
{ | |||||
s += '\f'; | |||||
} | |||||
else if (c == 'n') | |||||
{ | |||||
s += '\n'; | |||||
} | |||||
else if (c == 'r') | |||||
{ | |||||
s += '\r'; | |||||
} | |||||
else if (c == 't') | |||||
{ | |||||
s += '\t'; | |||||
} | |||||
else if (c == 'u') | |||||
{ | |||||
int remainingLength = json.Length - index; | |||||
if (remainingLength >= 4) | |||||
{ | |||||
char[] unicodeCharArray = new char[4]; | |||||
Array.Copy(json, index, unicodeCharArray, 0, 4); | |||||
uint codePoint = UInt32.Parse(new string(unicodeCharArray), System.Globalization.NumberStyles.HexNumber); | |||||
// convert the integer codepoint to a unicode char and add to string | |||||
s += Char.ConvertFromUtf32((int)codePoint); | |||||
// skip 4 chars | |||||
index += 4; | |||||
} | |||||
else | |||||
{ | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
s += c; | |||||
} | |||||
} | |||||
if (!complete) | |||||
return null; | |||||
return s; | |||||
} | |||||
protected static double parseNumber(char[] json, ref int index) | |||||
{ | |||||
eatWhitespace(json, ref index); | |||||
int lastIndex = getLastIndexOfNumber(json, index); | |||||
int charLength = (lastIndex - index) + 1; | |||||
char[] numberCharArray = new char[charLength]; | |||||
Array.Copy(json, index, numberCharArray, 0, charLength); | |||||
index = lastIndex + 1; | |||||
return Double.Parse(new string(numberCharArray)); // , CultureInfo.InvariantCulture); | |||||
} | |||||
protected static int getLastIndexOfNumber(char[] json, int index) | |||||
{ | |||||
int lastIndex; | |||||
for (lastIndex = index; lastIndex < json.Length; lastIndex++) | |||||
if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) | |||||
{ | |||||
break; | |||||
} | |||||
return lastIndex - 1; | |||||
} | |||||
protected static void eatWhitespace(char[] json, ref int index) | |||||
{ | |||||
for (; index < json.Length; index++) | |||||
if (" \t\n\r".IndexOf(json[index]) == -1) | |||||
{ | |||||
break; | |||||
} | |||||
} | |||||
protected static int lookAhead(char[] json, int index) | |||||
{ | |||||
int saveIndex = index; | |||||
return nextToken(json, ref saveIndex); | |||||
} | |||||
protected static int nextToken(char[] json, ref int index) | |||||
{ | |||||
eatWhitespace(json, ref index); | |||||
if (index == json.Length) | |||||
{ | |||||
return MiniJSON.TOKEN_NONE; | |||||
} | |||||
char c = json[index]; | |||||
index++; | |||||
switch (c) | |||||
{ | |||||
case '{': | |||||
return MiniJSON.TOKEN_CURLY_OPEN; | |||||
case '}': | |||||
return MiniJSON.TOKEN_CURLY_CLOSE; | |||||
case '[': | |||||
return MiniJSON.TOKEN_SQUARED_OPEN; | |||||
case ']': | |||||
return MiniJSON.TOKEN_SQUARED_CLOSE; | |||||
case ',': | |||||
return MiniJSON.TOKEN_COMMA; | |||||
case '"': | |||||
return MiniJSON.TOKEN_STRING; | |||||
case '0': | |||||
case '1': | |||||
case '2': | |||||
case '3': | |||||
case '4': | |||||
case '5': | |||||
case '6': | |||||
case '7': | |||||
case '8': | |||||
case '9': | |||||
case '-': | |||||
return MiniJSON.TOKEN_NUMBER; | |||||
case ':': | |||||
return MiniJSON.TOKEN_COLON; | |||||
} | |||||
index--; | |||||
int remainingLength = json.Length - index; | |||||
// false | |||||
if (remainingLength >= 5) | |||||
{ | |||||
if (json[index] == 'f' && | |||||
json[index + 1] == 'a' && | |||||
json[index + 2] == 'l' && | |||||
json[index + 3] == 's' && | |||||
json[index + 4] == 'e') | |||||
{ | |||||
index += 5; | |||||
return MiniJSON.TOKEN_FALSE; | |||||
} | |||||
} | |||||
// true | |||||
if (remainingLength >= 4) | |||||
{ | |||||
if (json[index] == 't' && | |||||
json[index + 1] == 'r' && | |||||
json[index + 2] == 'u' && | |||||
json[index + 3] == 'e') | |||||
{ | |||||
index += 4; | |||||
return MiniJSON.TOKEN_TRUE; | |||||
} | |||||
} | |||||
// null | |||||
if (remainingLength >= 4) | |||||
{ | |||||
if (json[index] == 'n' && | |||||
json[index + 1] == 'u' && | |||||
json[index + 2] == 'l' && | |||||
json[index + 3] == 'l') | |||||
{ | |||||
index += 4; | |||||
return MiniJSON.TOKEN_NULL; | |||||
} | |||||
} | |||||
return MiniJSON.TOKEN_NONE; | |||||
} | |||||
#endregion | |||||
#region Serialization | |||||
protected static bool serializeObjectOrArray(object objectOrArray, StringBuilder builder) | |||||
{ | |||||
if (objectOrArray is Hashtable) | |||||
{ | |||||
return serializeObject((Hashtable)objectOrArray, builder); | |||||
} | |||||
else if (objectOrArray is ArrayList) | |||||
{ | |||||
return serializeArray((ArrayList)objectOrArray, builder); | |||||
} | |||||
else | |||||
{ | |||||
return false; | |||||
} | |||||
} | |||||
protected static bool serializeObject(Hashtable anObject, StringBuilder builder) | |||||
{ | |||||
builder.Append("{"); | |||||
IDictionaryEnumerator e = anObject.GetEnumerator(); | |||||
bool first = true; | |||||
while (e.MoveNext()) | |||||
{ | |||||
string key = e.Key.ToString(); | |||||
object value = e.Value; | |||||
if (!first) | |||||
{ | |||||
builder.Append(", "); | |||||
} | |||||
serializeString(key, builder); | |||||
builder.Append(":"); | |||||
if (!serializeValue(value, builder)) | |||||
{ | |||||
return false; | |||||
} | |||||
first = false; | |||||
} | |||||
builder.Append("}"); | |||||
return true; | |||||
} | |||||
protected static bool serializeDictionary(Dictionary<string, string> dict, StringBuilder builder) | |||||
{ | |||||
builder.Append("{"); | |||||
bool first = true; | |||||
foreach (var kv in dict) | |||||
{ | |||||
if (!first) | |||||
builder.Append(", "); | |||||
serializeString(kv.Key, builder); | |||||
builder.Append(":"); | |||||
serializeString(kv.Value, builder); | |||||
first = false; | |||||
} | |||||
builder.Append("}"); | |||||
return true; | |||||
} | |||||
protected static bool serializeArray(ArrayList anArray, StringBuilder builder) | |||||
{ | |||||
builder.Append("["); | |||||
bool first = true; | |||||
for (int i = 0; i < anArray.Count; i++) | |||||
{ | |||||
object value = anArray[i]; | |||||
if (!first) | |||||
{ | |||||
builder.Append(", "); | |||||
} | |||||
if (!serializeValue(value, builder)) | |||||
{ | |||||
return false; | |||||
} | |||||
first = false; | |||||
} | |||||
builder.Append("]"); | |||||
return true; | |||||
} | |||||
protected static bool serializeValue(object value, StringBuilder builder) | |||||
{ | |||||
//Type t = value.GetType(); | |||||
//UnityEngine.Debug.Log("type: " + t.ToString() + " isArray: " + t.IsArray); | |||||
if (value == null) | |||||
{ | |||||
builder.Append("null"); | |||||
} | |||||
else if (value.GetType().IsArray) | |||||
{ | |||||
serializeArray(new ArrayList((ICollection)value), builder); | |||||
} | |||||
else if (value is string) | |||||
{ | |||||
serializeString((string)value, builder); | |||||
} | |||||
else if (value is Char) | |||||
{ | |||||
serializeString(Convert.ToString((char)value), builder); | |||||
} | |||||
else if (value is decimal) | |||||
{ | |||||
serializeString(Convert.ToString((decimal)value), builder); | |||||
} | |||||
else if (value is Hashtable) | |||||
{ | |||||
serializeObject((Hashtable)value, builder); | |||||
} | |||||
else if (value is Dictionary<string, string>) | |||||
{ | |||||
serializeDictionary((Dictionary<string, string>)value, builder); | |||||
} | |||||
else if (value is ArrayList) | |||||
{ | |||||
serializeArray((ArrayList)value, builder); | |||||
} | |||||
else if ((value is Boolean) && ((Boolean)value == true)) | |||||
{ | |||||
builder.Append("true"); | |||||
} | |||||
else if ((value is Boolean) && ((Boolean)value == false)) | |||||
{ | |||||
builder.Append("false"); | |||||
} | |||||
else if (value.GetType().IsPrimitive) | |||||
{ | |||||
serializeNumber(Convert.ToDouble(value), builder); | |||||
} | |||||
else | |||||
{ | |||||
return false; | |||||
} | |||||
return true; | |||||
} | |||||
protected static void serializeString(string aString, StringBuilder builder) | |||||
{ | |||||
builder.Append("\""); | |||||
char[] charArray = aString.ToCharArray(); | |||||
for (int i = 0; i < charArray.Length; i++) | |||||
{ | |||||
char c = charArray[i]; | |||||
if (c == '"') | |||||
{ | |||||
builder.Append("\\\""); | |||||
} | |||||
else if (c == '\\') | |||||
{ | |||||
builder.Append("\\\\"); | |||||
} | |||||
else if (c == '\b') | |||||
{ | |||||
builder.Append("\\b"); | |||||
} | |||||
else if (c == '\f') | |||||
{ | |||||
builder.Append("\\f"); | |||||
} | |||||
else if (c == '\n') | |||||
{ | |||||
builder.Append("\\n"); | |||||
} | |||||
else if (c == '\r') | |||||
{ | |||||
builder.Append("\\r"); | |||||
} | |||||
else if (c == '\t') | |||||
{ | |||||
builder.Append("\\t"); | |||||
} | |||||
else | |||||
{ | |||||
int codepoint = Convert.ToInt32(c); | |||||
if ((codepoint >= 32) && (codepoint <= 126)) | |||||
{ | |||||
builder.Append(c); | |||||
} | |||||
else | |||||
{ | |||||
builder.Append("\\u" + Convert.ToString(codepoint, 16).PadLeft(4, '0')); | |||||
} | |||||
} | |||||
} | |||||
builder.Append("\""); | |||||
} | |||||
protected static void serializeNumber(double number, StringBuilder builder) | |||||
{ | |||||
builder.Append(Convert.ToString(number)); // , CultureInfo.InvariantCulture)); | |||||
} | |||||
#endregion | |||||
} | |||||
#region Extension methods | |||||
public static class MiniJsonExtensions | |||||
{ | |||||
public static string toJson(this Hashtable obj) | |||||
{ | |||||
return MiniJSON.jsonEncode(obj); | |||||
} | |||||
public static string toJson(this Dictionary<string, string> obj) | |||||
{ | |||||
return MiniJSON.jsonEncode(obj); | |||||
} | |||||
public static ArrayList arrayListFromJson(this string json) | |||||
{ | |||||
return MiniJSON.jsonDecode(json) as ArrayList; | |||||
} | |||||
public static Hashtable hashtableFromJson(this string json) | |||||
{ | |||||
return MiniJSON.jsonDecode(json) as Hashtable; | |||||
} | |||||
} | |||||
#endregion | |||||
} | |||||
@@ -0,0 +1,12 @@ | |||||
fileFormatVersion: 2 | |||||
guid: f15edb53581ba284f959684b8b76e9a4 | |||||
timeCreated: 1485338621 | |||||
licenseType: Pro | |||||
MonoImporter: | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -0,0 +1,101 @@ | |||||
using UnityEngine; | |||||
using System.Collections; | |||||
using ETHotfix.com.commsdk.unity3d; | |||||
using System.Text.RegularExpressions; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using ETModel; | |||||
using ETModel.com.commsdk.unity3d; | |||||
/// <summary> | |||||
/// 原生code 与Unity通信 | |||||
/// </summary> | |||||
public class NativeBridgeUtil : MonoBehaviour | |||||
{ | |||||
// 单例模式 | |||||
public static NativeBridgeUtil Instance { get; private set; } | |||||
CommSDKComponent csdk; | |||||
public void Awake() | |||||
{ | |||||
// 实现单例模式 | |||||
if (Instance != null && Instance != this) | |||||
{ | |||||
Destroy(gameObject); | |||||
return; | |||||
} | |||||
else | |||||
{ | |||||
Instance = this; | |||||
DontDestroyOnLoad(gameObject); | |||||
} | |||||
gameObject.name = "NativeReceiver"; | |||||
csdk = gameObject.AddComponent<CommSDKComponent>(); | |||||
csdk.Init(); | |||||
csdk.responseHandler = OnWechatResponse; | |||||
} | |||||
public void Start() | |||||
{ | |||||
#if UNITY_ANDROID //android系统 | |||||
AndroidJNI.AttachCurrentThread(); | |||||
#endif | |||||
} | |||||
#region 通用SDK | |||||
//0 1 微信 2 闲聊 3多聊 | |||||
public void WeChatLogin(int type) | |||||
{ | |||||
#if UNITY_ANDROID || UNITY_IOS || UNITY_IPHONE | |||||
csdk.Authorize(type); | |||||
#endif | |||||
} | |||||
void OnWechatResponse(int reqID, ActionType type, RespState state, Hashtable data) | |||||
{ | |||||
Debug.Log("OnWechatResponse: reqid=" + reqID + ",action=" + type + ",state=" + state); | |||||
switch (type) | |||||
{ | |||||
case ActionType.Authorize: | |||||
OnAuthorizedHandler(reqID, state, data); | |||||
break; | |||||
case ActionType.Share: | |||||
break; | |||||
case ActionType.Pay: | |||||
break; | |||||
case ActionType.Location: | |||||
break; | |||||
} | |||||
} | |||||
//微信申请授权后回调 | |||||
void OnAuthorizedHandler(int reqID, RespState state, Hashtable result) | |||||
{ | |||||
if (state == RespState.Success) | |||||
{ | |||||
//UILoginCtrl.Self.OnWechatLogin(result); | |||||
Debug.Log("OnAuthorizedHandler->Success:result=" + result); | |||||
string unionid = result["unionid"].ToString(); | |||||
Debug.Log("OnAuthorizedHandler->Success:unionid=" + unionid); | |||||
} | |||||
else if (state == RespState.Fail) | |||||
{ | |||||
string errorMsg = result["error_msg"].ToString(); | |||||
string statck = result["stack"].ToString(); | |||||
Debug.Log("OnAuthorizedHandler->Fail:errorMsg=" + errorMsg + ",statck=" + statck); | |||||
} | |||||
else if (state == RespState.Cancel) | |||||
{ | |||||
Debug.Log("OnAuthorizedHandler: Cancel"); | |||||
} | |||||
} | |||||
#endregion | |||||
} | |||||
@@ -0,0 +1,11 @@ | |||||
fileFormatVersion: 2 | |||||
guid: 845cd578293274746aef9615b7c5048c | |||||
MonoImporter: | |||||
externalObjects: {} | |||||
serializedVersion: 2 | |||||
defaultReferences: [] | |||||
executionOrder: 0 | |||||
icon: {instanceID: 0} | |||||
userData: | |||||
assetBundleName: | |||||
assetBundleVariant: |
@@ -471,6 +471,76 @@ MonoBehaviour: | |||||
m_FirstSelected: {fileID: 0} | m_FirstSelected: {fileID: 0} | ||||
m_sendNavigationEvents: 1 | m_sendNavigationEvents: 1 | ||||
m_DragThreshold: 5 | m_DragThreshold: 5 | ||||
--- !u!1001 &24259649 | |||||
PrefabInstance: | |||||
m_ObjectHideFlags: 0 | |||||
serializedVersion: 2 | |||||
m_Modification: | |||||
m_TransformParent: {fileID: 0} | |||||
m_Modifications: | |||||
- target: {fileID: 3375001057570166699, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_Name | |||||
value: NativeReceiver | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalPosition.x | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalPosition.y | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalPosition.z | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalRotation.x | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalRotation.y | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalRotation.z | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalRotation.w | |||||
value: 1 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_RootOrder | |||||
value: 3 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalEulerAnglesHint.x | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalEulerAnglesHint.y | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
- target: {fileID: 3452914372860290207, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
propertyPath: m_LocalEulerAnglesHint.z | |||||
value: 0 | |||||
objectReference: {fileID: 0} | |||||
m_RemovedComponents: | |||||
- {fileID: 8586933507933314822, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, type: 3} | |||||
m_SourcePrefab: {fileID: 100100000, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, type: 3} | |||||
--- !u!1 &39222622 | --- !u!1 &39222622 | ||||
GameObject: | GameObject: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -645,6 +715,80 @@ CanvasRenderer: | |||||
m_PrefabAsset: {fileID: 0} | m_PrefabAsset: {fileID: 0} | ||||
m_GameObject: {fileID: 45376342} | m_GameObject: {fileID: 45376342} | ||||
m_CullTransparentMesh: 0 | m_CullTransparentMesh: 0 | ||||
--- !u!1 &160562201 | |||||
GameObject: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
serializedVersion: 6 | |||||
m_Component: | |||||
- component: {fileID: 160562202} | |||||
- component: {fileID: 160562204} | |||||
- component: {fileID: 160562203} | |||||
m_Layer: 5 | |||||
m_Name: Image (2) | |||||
m_TagString: Untagged | |||||
m_Icon: {fileID: 0} | |||||
m_NavMeshLayer: 0 | |||||
m_StaticEditorFlags: 0 | |||||
m_IsActive: 1 | |||||
--- !u!224 &160562202 | |||||
RectTransform: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 160562201} | |||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | |||||
m_LocalPosition: {x: 0, y: 0, z: 0} | |||||
m_LocalScale: {x: 0.6, y: 0.6, z: 1} | |||||
m_Children: [] | |||||
m_Father: {fileID: 705294046} | |||||
m_RootOrder: 2 | |||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |||||
m_AnchorMin: {x: 0.5, y: 0.5} | |||||
m_AnchorMax: {x: 0.5, y: 0.5} | |||||
m_AnchoredPosition: {x: 0, y: 295.86} | |||||
m_SizeDelta: {x: 1130, y: 526} | |||||
m_Pivot: {x: 0.5, y: 0.5} | |||||
--- !u!114 &160562203 | |||||
MonoBehaviour: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 160562201} | |||||
m_Enabled: 1 | |||||
m_EditorHideFlags: 0 | |||||
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||||
m_Name: | |||||
m_EditorClassIdentifier: | |||||
m_Material: {fileID: 0} | |||||
m_Color: {r: 1, g: 1, b: 1, a: 1} | |||||
m_RaycastTarget: 1 | |||||
m_OnCullStateChanged: | |||||
m_PersistentCalls: | |||||
m_Calls: [] | |||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, | |||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | |||||
m_Sprite: {fileID: 21300000, guid: 63d2a9582e37ede419f177ee40443388, type: 3} | |||||
m_Type: 0 | |||||
m_PreserveAspect: 0 | |||||
m_FillCenter: 1 | |||||
m_FillMethod: 4 | |||||
m_FillAmount: 1 | |||||
m_FillClockwise: 1 | |||||
m_FillOrigin: 0 | |||||
m_UseSpriteMesh: 0 | |||||
--- !u!222 &160562204 | |||||
CanvasRenderer: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 160562201} | |||||
m_CullTransparentMesh: 0 | |||||
--- !u!1 &179665039 | --- !u!1 &179665039 | ||||
GameObject: | GameObject: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -996,6 +1140,44 @@ CanvasRenderer: | |||||
m_PrefabAsset: {fileID: 0} | m_PrefabAsset: {fileID: 0} | ||||
m_GameObject: {fileID: 656682076} | m_GameObject: {fileID: 656682076} | ||||
m_CullTransparentMesh: 0 | m_CullTransparentMesh: 0 | ||||
--- !u!1 &705294045 | |||||
GameObject: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
serializedVersion: 6 | |||||
m_Component: | |||||
- component: {fileID: 705294046} | |||||
m_Layer: 5 | |||||
m_Name: loginBthTrans | |||||
m_TagString: Untagged | |||||
m_Icon: {fileID: 0} | |||||
m_NavMeshLayer: 0 | |||||
m_StaticEditorFlags: 0 | |||||
m_IsActive: 1 | |||||
--- !u!224 &705294046 | |||||
RectTransform: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 705294045} | |||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} | |||||
m_LocalPosition: {x: 0, y: 0, z: 0} | |||||
m_LocalScale: {x: 1, y: 1, z: 1} | |||||
m_Children: | |||||
- {fileID: 1719537384} | |||||
- {fileID: 1445372296} | |||||
- {fileID: 160562202} | |||||
m_Father: {fileID: 1392791841} | |||||
m_RootOrder: 4 | |||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |||||
m_AnchorMin: {x: 0.5, y: 0.5} | |||||
m_AnchorMax: {x: 0.5, y: 0.5} | |||||
m_AnchoredPosition: {x: 0, y: -172.5} | |||||
m_SizeDelta: {x: 100, y: 100} | |||||
m_Pivot: {x: 0.5, y: 0.5} | |||||
--- !u!1 &867391742 | --- !u!1 &867391742 | ||||
GameObject: | GameObject: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -1282,12 +1464,12 @@ GameObject: | |||||
m_Component: | m_Component: | ||||
- component: {fileID: 1302099225} | - component: {fileID: 1302099225} | ||||
m_Layer: 5 | m_Layer: 5 | ||||
m_Name: GameObject | |||||
m_Name: PhoneTrans | |||||
m_TagString: Untagged | m_TagString: Untagged | ||||
m_Icon: {fileID: 0} | m_Icon: {fileID: 0} | ||||
m_NavMeshLayer: 0 | m_NavMeshLayer: 0 | ||||
m_StaticEditorFlags: 0 | m_StaticEditorFlags: 0 | ||||
m_IsActive: 1 | |||||
m_IsActive: 0 | |||||
--- !u!224 &1302099225 | --- !u!224 &1302099225 | ||||
RectTransform: | RectTransform: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -1485,6 +1667,7 @@ RectTransform: | |||||
- {fileID: 1796563212} | - {fileID: 1796563212} | ||||
- {fileID: 1302099225} | - {fileID: 1302099225} | ||||
- {fileID: 1768218918} | - {fileID: 1768218918} | ||||
- {fileID: 705294046} | |||||
m_Father: {fileID: 75} | m_Father: {fileID: 75} | ||||
m_RootOrder: 0 | m_RootOrder: 0 | ||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | ||||
@@ -1511,6 +1694,127 @@ MonoBehaviour: | |||||
SendCodeButton: {fileID: 1957083329} | SendCodeButton: {fileID: 1957083329} | ||||
SendCodeButtonText: {fileID: 192227197} | SendCodeButtonText: {fileID: 192227197} | ||||
LoginButton: {fileID: 867391744} | LoginButton: {fileID: 867391744} | ||||
PhoneTrans: {fileID: 1302099224} | |||||
loginBthTrans: {fileID: 705294045} | |||||
PhoneLoginButton: {fileID: 1445372299} | |||||
WxLoginButton: {fileID: 1719537387} | |||||
--- !u!1 &1445372295 | |||||
GameObject: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
serializedVersion: 6 | |||||
m_Component: | |||||
- component: {fileID: 1445372296} | |||||
- component: {fileID: 1445372298} | |||||
- component: {fileID: 1445372297} | |||||
- component: {fileID: 1445372299} | |||||
m_Layer: 5 | |||||
m_Name: phoneLogin | |||||
m_TagString: Untagged | |||||
m_Icon: {fileID: 0} | |||||
m_NavMeshLayer: 0 | |||||
m_StaticEditorFlags: 0 | |||||
m_IsActive: 1 | |||||
--- !u!224 &1445372296 | |||||
RectTransform: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1445372295} | |||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | |||||
m_LocalPosition: {x: 0, y: 0, z: 0} | |||||
m_LocalScale: {x: 1, y: 1, z: 1} | |||||
m_Children: [] | |||||
m_Father: {fileID: 705294046} | |||||
m_RootOrder: 1 | |||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |||||
m_AnchorMin: {x: 0.5, y: 0.5} | |||||
m_AnchorMax: {x: 0.5, y: 0.5} | |||||
m_AnchoredPosition: {x: 250, y: 0} | |||||
m_SizeDelta: {x: 327, y: 109} | |||||
m_Pivot: {x: 0.5, y: 0.5} | |||||
--- !u!114 &1445372297 | |||||
MonoBehaviour: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1445372295} | |||||
m_Enabled: 1 | |||||
m_EditorHideFlags: 0 | |||||
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||||
m_Name: | |||||
m_EditorClassIdentifier: | |||||
m_Material: {fileID: 0} | |||||
m_Color: {r: 1, g: 1, b: 1, a: 1} | |||||
m_RaycastTarget: 1 | |||||
m_OnCullStateChanged: | |||||
m_PersistentCalls: | |||||
m_Calls: [] | |||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, | |||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | |||||
m_Sprite: {fileID: 21300000, guid: b712e65990021194795e721125b0ad46, type: 3} | |||||
m_Type: 0 | |||||
m_PreserveAspect: 0 | |||||
m_FillCenter: 1 | |||||
m_FillMethod: 4 | |||||
m_FillAmount: 1 | |||||
m_FillClockwise: 1 | |||||
m_FillOrigin: 0 | |||||
m_UseSpriteMesh: 0 | |||||
--- !u!222 &1445372298 | |||||
CanvasRenderer: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1445372295} | |||||
m_CullTransparentMesh: 0 | |||||
--- !u!114 &1445372299 | |||||
MonoBehaviour: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1445372295} | |||||
m_Enabled: 1 | |||||
m_EditorHideFlags: 0 | |||||
m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||||
m_Name: | |||||
m_EditorClassIdentifier: | |||||
m_Navigation: | |||||
m_Mode: 3 | |||||
m_SelectOnUp: {fileID: 0} | |||||
m_SelectOnDown: {fileID: 0} | |||||
m_SelectOnLeft: {fileID: 0} | |||||
m_SelectOnRight: {fileID: 0} | |||||
m_Transition: 1 | |||||
m_Colors: | |||||
m_NormalColor: {r: 1, g: 1, b: 1, a: 1} | |||||
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} | |||||
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} | |||||
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} | |||||
m_ColorMultiplier: 1 | |||||
m_FadeDuration: 0.1 | |||||
m_SpriteState: | |||||
m_HighlightedSprite: {fileID: 0} | |||||
m_PressedSprite: {fileID: 0} | |||||
m_DisabledSprite: {fileID: 0} | |||||
m_AnimationTriggers: | |||||
m_NormalTrigger: Normal | |||||
m_HighlightedTrigger: Highlighted | |||||
m_PressedTrigger: Pressed | |||||
m_DisabledTrigger: Disabled | |||||
m_Interactable: 1 | |||||
m_TargetGraphic: {fileID: 1445372297} | |||||
m_OnClick: | |||||
m_PersistentCalls: | |||||
m_Calls: [] | |||||
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, | |||||
Culture=neutral, PublicKeyToken=null | |||||
--- !u!1 &1622434996 | --- !u!1 &1622434996 | ||||
GameObject: | GameObject: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -1652,6 +1956,123 @@ CanvasRenderer: | |||||
m_PrefabAsset: {fileID: 0} | m_PrefabAsset: {fileID: 0} | ||||
m_GameObject: {fileID: 1622434996} | m_GameObject: {fileID: 1622434996} | ||||
m_CullTransparentMesh: 0 | m_CullTransparentMesh: 0 | ||||
--- !u!1 &1719537383 | |||||
GameObject: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
serializedVersion: 6 | |||||
m_Component: | |||||
- component: {fileID: 1719537384} | |||||
- component: {fileID: 1719537386} | |||||
- component: {fileID: 1719537385} | |||||
- component: {fileID: 1719537387} | |||||
m_Layer: 5 | |||||
m_Name: wxLogin | |||||
m_TagString: Untagged | |||||
m_Icon: {fileID: 0} | |||||
m_NavMeshLayer: 0 | |||||
m_StaticEditorFlags: 0 | |||||
m_IsActive: 1 | |||||
--- !u!224 &1719537384 | |||||
RectTransform: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1719537383} | |||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | |||||
m_LocalPosition: {x: 0, y: 0, z: 0} | |||||
m_LocalScale: {x: 1, y: 1, z: 1} | |||||
m_Children: [] | |||||
m_Father: {fileID: 705294046} | |||||
m_RootOrder: 0 | |||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |||||
m_AnchorMin: {x: 0.5, y: 0.5} | |||||
m_AnchorMax: {x: 0.5, y: 0.5} | |||||
m_AnchoredPosition: {x: -250, y: 0} | |||||
m_SizeDelta: {x: 327, y: 109} | |||||
m_Pivot: {x: 0.5, y: 0.5} | |||||
--- !u!114 &1719537385 | |||||
MonoBehaviour: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1719537383} | |||||
m_Enabled: 1 | |||||
m_EditorHideFlags: 0 | |||||
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||||
m_Name: | |||||
m_EditorClassIdentifier: | |||||
m_Material: {fileID: 0} | |||||
m_Color: {r: 1, g: 1, b: 1, a: 1} | |||||
m_RaycastTarget: 1 | |||||
m_OnCullStateChanged: | |||||
m_PersistentCalls: | |||||
m_Calls: [] | |||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, | |||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | |||||
m_Sprite: {fileID: 21300000, guid: 27f253e451b91484b9dddd97028c0699, type: 3} | |||||
m_Type: 0 | |||||
m_PreserveAspect: 0 | |||||
m_FillCenter: 1 | |||||
m_FillMethod: 4 | |||||
m_FillAmount: 1 | |||||
m_FillClockwise: 1 | |||||
m_FillOrigin: 0 | |||||
m_UseSpriteMesh: 0 | |||||
--- !u!222 &1719537386 | |||||
CanvasRenderer: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1719537383} | |||||
m_CullTransparentMesh: 0 | |||||
--- !u!114 &1719537387 | |||||
MonoBehaviour: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 1719537383} | |||||
m_Enabled: 1 | |||||
m_EditorHideFlags: 0 | |||||
m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||||
m_Name: | |||||
m_EditorClassIdentifier: | |||||
m_Navigation: | |||||
m_Mode: 3 | |||||
m_SelectOnUp: {fileID: 0} | |||||
m_SelectOnDown: {fileID: 0} | |||||
m_SelectOnLeft: {fileID: 0} | |||||
m_SelectOnRight: {fileID: 0} | |||||
m_Transition: 1 | |||||
m_Colors: | |||||
m_NormalColor: {r: 1, g: 1, b: 1, a: 1} | |||||
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} | |||||
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} | |||||
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} | |||||
m_ColorMultiplier: 1 | |||||
m_FadeDuration: 0.1 | |||||
m_SpriteState: | |||||
m_HighlightedSprite: {fileID: 0} | |||||
m_PressedSprite: {fileID: 0} | |||||
m_DisabledSprite: {fileID: 0} | |||||
m_AnimationTriggers: | |||||
m_NormalTrigger: Normal | |||||
m_HighlightedTrigger: Highlighted | |||||
m_PressedTrigger: Pressed | |||||
m_DisabledTrigger: Disabled | |||||
m_Interactable: 1 | |||||
m_TargetGraphic: {fileID: 1719537385} | |||||
m_OnClick: | |||||
m_PersistentCalls: | |||||
m_Calls: [] | |||||
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, | |||||
Culture=neutral, PublicKeyToken=null | |||||
--- !u!1 &1722103140 | --- !u!1 &1722103140 | ||||
GameObject: | GameObject: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -2014,6 +2435,24 @@ CanvasRenderer: | |||||
m_PrefabAsset: {fileID: 0} | m_PrefabAsset: {fileID: 0} | ||||
m_GameObject: {fileID: 1957083327} | m_GameObject: {fileID: 1957083327} | ||||
m_CullTransparentMesh: 0 | m_CullTransparentMesh: 0 | ||||
--- !u!1 &2072301149 stripped | |||||
GameObject: | |||||
m_CorrespondingSourceObject: {fileID: 3375001057570166699, guid: 9b0f4d97ae0b01149a8ba8adb6bd35e2, | |||||
type: 3} | |||||
m_PrefabInstance: {fileID: 24259649} | |||||
m_PrefabAsset: {fileID: 0} | |||||
--- !u!114 &2072301150 | |||||
MonoBehaviour: | |||||
m_ObjectHideFlags: 0 | |||||
m_CorrespondingSourceObject: {fileID: 0} | |||||
m_PrefabInstance: {fileID: 0} | |||||
m_PrefabAsset: {fileID: 0} | |||||
m_GameObject: {fileID: 2072301149} | |||||
m_Enabled: 1 | |||||
m_EditorHideFlags: 0 | |||||
m_Script: {fileID: 11500000, guid: 845cd578293274746aef9615b7c5048c, type: 3} | |||||
m_Name: | |||||
m_EditorClassIdentifier: | |||||
--- !u!1001 &9222194805866882313 | --- !u!1001 &9222194805866882313 | ||||
PrefabInstance: | PrefabInstance: | ||||
m_ObjectHideFlags: 0 | m_ObjectHideFlags: 0 | ||||
@@ -1,95 +1,115 @@ | |||||
using System; | |||||
using System.Collections; | |||||
using Cysharp.Threading.Tasks; | |||||
using UnityEngine; | |||||
using UnityEngine.SceneManagement; | |||||
using UnityEngine.UI; | |||||
public class LoginView : MonoBehaviour | |||||
{ | |||||
public InputField PhoneNumberInputField; | |||||
public InputField VerifyCodeInputField; | |||||
public Text ErrorText; | |||||
public Button SendCodeButton; | |||||
public Text SendCodeButtonText; | |||||
public Button LoginButton; | |||||
// Start is called before the first frame update | |||||
void Start() | |||||
using System; | |||||
using System.Collections; | |||||
using Cysharp.Threading.Tasks; | |||||
using UnityEngine; | |||||
using UnityEngine.SceneManagement; | |||||
using UnityEngine.UI; | |||||
using ETHotfix; | |||||
public class LoginView : MonoBehaviour | |||||
{ | |||||
public InputField PhoneNumberInputField; | |||||
public InputField VerifyCodeInputField; | |||||
public Text ErrorText; | |||||
public Button SendCodeButton; | |||||
public Text SendCodeButtonText; | |||||
public Button LoginButton; | |||||
public GameObject PhoneTrans; | |||||
public GameObject loginBthTrans; | |||||
public Button PhoneLoginButton; | |||||
public Button WxLoginButton; | |||||
// Start is called before the first frame update | |||||
void Start() | |||||
{ | |||||
SendCodeButton.onClick.AddListener(SendVerifyCode); | |||||
LoginButton.onClick.AddListener(Login); | |||||
PhoneLoginButton.onClick.AddListener(ClickPhoneLoginButton); | |||||
WxLoginButton.onClick.AddListener(ClickWxLoginButton); | |||||
// 读取缓存的手机号 | |||||
if (PlayerPrefs.HasKey("CachedPhoneNumber")) | |||||
{ | |||||
string cachedPhoneNumber = PlayerPrefs.GetString("CachedPhoneNumber"); | |||||
if (!string.IsNullOrEmpty(cachedPhoneNumber)) | |||||
{ | |||||
HttpManager.Instance.phoneNum = cachedPhoneNumber; | |||||
SceneManager.LoadScene("LoadingScreen"); | |||||
} | |||||
} | |||||
} | |||||
private void SendVerifyCode() | |||||
{ | |||||
SendVerifyCodeTask().Forget(); | |||||
} | |||||
async UniTask SendVerifyCodeTask() | |||||
{ | |||||
CodeResponse codeResponse = await HttpManager.Instance.RequestPost<CodeRequest, CodeResponse>("request-code", new CodeRequest(){phone = PhoneNumberInputField.text}); | |||||
if (codeResponse.message == "验证码已发送") | |||||
{ | |||||
SendCodeButton.interactable = false; | |||||
Countdown(30).Forget(); | |||||
} | |||||
ErrorText.text = codeResponse.message; | |||||
} | |||||
private async UniTaskVoid Countdown(int duration) | |||||
{ | |||||
// SendCodeButtonText.color = Color.gray; | |||||
while (duration > 0) | |||||
{ | |||||
SendCodeButtonText.text = $"发送验证码({duration})"; | |||||
await UniTask.Delay(TimeSpan.FromSeconds(1), ignoreTimeScale: false); | |||||
duration--; | |||||
} | |||||
SendCodeButtonText.text = "发送验证码"; | |||||
SendCodeButton.interactable = true; | |||||
// SendCodeButtonText.color = Color.black; | |||||
} | |||||
void Login() | |||||
{ | |||||
LoginTask().Forget(); | |||||
NativeBridgeUtil.Instance.WeChatLogin(1); | |||||
} | |||||
async UniTask LoginTask() | |||||
{ | |||||
string phonenum = PhoneNumberInputField.text; | |||||
LoginResponse loginResponse = await HttpManager.Instance.RequestPost<LoginRequest, LoginResponse>("verify-code", new LoginRequest(){phone = phonenum, code = VerifyCodeInputField.text}); | |||||
if (loginResponse.message == "验证成功") | |||||
{ | |||||
// 缓存手机号 | |||||
PlayerPrefs.SetString("CachedPhoneNumber", phonenum); | |||||
PlayerPrefs.Save(); | |||||
//ShowHomeView(phonenum); | |||||
//SceneManager.LoadSceneAsync("LoadingScreen"); | |||||
HttpManager.Instance.phoneNum = phonenum; | |||||
SceneManager.LoadScene("LoadingScreen"); | |||||
} | |||||
else | |||||
{ | |||||
ErrorText.text = loginResponse.message; | |||||
} | |||||
} | |||||
void ClickPhoneLoginButton() | |||||
{ | { | ||||
SendCodeButton.onClick.AddListener(SendVerifyCode); | |||||
LoginButton.onClick.AddListener(Login); | |||||
// 读取缓存的手机号 | |||||
if (PlayerPrefs.HasKey("CachedPhoneNumber")) | |||||
{ | |||||
string cachedPhoneNumber = PlayerPrefs.GetString("CachedPhoneNumber"); | |||||
if (!string.IsNullOrEmpty(cachedPhoneNumber)) | |||||
{ | |||||
HttpManager.Instance.phoneNum = cachedPhoneNumber; | |||||
SceneManager.LoadScene("LoadingScreen"); | |||||
} | |||||
} | |||||
} | |||||
private void SendVerifyCode() | |||||
{ | |||||
SendVerifyCodeTask().Forget(); | |||||
} | |||||
async UniTask SendVerifyCodeTask() | |||||
{ | |||||
CodeResponse codeResponse = await HttpManager.Instance.RequestPost<CodeRequest, CodeResponse>("request-code", new CodeRequest(){phone = PhoneNumberInputField.text}); | |||||
if (codeResponse.message == "验证码已发送") | |||||
{ | |||||
SendCodeButton.interactable = false; | |||||
Countdown(30).Forget(); | |||||
} | |||||
ErrorText.text = codeResponse.message; | |||||
} | |||||
private async UniTaskVoid Countdown(int duration) | |||||
{ | |||||
// SendCodeButtonText.color = Color.gray; | |||||
while (duration > 0) | |||||
{ | |||||
SendCodeButtonText.text = $"发送验证码({duration})"; | |||||
await UniTask.Delay(TimeSpan.FromSeconds(1), ignoreTimeScale: false); | |||||
duration--; | |||||
} | |||||
SendCodeButtonText.text = "发送验证码"; | |||||
SendCodeButton.interactable = true; | |||||
// SendCodeButtonText.color = Color.black; | |||||
} | |||||
void Login() | |||||
{ | |||||
LoginTask().Forget(); | |||||
} | |||||
async UniTask LoginTask() | |||||
{ | |||||
string phonenum = PhoneNumberInputField.text; | |||||
LoginResponse loginResponse = await HttpManager.Instance.RequestPost<LoginRequest, LoginResponse>("verify-code", new LoginRequest(){phone = phonenum, code = VerifyCodeInputField.text}); | |||||
if (loginResponse.message == "验证成功") | |||||
{ | |||||
// 缓存手机号 | |||||
PlayerPrefs.SetString("CachedPhoneNumber", phonenum); | |||||
PlayerPrefs.Save(); | |||||
//ShowHomeView(phonenum); | |||||
//SceneManager.LoadSceneAsync("LoadingScreen"); | |||||
HttpManager.Instance.phoneNum = phonenum; | |||||
SceneManager.LoadScene("LoadingScreen"); | |||||
} | |||||
else | |||||
{ | |||||
ErrorText.text = loginResponse.message; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
void ClickWxLoginButton() | |||||
{ | |||||
NativeBridgeUtil.Instance.WeChatLogin(1); | |||||
} | |||||
} |
@@ -1,48 +0,0 @@ | |||||
using System.Collections; | |||||
using System.Collections.Generic; | |||||
using UnityEngine; | |||||
public class WeChatLogin : MonoBehaviour | |||||
{ | |||||
// 单例模式 | |||||
public static WeChatLogin Instance { get; private set; } | |||||
private void Awake() | |||||
{ | |||||
// 实现单例模式 | |||||
if (Instance != null && Instance != this) | |||||
{ | |||||
Destroy(gameObject); | |||||
} | |||||
else | |||||
{ | |||||
Instance = this; | |||||
DontDestroyOnLoad(gameObject); | |||||
} | |||||
} | |||||
// 发起微信登录 | |||||
public void Login() | |||||
{ | |||||
#if UNITY_ANDROID && !UNITY_EDITOR | |||||
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) | |||||
{ | |||||
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); | |||||
// 调用你在 Android 插件中实现的微信登录方法 | |||||
using (AndroidJavaClass wxApiClass = new AndroidJavaClass("com.yourcompany.wxapi.WXEntryActivity")) | |||||
{ | |||||
// 这里可以调用一个静态方法,例如 LoginWeChat() | |||||
wxApiClass.CallStatic("LoginWeChat", "your_state_value"); | |||||
} | |||||
} | |||||
#endif | |||||
} | |||||
// 该方法会被 Android 端通过 UnitySendMessage 调用,传回登录结果(JSON格式字符串) | |||||
public void OnWeChatLoginResult(string result) | |||||
{ | |||||
Debug.Log("微信登录返回:" + result); | |||||
// 在此解析 result,得到 unionid、openid 等信息 | |||||
} | |||||
} |