国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity3D與iOS的交互 簡(jiǎn)單版開箱即用

這篇具有很好參考價(jià)值的文章主要介紹了Unity3D與iOS的交互 簡(jiǎn)單版開箱即用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文適合的情況如下:

Unity客戶端人員 與 IOS端研發(fā)人員合作的情況

目錄

From U3D to iOS

實(shí)現(xiàn)原理

1.unity工程目錄創(chuàng)建2個(gè)文件?NativeCallProxy.m、NativeCallProxy.h?并且放到Unity工程目錄Plugins/iOS/unity_ios_plus目錄下

2.創(chuàng)建C#調(diào)用腳本?定義對(duì)應(yīng).mm腳本的 調(diào)用接口,調(diào)用也如下


From U3D to iOS

實(shí)現(xiàn)原理

由于U3D無法直接調(diào)用Objc或者Swift語言聲明的接口,幸好U3D的主要語言是C#,因此可以利用C#的特性來訪問C語言所定義的接口,然后再通過C接口再調(diào)用ObjC的代碼(對(duì)于Swift代碼則還需要使用OC橋接)。

下面演示:利用C#的特性來訪問C語言所定義的接口,然后再通過C接口再調(diào)用ObjC的代碼

1.unity工程目錄創(chuàng)建2個(gè)文件?NativeCallProxy.m、NativeCallProxy.h?并且放到Unity工程目錄Plugins/iOS/unity_ios_plus目錄下

Unity3D與iOS的交互 簡(jiǎn)單版開箱即用,Unity,iOS,ios,unity

?NativeCallProxy.m代碼內(nèi)容:

#import <Foundation/Foundation.h>
#import "NativeCallProxy.h"

//固定寫法
@implementation FrameworkLibAPI

id<NativeCallsProtocol> api = NULL;
+(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi
{
    api = aApi;
}
//固定寫法結(jié)束
@end

//固定寫法
extern "C" {
//void showHostMainWindow(const char* color) { return [api showHostMainWindow:[NSString stringWithUTF8String:color]]; };


//返回字符串的1個(gè)函數(shù)
const char*  unityCallGetInitData(){

    NSString* str=[api unityCallGetInitData];
    char* ret = nullptr;
//    ret = (char*)malloc([str length]+1);
//    memcpy(ret, [str UTF8String], ([str length])+1);

        ret = (char*)malloc([str length]);
        memcpy(ret, [str UTF8String], [str length]);
        return ret;    
};

//無返回的1個(gè)函數(shù)
void unityCallJumpLogin(){
  return  [api unityCallJumpLogin];
};

//無返回、傳入字符串的函數(shù)
void unityCallJumpToRecharge(const char* gameStatus,const char* receOBName,const char* methodName){
    return [api unityCallJumpToRecharge:[NSString stringWithUTF8String:gameStatus] :[NSString stringWithUTF8String:receOBName] :[NSString stringWithUTF8String:methodName]];
    
};



void unityCallCloseVC(){
    return [api unityCallCloseVC];
};

//隱私按鈕
void onPrivacyButton(){
    return [api onPrivacyButton];
}

//儲(chǔ)值按鈕
const char* storedValue(){

    NSString* str=[api storedValue];
    char* ret = nullptr; 

    ret = (char*)malloc([str length]);
    memcpy(ret, [str UTF8String], [str length]);
    return ret;
}

//切換游戲
const char* ChangeGame(){

    NSString* str=[api ChangeGame];
    char* ret = nullptr;

    ret = (char*)malloc([str length]);
    memcpy(ret, [str UTF8String], [str length]);
    return ret;

}



}

//extern "C" {
//
//}

NativeCallProxy.h代碼內(nèi)容

// [!] important set UnityFramework in Target Membership for this file
// [!]           and set Public header visibility

//固定寫法
#import <Foundation/Foundation.h>
// NativeCallsProtocol defines protocol with methods you want to be called from managed
@protocol NativeCallsProtocol
@required


// other methods 自定義方法
/**
 獲取初始json數(shù)據(jù):baseUrl、mac_id、gameType、jwt 【對(duì)應(yīng)mm文件的自定義函數(shù)名】
 */
-(NSString*)unityCallGetInitData;
/**
 重新登錄	【對(duì)應(yīng)mm文件的自定義函數(shù)名的接口】
 */
-(void)unityCallJumpLogin;
/**
 跳充值頁前保存數(shù)據(jù),充值頁返回后把保存的數(shù)據(jù)發(fā)信息給unity 【對(duì)應(yīng)mm文件的自定義函數(shù)名的接口】
 */
-(void)unityCallJumpToRecharge:(NSString*) gameStatus :(NSString*) receOBName :(NSString*) methodName;

//ios——關(guān)閉vc 【對(duì)應(yīng)mm文件的自定義函數(shù)名的接口】
-(void)unityCallCloseVC;

//隱私按鈕 【對(duì)應(yīng)mm文件的自定義函數(shù)名的接口】
-(void)onPrivacyButton;

//儲(chǔ)值按鈕 【對(duì)應(yīng)mm文件的自定義函數(shù)名的接口】
-(NSString*)storedValue;

//ch Game 【對(duì)應(yīng)mm文件的自定義函數(shù)名的接口】
-(NSString*)ChangeGame;

//自定義方法結(jié)束
@end

//以下為固定寫法
__attribute__ ((visibility("default")))
@interface FrameworkLibAPI : NSObject
// call it any time after UnityFrameworkLoad to set object implementing NativeCallsProtocol methods
+(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi;

@end


勾選iOS平臺(tái)

Unity3D與iOS的交互 簡(jiǎn)單版開箱即用,Unity,iOS,ios,unity文章來源地址http://www.zghlxwxcb.cn/news/detail-740777.html

2.創(chuàng)建C#調(diào)用腳本?定義對(duì)應(yīng).mm腳本的 調(diào)用接口,調(diào)用也如下

using System;
using System.Collections;
using System.Collections.Generic;
using LitJson;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;
using UnityEngine.SceneManagement; //引入  這個(gè)命名空間,讓unity可以使用 Assets/Plugins/iOS 或 Android/ 這里的dll文件

/// <summary>
/// 呼叫安卓或 IOS 工具類
/// </summary>
public class CallAndroidOrIos :MonoBehaviour
{

    public static CallAndroidOrIos instance;
    private void Awake()
    {
        instance = this;
    }

    #region  關(guān)于IOS的操作

    
 /// <summary>
 /// 模擬 安卓或iOS ,DLL的類;
 /// </summary>
    public class NativeAPI
   {
       
#if UNITY_EDITOR || UNITY_ANDROID

       /// <summary>
       /// 獲取 IOS返回的 json數(shù)據(jù) :baseUrl、mac_id、gameType、jwt
       /// </summary> 
       public static string unityCallGetInitData()
       {
           return "";
       }

       /// <summary>
       /// 讓IOS 呼叫重新登錄
       /// </summary>
       /// <returns></returns>
       public static void unityCallJumpLogin()
       {
           Debug.Log("呼叫 ios重新登錄");
       }


       /// <summary>
       /// IOS充值的返回 
       /// </summary> 
       public static void unityCallJumpToRecharge(string gameStatus, string
           receOBName, string methodName)
       {
           
       }


       /// <summary>
       /// 關(guān)閉當(dāng)前 IOS活動(dòng)頁
       /// </summary>
       public static  void unityCallCloseVC()
       {
           
       }

       /// <summary>
       /// 隱私按鈕
       /// </summary>
       public static void onPrivacyButton()
       {
           
           
       }

       /// <summary>
       /// 儲(chǔ)值被點(diǎn)擊
       /// </summary>
       public static string storedValue()
       {
           return "";
       }
     
       /// <summary>
       /// 切換G
       /// </summary>
       /// <returns></returns>
       public static string ChangeGame()
       {
           return "";
       }

    
     
  
#elif UNITY_IOS || UNITY_TVOS 

       //定義對(duì)應(yīng).mm腳本的 調(diào)用接口-----------
       [DllImport("__Internal")]
       public static extern string unityCallGetInitData();

       [DllImport("__Internal")]
       public static extern void unityCallJumpLogin();

      [DllImport("__Internal")]
       public static extern void unityCallJumpToRecharge(string gameStatus, string
           receOBName, string methodName);
       
        [DllImport("__Internal")]
        public static extern void unityCallCloseVC();

       [DllImport("__Internal")]
       public static extern void onPrivacyButton();

       [DllImport("__Internal")]
       public static extern string storedValue();
       
       [DllImport("__Internal")]
       public static extern string ChangeGame();
#endif

   }
    

    #endregion
    
    

    /// <summary>
    /// 被安卓調(diào)用過來的 統(tǒng)一函數(shù)名稱  Public void Give_AnCall(string value)
    /// </summary>
    public const string Give_AnCall = "Give_AnCall";

    /// <summary>
    /// 當(dāng)處于同一個(gè)物體的時(shí)候;用來區(qū)分函數(shù)名稱
    /// </summary>
    public const string Give_AnCall2 = "Give_AnCall2";
    
    /// <summary>
    /// 關(guān)閉app當(dāng)前頁面
    /// </summary>
    public void unityCallCloseActivity()
    {

        if (Application.platform ==RuntimePlatform.IPhonePlayer|| Application.platform==RuntimePlatform.OSXEditor)
        {
            Debug.Log("IOS 關(guān)閉當(dāng)前Activity----------");
            NativeAPI.unityCallCloseVC();//關(guān)閉Ios 活動(dòng)頁
        }
        else
        {
            Debug.Log("關(guān)閉當(dāng)前Activity----------");
            AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//只能調(diào)用靜態(tài)
            AndroidJavaObject  s_ActivityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");//可以調(diào)用非靜態(tài)
            s_ActivityContext.Call("unityCallCloseActivity");//關(guān)閉頁面 
        }
        
     
    }



    /// <summary>
    /// 獲取 玩家進(jìn)入哪個(gè)游戲類型 [ 0是推幣機(jī) 1是連連看 -1是未知類型]
    /// 并且獲取到 baseURL mac_id jwt gameType
    /// </summary> 
    public IEnumerator unityCallGetInitData(Action<JsonData,string> callBack)
    {
        int Time = 0;
        string strData="";
        string Tips="";
  
        try
        {
            if (Application.platform ==RuntimePlatform.IPhonePlayer)
            {
                strData = NativeAPI.unityCallGetInitData();
            }
            else
            {
                AndroidJavaClass activityClass;
                AndroidJavaObject s_ActivityContext;
                activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //只能調(diào)用靜態(tài)
                s_ActivityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity"); //可以調(diào)用非靜態(tài)
                strData = s_ActivityContext.Call<string>("unityCallGetInitData");
            }

        }
        catch (Exception e)
        {
            Tips = "Error:" + e;
            if (callBack != null)
            {
                callBack(null, Tips);
            }
 
            //跳出協(xié)程的執(zhí)行
            yield break;
        }
        
        while (string.IsNullOrEmpty(strData))//等待回調(diào)
        {
            yield return new WaitForSeconds(1);
            Time++;
            if (Time >= 10)
            {
                break; //跳出循環(huán)
            }
        }

        //還是沒有 收到安卓返回?cái)?shù)據(jù)  
        if (string.IsNullOrEmpty(strData))
        {
             
            if (callBack!=null)
            {
                Tips = "Get the Android Or IOS data timeout";//獲取安卓數(shù)據(jù)超時(shí)
                callBack(null, Tips);
            } 
        }
        else
        {
            JsonData jsonData = JsonMapper.ToObject(strData);
            if (callBack!=null)
            {
                callBack(jsonData, "successful"); 
            }
        }
        
    }




    /// <summary>
    /// 跳轉(zhuǎn)到 充值界面 (1.當(dāng)前游戲場(chǎng)景名稱 ,2.物體名稱 ,3.安卓返回參數(shù)到 哪個(gè)函數(shù)接收) 
    /// </summary> 
    public void unityCallJumpToRecharge(string ScreenName, string receOBName, string methodName)
    {

        if (Application.platform ==RuntimePlatform.IPhonePlayer)
        {
            NativeAPI.unityCallJumpToRecharge(ScreenName,receOBName,methodName);//跳轉(zhuǎn)到 充值
        }
        else
        {
            Debug.Log("呼叫 安卓跳轉(zhuǎn)充值!----------------");
            AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//只能調(diào)用靜態(tài)
            AndroidJavaObject  s_ActivityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");//可以調(diào)用非靜態(tài)
            s_ActivityContext.Call("unityCallJumpToRecharge",ScreenName,receOBName,methodName); 
        }
     
    }



    /// <summary>
    /// 跳轉(zhuǎn)到 重新登錄界面
    /// </summary>
    public void unityCallJumpLogin()
    {
        if (Application.platform ==RuntimePlatform.IPhonePlayer)
        {
            NativeAPI.unityCallJumpLogin();//IOS 進(jìn)入 重新登錄頁面
        }
        else
        {
            Debug.Log("跳轉(zhuǎn)到重新登錄的Activity--------------");
            AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//只能調(diào)用靜態(tài)
            AndroidJavaObject  s_ActivityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");//可以調(diào)用非靜態(tài)
            s_ActivityContext.Call("unityCallJumpLogin");
            activityClass = null;
            s_ActivityContext = null;
        }
    }



    /// <summary>
    /// 顯示UnityLog到 安卓調(diào)試窗
    /// </summary>
    public void unityCallPrintLog(string log)
    {
        if (Application.platform ==RuntimePlatform.IPhonePlayer)
        {
            //TODO 
        }
        else
        {
            AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//只能調(diào)用靜態(tài)
            AndroidJavaObject  s_ActivityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");//可以調(diào)用非靜態(tài)
            s_ActivityContext.Call("unityCallPrintLog",log);
        }
        
     
 
    }


    /// <summary> 打開隱私按鈕 </summary>
    public void onPrivacyButton()
    {

        if (Application.platform ==RuntimePlatform.IPhonePlayer)
        {
            NativeAPI.onPrivacyButton();
        }
        else
        {
            Debug.Log("打開隱私按鈕");
        }
    }

    /// <summary> 打開儲(chǔ)值 </summary>
    public void storedValue()
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
           Debug.Log("ios打開儲(chǔ)值:"+NativeAPI.storedValue()); 
        }
        else
        {
            Debug.Log("打開儲(chǔ)值按鈕");
            if (Application.platform == RuntimePlatform.WindowsEditor)
            {
                //LogoGM.instance.HeroInfo_PlayCount(5);//默認(rèn)給+5個(gè)
                //LogoGM.instance.HeroInfoSave();//PC端 增加可玩次數(shù)保存
                
            }
        }
    }

    /// <summary> 查詢是否切換游戲 </summary>
    /// <returns></returns>
    public string ChangeGame()
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            return "IOS查詢是否切換" + NativeAPI.ChangeGame();
        }
        else
        {
            return "PC查詢游戲切換";
        }
    }
    
    
    
    
    /// <summary>
    /// IOS調(diào)用Unity的方法:UnitySendMessage("物體名", "函數(shù)名", "回調(diào)字符串");
    /// </summary>
    /// <param name="msg"></param>
    public void ReceIosMsg(string msg)
    {
        Debug.Log("IOS 回調(diào)的信息");
        
        /*
        //根據(jù)游戲的場(chǎng)景劃分 確定回調(diào)邏輯
        int scenceId = SceneManager.GetActiveScene().buildIndex;
        if (string.IsNullOrEmpty(msg))
        {
            Debug.Log(scenceId+"場(chǎng)景 收到IOS消息為空字符");
        }
        else
        {
            string strType;
            string strCode;
            //字符串轉(zhuǎn)json對(duì)象
            JsonData jsonData = JsonMapper.ToObject(msg);
            switch (scenceId)
            {
                case 0://場(chǎng)景0
				
                    try
                    {
                        strType = jsonData["type"].ToString();
                        strCode = jsonData["str"].ToString();
                        if (strType=="ChuShiHua")
                        {
                            int code = int.Parse(strCode);
                            if (code==0)//非游戲 靜止在這個(gè)界面
                            {
                                Debug.Log(scenceId+"場(chǎng)景收到非游戲Code,等待跳轉(zhuǎn)");
                                //SetOrientationPortrait();//設(shè)置為豎屏
                                mSpr.gameObject.SetActive(false);
                                TestUpsideDown(1);
								 
							 
                            }
                            else
                            {
                                Debug.Log("正常游戲");
                                toMenu();
                            }
                        }
                        else
                        {
                            Debug.Log(scenceId+"場(chǎng)景 收到的不是初始化字段:"+strType);
                        }
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(string.Format("{0} 場(chǎng)景 解析數(shù)據(jù)出錯(cuò) 原數(shù)據(jù):{1}",scenceId,msg));
                    }
                    break;
                case 1://場(chǎng)景1
                    try
                    {
                        strType = jsonData["type"].ToString();
                        strCode = jsonData["str"].ToString();
                        if (strType == "APPStore_Scuess")
                        {
                            //TODO 儲(chǔ)值成功 添加可玩次數(shù)
                            Debug.Log("儲(chǔ)值成功");
                            HeroInfo_PlayCount(9999);
                            HeroInfoSave();//場(chǎng)景1的儲(chǔ)值
                        }
                        else
                        {
                            Debug.Log(scenceId+"場(chǎng)景 收到的不是儲(chǔ)值字段:"+strType);
                        }
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(string.Format("{0} 場(chǎng)景 解析數(shù)據(jù)出錯(cuò) 原數(shù)據(jù):{1}",scenceId,msg));
                    }
                    break;
            }
        }
	    */
        
		
    }
}

到了這里,關(guān)于Unity3D與iOS的交互 簡(jiǎn)單版開箱即用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity3D開發(fā)之unity和js通信交互

    Unity3D開發(fā)之unity和js通信交互

    官方 方法分享:Unity - 手動(dòng):與瀏覽器腳本的交互 (unity3d.com) 首先需要寫一個(gè)JS的腳本,主要是調(diào)用mergeInto();方法,第一個(gè)參數(shù)不用變,第二個(gè)參數(shù)就是JS的方法集合。寫完之后將這個(gè)文件的后綴改為.jslib,放到Plugins文件夾中 ?Test? 內(nèi)容: 2.C#(掛在場(chǎng)景 任意物體上) 3.Uni

    2024年02月12日
    瀏覽(18)
  • Unity3D2020+導(dǎo)出Android工程中使用并交互

    Unity3D2020+導(dǎo)出Android工程中使用并交互

    , 目錄 1,版本信息 2,前期準(zhǔn)備 Unity方面: Android方面: 3,Android與Unity3D交互 unity2020+ android studio 2021 *不要用android studio 2020系列,存在不能導(dǎo)入Library的bug 1,先配置打包的一些必要要素,包括包名之類 2,修改打包選項(xiàng),將其打包為Android工程? 3,打包出來的工程如下,其中

    2023年04月08日
    瀏覽(98)
  • 【Unity3D】程序紋理簡(jiǎn)單應(yīng)用

    【Unity3D】程序紋理簡(jiǎn)單應(yīng)用

    ? ? ? ? 本文所有案例的完整資源詳見→Unity3D程序紋理簡(jiǎn)單應(yīng)用。 1.1?邊框 ???????? 1)邊框子圖 ? ? ? ? Border.shadersubgraph ????????說明:Any 節(jié)點(diǎn)用于判斷輸入向量中是否存在一個(gè)分量非零,Branch 節(jié)點(diǎn)根據(jù)輸入的真假走不同的分支,詳見→Shader Graph節(jié)點(diǎn)。 ??????

    2024年02月12日
    瀏覽(21)
  • 【Unity3D】如何在uniyt中切換畫布實(shí)現(xiàn)切換界面的交互操作

    【Unity3D】如何在uniyt中切換畫布實(shí)現(xiàn)切換界面的交互操作

    我們?cè)谇袚Q不同界面的時(shí)候,時(shí)常會(huì)用到切換場(chǎng)景的操作。 如果在一個(gè)場(chǎng)景里就可以去實(shí)現(xiàn)切換界面的時(shí)候,若再使用切換場(chǎng)景來實(shí)現(xiàn),會(huì)占用很大的空間,不妨在一個(gè)場(chǎng)景里使用切換畫布的方法來實(shí)現(xiàn)切換界面的交互操作。 ?效果如圖所示: ?在第一個(gè)畫布中,點(diǎn)擊按鈕后

    2024年02月12日
    瀏覽(28)
  • Unity3D Pico VR 手勢(shì)識(shí)別物體交互 適配 MRTK3

    Unity3D Pico VR 手勢(shì)識(shí)別物體交互 適配 MRTK3

    ?當(dāng)前Pico已經(jīng)支持手勢(shì)識(shí)別了,但是提供的PICO Unity Integration SDK 中是沒有手勢(shì)和物體交互的功能,Unity XR Interaction Toolkit提供的手勢(shì)識(shí)別物體交互對(duì) Quest適配的挺好的,Pico 當(dāng)前只能用指尖點(diǎn)觸還不能對(duì)物體進(jìn)行抓握以及手勢(shì)控制射線對(duì)物體進(jìn)行交互。 如要項(xiàng)目想要使用Pico 手

    2024年01月21日
    瀏覽(35)
  • Unity3d 制作一個(gè)簡(jiǎn)單的NPC對(duì)話系統(tǒng)

    Unity3d 制作一個(gè)簡(jiǎn)單的NPC對(duì)話系統(tǒng)

    ? 最近在自己寫一個(gè)比較小的項(xiàng)目,雖然自己是一個(gè)策劃,但是程序方面我覺得也是很有必要學(xué)一學(xué)的。 ? 經(jīng)過了接近一年的學(xué)習(xí),也終于是可以獨(dú)自寫一些小的系統(tǒng)了。 ? 這次自己寫了一個(gè)比較簡(jiǎn)單的NPC對(duì)話系統(tǒng),供大家參考。 進(jìn)入對(duì)話區(qū)域 開始對(duì)話 Inspector面板可調(diào)

    2023年04月08日
    瀏覽(31)
  • Unity3d(webGL)構(gòu)建數(shù)字孿生小案例(包含完整的數(shù)據(jù)交互體系)附贈(zèng)完整代碼

    Unity3d(webGL)構(gòu)建數(shù)字孿生小案例(包含完整的數(shù)據(jù)交互體系)附贈(zèng)完整代碼

    B站視頻演示 點(diǎn)擊獲取合視頻對(duì)應(yīng)的完整版代碼 項(xiàng)目文檔 數(shù)字孿生demo項(xiàng)目,打通了,模型-硬件終端-webGL-web端-服務(wù)端的數(shù)據(jù)交互,屬于較為完整的項(xiàng)目練習(xí)。 包含文件:unity工程文件;webGL文件;前后端代碼文件;硬件代碼; 先來看看概念吧: 數(shù)字孿生體是現(xiàn)有或?qū)⒂械奈?/p>

    2024年02月09日
    瀏覽(35)
  • 【unity3D】unity記憶翻牌小游戲教程(簡(jiǎn)單詳細(xì))

    【unity3D】unity記憶翻牌小游戲教程(簡(jiǎn)單詳細(xì))

    游戲開發(fā)的 學(xué)習(xí)記錄 ⑨ (最近在做得游戲里想加一個(gè)類似于記憶翻牌小游戲得部分,然后在網(wǎng)上收集了資料學(xué)習(xí)了一下,學(xué)會(huì)后寫下這份制作記錄,希望可以幫到你~) ??一位大佬的博客,寫的很詳細(xì):【Unity3D游戲教程】記憶翻牌游戲 (大家可以先看大佬這篇,我寫這篇

    2024年02月07日
    瀏覽(194)
  • Unity3D教程:觸發(fā)器實(shí)現(xiàn)簡(jiǎn)單的場(chǎng)景跳轉(zhuǎn)

    Unity3D教程:觸發(fā)器實(shí)現(xiàn)簡(jiǎn)單的場(chǎng)景跳轉(zhuǎn)

    首先,需確保有一個(gè)想要跳轉(zhuǎn)的目標(biāo)場(chǎng)景。在本案例中,目標(biāo)場(chǎng)景是ending。 第一步:創(chuàng)建一個(gè)碰撞體,放置在需要的觸發(fā)場(chǎng)景跳轉(zhuǎn)的位置。 第二步:刪除多余的腳本,并且新建自己的腳本: 第三

    2024年02月12日
    瀏覽(24)
  • 【Unity3d】 教會(huì)你如何做一個(gè)簡(jiǎn)單的電梯系統(tǒng)(升降平臺(tái))

    【Unity3d】 教會(huì)你如何做一個(gè)簡(jiǎn)單的電梯系統(tǒng)(升降平臺(tái))

    ? ? ? ?博主第一次寫博客,語言略俗,有不足之處還請(qǐng)指正! ? ? ? ?由于自己還處在unity小白階段,受2d升降平臺(tái)的影響(后續(xù)我也會(huì)上傳關(guān)于2d升降平臺(tái)的文章),突發(fā)奇想如何用3d做一個(gè)電梯系統(tǒng),查閱網(wǎng)上資料后,發(fā)現(xiàn)網(wǎng)上對(duì)這方面的講解少之又少,或者說其他博主提

    2024年02月11日
    瀏覽(44)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包