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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Unity2D:简单人物纸娃娃换装实现(一) 服装的变换

發(fā)布時間:2023/12/20 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity2D:简单人物纸娃娃换装实现(一) 服装的变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

效果預覽

基本效果

?

鄙人不才,實現(xiàn)的方法較為粗暴,如果有更好的方案還望大神指教一二。

?

準備工作

巧婦難為無米之炊,制作換裝系統(tǒng)首先得有“裝備”才可以。如果大家會美術(shù)可以自己畫,注意所有的素材的遮擋順序和運動細節(jié)需要一致,當然如果用程序控制遮罩來實現(xiàn)更為優(yōu)秀的遮擋管理我覺得也是可行的。

給大家看看我用的素材集合(自制)截圖:

有了這些替換用的素材就可以開始實現(xiàn)換裝了。

?

Plyer的建立

我將人物拆成了各個不同的身體部件,它們每一個都是一個SpriteRander,手部因為比較復雜所以拆的尤其的多。(這里的DrawCall可能會很高,用Shader來合并素材應該能節(jié)省性能,可惜我不會(*^_^*))

建立好的人物

建立好Player之后,請手動確保渲染順序(OrderInLayer)的正確性。

接下來要給人物建立好不同的動畫,譬如走路跳躍攻擊。這一步關(guān)于Unity本身動畫狀態(tài)機的使用相信大家都會的。

?

素材庫的建立

使用類似的腳本來存儲圖片:

using System.Collections; using System.Collections.Generic; using UnityEngine;//用以存儲身體圖片的類 public class Doll_body : MonoBehaviour {//圖片的存儲結(jié)構(gòu)體//使用此注解使其能顯示在Unity的編輯面板上[System.Serializable]public struct DollBody{public Sprite bodyNormal;public Sprite bodyFront;public Sprite leftHandNormal;public Sprite leftHandBack;public Sprite leftHandFront;public Sprite leftHand_SwordAttackStab_prepare;public Sprite leftHand_SwordAttackStab_attack;public Sprite leftHand_SwordAttackCleave_up;public Sprite leftHand_SwordAttackCleave_mid;public Sprite leftHand_bowAttack_01;public Sprite leftHand_bowAttack_02;public Sprite leftHand_bowAttack_03;public Sprite rightHandFront;public Sprite rightHandNormal;public Sprite rightHand_holdBow;}//不同的裝備public DollBody piBody;public DollBody xunlinBody;public DollBody zibiBody; }

創(chuàng)建一個空物體名為“換裝管理器?”,給它加上上述組件,在拖動圖片賦值,切換場景時注意不要銷毀此物體。(因為是像素風游戲,所以圖集比較小,大游戲的話也許得用更高效的素材庫了,具體怎么實現(xiàn)沒有思路)

使用腳本時的界面

?

創(chuàng)建下面這個腳本,同樣作為“換裝管理器?”的組件,用來給各個圖片組起個名字,方便調(diào)用。

using System.Collections; using System.Collections.Generic; using UnityEngine;public class DollDictionary : MonoBehaviour {public static Dictionary<string,Doll_foot.DollFoot> footDictionary = new Dictionary<string, Doll_foot.DollFoot>();public static Dictionary<string,Doll_body.DollBody> bodyDictionary = new Dictionary<string, Doll_body.DollBody> ();public static Dictionary<string,Doll_hair.DollHair> hairDictionary = new Dictionary<string, Doll_hair.DollHair>();public static Dictionary<string,Doll_helmet.DollHelmet> helmetDictionary =new Dictionary<string, Doll_helmet.DollHelmet>();public static Dictionary<string,Doll_Skin.DollSkin> skinDictionary = new Dictionary<string, Doll_Skin.DollSkin>();void Awake () {Doll_foot tempDollFoot = this.GetComponent<Doll_foot> ();footDictionary.Add ("皮質(zhì)腿甲", tempDollFoot.piFoot);footDictionary.Add ("巡林腿甲", tempDollFoot.xunlinFoot);footDictionary.Add("緊身褲", tempDollFoot.jinshengFoot);Doll_body tempDollBody = this.GetComponent<Doll_body> () ;bodyDictionary.Add ("皮質(zhì)胸甲", tempDollBody.piBody);bodyDictionary.Add ("巡林胸甲", tempDollBody.xunlinBody);bodyDictionary.Add("自閉胸甲", tempDollBody.zibiBody);Doll_hair tempDollHair = this.GetComponent<Doll_hair> ();hairDictionary.Add ("普通", tempDollHair.putongHair);hairDictionary.Add ("半遮", tempDollHair.banzheHair);hairDictionary.Add ("丸子", tempDollHair.wanziHair);hairDictionary.Add ("莫辛甘", tempDollHair.moxingganHair);hairDictionary.Add("飛機頭", tempDollHair.feijiHair);Doll_helmet tempDollHelmet = this.GetComponent<Doll_helmet> ();helmetDictionary.Add ("兜帽", tempDollHelmet.doumaoHelmet);helmetDictionary.Add ("巫師帽", tempDollHelmet.fashiHelmet);helmetDictionary.Add ("鐵頭盔", tempDollHelmet.metalHelmet);helmetDictionary.Add ("皮帽", tempDollHelmet.piHelmett);Doll_Skin tempDollSkin = this.GetComponent<Doll_Skin> ();skinDictionary.Add ("皮膚A", tempDollSkin.SkinTyprA);skinDictionary.Add ("皮膚B", tempDollSkin.SkinTyprB);skinDictionary.Add ("皮膚C", tempDollSkin.SkinTyprC);} }

?

添加動畫事件

給Player附上下面這個腳本,用以在特定的時候改變?nèi)宋锏膱D片。

其中SetBody(PlayerAttribute),用以改變?nèi)宋锏膱D集,PlayerAttribute是我自己定義的人物狀態(tài)類,當里面的字段改變時會自動出發(fā)一個事件來調(diào)用SetBody更改圖集。

setBodyXXX(),用以在動畫中觸發(fā)改變圖片,眾所周知,動畫就是一系列變化的圖片,這樣便實現(xiàn)了動態(tài)。

using System.Collections; using System.Collections.Generic; using UnityEngine;public class SwarpSprites : MonoBehaviour {[SerializeField]SpriteRenderer helmetRender,hairRender,skinHeadRender,bodyRender,footRender;Sprite walkMid,walkFront,walkBack,footStand,footFall;Sprite bodyNormal,bodyFront;Sprite skinHeadNormal,skinHeadUp,skinHeadDown;Sprite helmetNormal,helmetUp,helmetDown;Sprite hairNormal,hairUp,hairDown;public SwarpHandSprites swarpHandSprites;void Start () {setAll ();}public void setAll(){PlayerAttribute playerAttribute = this.GetComponent<PlayerAttribute> ();setFoot (playerAttribute);setBody (playerAttribute);setSkin (playerAttribute);setHelmet (playerAttribute);setHair (playerAttribute);}public void setBody(PlayerAttribute playerAttribute){Doll_body.DollBody bodySet = DollDictionary.bodyDictionary [playerAttribute.bodyType];bodyNormal = bodySet.bodyNormal;bodyFront = bodySet.bodyFront;swarpHandSprites.bodyLeftHandNormal = bodySet.leftHandNormal;swarpHandSprites.bodyLeftHandFront = bodySet.leftHandFront;swarpHandSprites.bodyLeftHandBack = bodySet.leftHandBack;swarpHandSprites.bodyLeftHand_SwordAttackStab_prepare = bodySet.leftHand_SwordAttackStab_prepare;swarpHandSprites.bodyLeftHand_SwordAttack_attack = bodySet.leftHand_SwordAttackStab_attack;swarpHandSprites.bodyLeftHand_SwardAttackCleave_mid = bodySet.leftHand_SwordAttackCleave_mid;swarpHandSprites.bodyLeftHand_SwardAttackCleave_Up = bodySet.leftHand_SwordAttackCleave_up;swarpHandSprites.bodyLeftHand_bowAttack01 = bodySet.leftHand_bowAttack_01;swarpHandSprites.bodyLeftHand_bowAttack02 = bodySet.leftHand_bowAttack_02;swarpHandSprites.bodyLeftHand_bowAttack03 = bodySet.leftHand_bowAttack_03;swarpHandSprites.bodyRightHandNormal = bodySet.rightHandNormal;swarpHandSprites.bodyRightHandFront = bodySet.rightHandFront;swarpHandSprites.bodyRightHand_holdBow = bodySet.rightHand_holdBow;}//設置足部動畫void setWalkMid(){ footRender.sprite = walkMid; }void setWalkFront(){ footRender.sprite = walkFront; }void setWalkBack(){ footRender.sprite = walkBack; }void setFootStand(){ footRender.sprite = footStand; }void setFootFallDown(){ footRender.sprite = footFall; }//設置身體動畫public void setBodyNormal(){ bodyRender.sprite = bodyNormal; }void setBodyFront(){ bodyRender.sprite = bodyFront; }//還有很多......}

?

在合適的關(guān)鍵幀調(diào)用切換圖片的函數(shù)

?

以上,就實現(xiàn)了一個簡單的紙娃娃,最耗時的,其實是繪畫各種替換素材的過程。

總結(jié)

以上是生活随笔為你收集整理的Unity2D:简单人物纸娃娃换装实现(一) 服装的变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。