日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D游戏开发之仿仙剑奇侠传仙灵岛机关的实现

發布時間:2024/3/24 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D游戏开发之仿仙剑奇侠传仙灵岛机关的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



? ? ? 我們繼續來做點和仙劍相關的東西,首先我們來看一副圖:

? ? ? ? ?這幅圖呢,是仙劍奇俠傳的第一個迷宮場景——仙靈島的蓮花池。男主角李逍遙為替嬸嬸求藥獨闖仙靈島,在經歷了前面的小草妖戰斗后,李逍遙就來到了 蓮花池,這個迷宮的解法很簡單,乘坐蓮花池中的蘆葦墊到不同的地方,然后用破天錘打碎五座阿修羅像,通往仙靈島的通路就會被打開,就是在仙靈島李逍遙邂逅了正在沐浴的趙靈兒,仙劍奇俠傳的故事從此展開。好了,故事先說到這里,我們來看這里很重要的一個信息:李逍遙踩著蘆葦墊到達不同的地方,然后用破天錘打碎石像開啟機關。我們把最終要的東西提取出來的話就是我們可以踩著蘆葦墊子到不同的地方去。好,我們今天就來實現一個簡化的"仙靈島"吧!那么怎么做呢?在這篇文章中,我們最終實現的效果是這樣的:

? ? ? ? 現在呢,讓我們把蓮花池里的構件做一下抽象:每一個?石柱可以看做是一個尋路節點,蘆葦墊子可以看做是綁定了尋路組件的一個GameObject。唯一的區別就在于這里的蘆葦墊子是需要我們的角色站在上面才能讓它運動的,而我們在這篇文章里的游戲體是自己運動的。好,現在我們開始來實現這個功能吧。我們先創建如下圖所示的場景:

? ? ? ?我們在水中布置了8個石柱,兩個蘆葦墊子,當游戲開始時,玩家控制角色走上蘆葦墊子時,蘆葦墊子將按照事先設定的路線,將角色送達最后一個石柱位置,此時,玩家可以控制角色到達對岸。當玩家再次踏上蘆葦墊子時,蘆葦墊子會將角色送回起點位置。當蘆葦墊子處于移動狀態中時,角色可以向四個方向旋轉,活動范圍僅限于蘆葦墊子上。好,交待清楚了場景,我們下面來講解原理:

? ? ? ?1、角色控制

? ? ? ? ? ? ?采用在游戲開發之仿仙劍奇俠傳角色控制效果》中實現的角色控制器來控制角色的行為。

? ? ? ?2、尋路的實現

? ? ? ? ? ? ?采用在游戲開發之基于ITween實現尋路功能》中實現的尋路組件作為基礎腳本,本節在此基礎上做擴充和完善,保證角色可以自由的移動

? ? ? ?基于以上兩個原理,我們下面來編寫今天的腳本:

[csharp]?view plaincopyprint?
  • using?UnityEngine;??
  • using?System.Collections;??
  • ??
  • public?class?TransportScript?:?MonoBehaviour?{??
  • ??????
  • ????//尋路組件節點??
  • ????public?Transform[]?mPaths;??
  • ????//蘆葦墊傳送器??
  • ????private?Transform?mTransportor;??
  • ????//被傳送的角色??
  • ????public?Transform?mTransportPlayer;??
  • ??????
  • ????//起點??
  • ????Vector3?StartPoint=new?Vector3(0F,0.5F,-13F);??
  • ????//終點??
  • ????Vector3?EndPoint=new?Vector3(0F,0.5F,10F);??
  • ??????
  • ????//定義移動的方向類型:從起點到終點為0,從終點到起點為1??
  • ????private?int?MoveType=0;??
  • ????//定義移動狀態的標志變量??
  • ????private?bool?isMoving=false;??
  • ??????
  • ????//存儲尋路組件設置的哈希表??
  • ????private?Hashtable?args=new?Hashtable();??
  • ??????
  • ????void?Start?()???
  • ????{??
  • ????????//獲取傳送器??
  • ????????mTransportor=this.transform;??
  • ??
  • ????????//初始化尋路插件??
  • ????????Hashtable?args?=?new?Hashtable();??
  • ????????//設置路徑的點??
  • ????????args.Add("path",mPaths);??
  • ????????//設置類型為線性,線性效果會好一些。??
  • ????????args.Add("easeType",?iTween.EaseType.linear);??
  • ????????//設置尋路的速度??
  • ????????args.Add("speed",2.5f);??
  • ????????//移動的整體時間。如果與speed共存那么優先speed??
  • ????????args.Add("time",10f);??
  • ????????//是否先從原始位置走到路徑中第一個點的位置??
  • ????????args.Add("movetopath",true);??
  • ????????//延遲執行時間??
  • ????????args.Add("delay",?0.1f);??
  • ????????//移動的過程中面朝一個點??
  • ????????args.Add("looktarget",Vector3.up);??
  • ????????//三個循環類型?none?loop?pingPong?(一般?循環?來回)????
  • ????????args.Add("loopType",?"pingPong");??
  • ????????//是否讓模型始終面朝當面目標的方向??
  • ????????//如果你發現你的模型在尋路的時候時鐘都是一個方向那么一定要打開這個??
  • ????????args.Add("orienttopath",true);??
  • ??????
  • ????????iTween.MoveTo(gameObject,args);??
  • ????????iTween.Pause();??
  • ????}??
  • ??????
  • ????void??Update()??
  • ????{??
  • ???????//如果當前處于停止狀態則暫停動畫??
  • ???????if(isMoving==false)??
  • ???????{??
  • ??????????iTween.Pause();??
  • ???????}??
  • ??
  • ???????//從起點到終點的控制??
  • ???????if(MoveType==0?&&?mTransportor.position!=EndPoint?&&?isMoving==true)??
  • ???????{??
  • ??????????//未到達終點則繼續運動??
  • ??????????mTransportPlayer.position=mTransportor.position;??
  • ???????}else?if(MoveType==0?&&?mTransportor.position==EndPoint)??
  • ???????{??
  • ??????????//到達終點則暫停運動??
  • ??????????iTween.Pause();??
  • ??????????isMoving=false;??
  • ??????????MoveType=1;??
  • ???????}??
  • ??????????
  • ???????//從終點到起點的控制??
  • ???????if(MoveType==1?&&?mTransportor.position!=StartPoint?&&?isMoving==true)??
  • ???????{??
  • ??????????//未到達終點則繼續運動??
  • ??????????mTransportPlayer.position=mTransportor.position;??
  • ???????}else?if(MoveType==1?&&?mTransportor.position==StartPoint)??
  • ???????{??
  • ??????????//到達終點則暫停運動??
  • ??????????iTween.Pause();??
  • ??????????isMoving=false;??
  • ??????????MoveType=0;??
  • ???????}??
  • ?????????
  • ????}??
  • ??????
  • ????//當角色走上蘆葦墊的時候開始移動動畫??
  • ????void?OnTriggerEnter(Collider?mCollider)??
  • ????{??
  • ????????if(mCollider.gameObject.name=="Samuzai")??
  • ????????{??
  • ?????????????
  • ???????????if(isMoving==false)??
  • ???????????{??
  • ??????????????isMoving=true;??
  • ??????????????iTween.Resume();??
  • ???????????}??
  • ????????}??
  • ????}??
  • }??

  • ? ? ? ? 在上面的代碼中,我們需要把握以下幾點:

    ? ? ? ? 1、在Start()方法中,我們主要完成的是尋路組件的初始化,這里我們將尋路動畫設置為來回,然后通過Pause()、Resume()方法兩個方法來控制動畫的播放,因為iTween沒有提供在Update()中實現動畫播放的方法,iTween只支持部分方法在Update()方法中使用,具體的大家可以自己去了解iTween的API文檔。

    ? ? ? ? 2、我們主要通過isMoving標志來標記當前的狀態,使用OnTriggerEnter()方法來判斷角色是否走上了蘆葦墊子,當角色走上蘆葦墊子上時,就開始播放尋路動畫。當到達起點/終點時,尋路動畫即停止。當角色再次走上蘆葦墊子時,再次開始尋路動畫。

    ? ? ? ?3、我們再Update()方法中通過改變角色的位置實現了角色和蘆葦墊子的同步移動,當到達起點/終點時,尋路動畫即停止,直到下一次被觸發。

    ? ? ? ?4、觸發與碰撞的區別在于觸發不會產生力的作用,可以通過OnTriggerEnter/OnTriggerStay/OnTriggerExit方法分別監聽觸發開始、觸發中、觸發結束。要使用Trigger需要勾選碰撞器的isTrigger選項。具體的區別我會在后面的文章中為大家做講解。

    ? ? ? 更多精彩請點擊 ?www.gopedu.com

    ? ? ? ?這篇文章中用到的東西就是這么多,主要的難點是尋路動畫的控制,由于官方沒有提供有關的方法,所以我們只能采用Pause()、Resume()方法來控制角色的動畫。最后我們來一起看看實現的效果吧,是不是有仙靈到的感覺呢?呵呵

    ??? ??

    總結

    以上是生活随笔為你收集整理的Unity3D游戏开发之仿仙剑奇侠传仙灵岛机关的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。