【Unity】RPG制作 その25-武器、防具アイテム実装その2 装備画面実装
今回は武器と防具の装備画面の作成をやっていきます。
装備画面はこんな感じです。
左のグレーの部分がボタンになっており、押すとその部位に装備できる武器・防具がスクロールビューに表示されるように作ります。
まずはじめに、GeneralEnum.csに装備部位の列挙型定数を宣言します。
クリックで展開
public enum EQUIP_SLOT //装備部位の列挙型定数 New { RIGHTHAND, LEFTHAND, HEAD, BODY, WEIST, LEG, ACCESSORIES1, ACCESSORIES2, }
PlayerManagerに現在プレイヤーが装備している武器と防具を保持するDictionaryの宣言と、プレイヤーの装備状態の初期化関数を作成します。
クリックで展開
//-----------現在つけている装備品のDictionary-------------- public Dictionary<GeneralEnum.EQUIP_SLOT, WeaponEntity> equipWeapons = new Dictionary<GeneralEnum.EQUIP_SLOT, WeaponEntity>();//New public Dictionary<GeneralEnum.EQUIP_SLOT,ArmorEntity> equipArmors = new Dictionary<GeneralEnum.EQUIP_SLOT,ArmorEntity>();//New //プレイヤーの装備の状態を初期化する public void InitEquipWeaponsAndArmor() { equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new WeaponEntity(); equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new WeaponEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.HEAD] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.BODY] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.WEIST] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.LEG] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.ACCESSORIES1] = new ArmorEntity(); equipArmors[GeneralEnum.EQUIP_SLOT.ACCESSORIES2] = new ArmorEntity(); }
WeaponManagerとArmorManagerに、所持装備のDctionaryの空きにEntityを登録する関数と、Dictionaryの指定したIndexの装備を削除する関数、Entityから元Dataを取得する関数を作成します。
クリックで展開
public bool RegiEntity(WeaponEntity weaponEntity) //New { bool successAdd = false; for (int i = 0; i < possessionWeapon.Length; i++) { if (!possessionWeapon[i].isRegistry) { possessionWeapon[i] = weaponEntity; successAdd = true; return successAdd; } } return successAdd; } public void DeleteWeapon(int index) //New { possessionWeapon[index] = new WeaponEntity(); } /// <summary> /// WeaponEnityから元のWeaponDataを取得する /// </summary> public WeaponData GetWeaponDataFromEntity(WeaponEntity weaponEntity) //New { for(int i = 0; i < instance.possessionWeapon.Length; i++) { if(instance.weaponDatas[i].weaponID == weaponEntity.weaponID) { return instance.weaponDatas[i]; } } return instance.weaponDatas[0]; }
クリックで展開
public bool RegiEntity(ArmorEntity armorEntity) { bool successAdd = false; for (int i = 0; i < possessionArmor.Length; i++) { if (!possessionArmor[i].isRegistry) { possessionArmor[i] = armorEntity; successAdd = true; return successAdd; } } return successAdd; } public void DeleteArmor(int index) { possessionArmor[index] = new ArmorEntity(); } public ArmorData GetArmorDataFromEntity(ArmorEntity armorEntity) { for (int i = 0; i < instance.possessionArmor.Length; i++) { if(instance.armorDatas[i].armorID == armorEntity.armorID) { return instance.armorDatas[i]; } } return instance.armorDatas[0]; }
装備画面内での処理を行うEquipmentUIクラスを新規作成します。一応コードを全部載せますがめちゃくちゃ長いので流し読みすることをおすすめします。(笑)
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class EquipmentUI : MonoBehaviour { public Canvas weaponCanvas; public GameObject listPanel; GameObject scrollView; Transform viewPort; Transform content; public Dictionary<WeaponEntity,int> partWeaponArray; public Button RHandEquipButton; public Button LHandEquipButton; public Button HeadEquipButton; public Button BodyEquipButton; public Button WeistEquipButton; public Button LegEquipButton; public Button Accessories1EquipButton; public Button Accessories2EquipButton; public Button RemoveEquipButton; public Text RHandEquipText; public Text LHandEquipText; public Text HeadEquipText; public Text BodyEquipText; public Text WeistEquipText; public Text LegEquipText; public Text Accessories1EquipText; public Text Accessories2EquipText; // 関数リスト(2021/11/09作成) // void Start() // public void ShowEquipUI() // public void HideEquipUI() // public void SetEquipButtonListener()・・・それぞれのEquipButtonを押した時のイベントを登録する // public void ProhibitEquipButton()・・・それぞれのEquipButtonの押下を禁止する // public void PermissionEquipButton()・・・それぞれのEquipButtonの押下を許可する // public void PushRemoveEquipButton(PlayerManager playerManager, GeneralEnum.EQUIP_SLOT equipSlot)・・・外すボタンを押した時の処理実行 // public bool SetWeaponEntity(GeneralEnum.EQUIP_SLOT equip_slot)・・・listPanelのScrollViewに所持武器のContentをセット // public bool SetArmorEntity(GeneralEnum.EQUIP_SLOT equip_slot)・・・listPanelのScrollViewに所持防具のContentをセット // public void ShowListPanel() // public void HideListPanel() // public void DestroyAllItem()・・・ScrollViewのContentをすべて消去する // public void ChangeWeapon(GeneralEnum.EQUIP_SLOT equip_slot,WeaponEntity weaponEntity, PlayerManager playerManager, int index) ・・・装備武器を変更する処理 // public void ChangeArmor(GeneralEnum.EQUIP_SLOT equip_slot, ArmorEntity armorEntity, PlayerManager playerManager, int index)・・・装備防具を変更する処理 // public void UpdateWeaponText(PlayerManager playerManager,WeaponEntity weaponEntity, GeneralEnum.EQUIP_SLOT equip_slot)・・・装備武器のテキストを更新する // public void UpdateAllWeaponText(PlayerManager playerManager)・・・装備武器のテキストをすべて更新する // public void UpdateArmorText(PlayerManager playerManager, ArmorEntity armorEntity, GeneralEnum.EQUIP_SLOT equip_slot)・・・装備防具のテキストを変更する // public void UpdateAllArmorText(PlayerManager playerManager)・・・装備防具のテキストをすべて更新する void Start() { scrollView = GameObject.Find("EquipmentUI_Scroll View");//(注)同じ名前を作らない viewPort = scrollView.transform.Find("Viewport"); content = viewPort.transform.Find("Content"); SetEquipButtonListener(); this.gameObject.SetActive(false); listPanel.gameObject.SetActive(false); } public void ShowEquipUI() { SoundManager.instance.PlaySE(22); this.gameObject.SetActive(true); } public void HideEquipUI() { SoundManager.instance.PlaySE(7); this.gameObject.SetActive(false); } public void SetEquipButtonListener() { RHandEquipButton.onClick.AddListener(() => {SetWeaponEntity(GeneralEnum.EQUIP_SLOT.RIGHTHAND);}); RHandEquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.RIGHTHAND); }); LHandEquipButton.onClick.AddListener(() => { SetWeaponEntity(GeneralEnum.EQUIP_SLOT.LEFTHAND); }); LHandEquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.LEFTHAND); }); HeadEquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.HEAD); }); BodyEquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.BODY); }); WeistEquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.WEIST); }); LegEquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.LEG); }); Accessories1EquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.ACCESSORIES1); }); Accessories2EquipButton.onClick.AddListener(() => { SetArmorEntity(GeneralEnum.EQUIP_SLOT.ACCESSORIES2); }); } public void ProhibitEquipButton() { RHandEquipButton.interactable = false; LHandEquipButton.interactable = false; HeadEquipButton.interactable = false; BodyEquipButton.interactable = false; WeistEquipButton.interactable = false; LegEquipButton.interactable = false; Accessories1EquipButton.interactable = false; Accessories2EquipButton.interactable = false; } public void PermissionEquipButton() { RHandEquipButton.interactable = true; LHandEquipButton.interactable = true; HeadEquipButton.interactable = true; BodyEquipButton.interactable = true; WeistEquipButton.interactable = true; LegEquipButton.interactable = true; Accessories1EquipButton.interactable = true; Accessories2EquipButton.interactable = true; } public void PushRemoveEquipButton(PlayerManager playerManager, GeneralEnum.EQUIP_SLOT equipSlot) { //武器と防具両方のEntityの変数を用意する WeaponEntity tempWeapon; ArmorEntity tempArmor; if (equipSlot == GeneralEnum.EQUIP_SLOT.RIGHTHAND || equipSlot == GeneralEnum.EQUIP_SLOT.LEFTHAND)//右手か左手の場合 { //装備している武器もしくは防具を一時変数に入れる if (playerManager.equipWeapons[equipSlot].nowEquip) { tempWeapon = playerManager.equipWeapons[equipSlot]; tempArmor = new ArmorEntity(); } else if (playerManager.equipArmors[equipSlot].nowEquip) { tempWeapon = new WeaponEntity(); tempArmor = playerManager.equipArmors[equipSlot]; } else { tempWeapon = new WeaponEntity(); tempArmor = new ArmorEntity(); } //装備していた武器・防具の装備中フラグをfalseにする tempWeapon.nowEquip = false; tempArmor.nowEquip = false; //装備部位の装備を削除する playerManager.equipWeapons[equipSlot] = new WeaponEntity(); playerManager.equipArmors[equipSlot] = new ArmorEntity(); //リストに装備していた武器もしくは防具を代入する。 if(tempWeapon.isRegistry) WeaponManager.instance.RegiEntity(tempWeapon); if(tempArmor.isRegistry) ArmorManager.instance.RegiEntity(tempArmor); } else//右手左手以外の場合 { //装備していた防具を一時変数に入れる tempArmor = playerManager.equipArmors[equipSlot]; //装備していた防具の装備中フラグをfalseにする tempArmor.nowEquip = false; //装備部位の装備を削除する playerManager.equipArmors[equipSlot] = new ArmorEntity(); //リストに装備していた防具を代入する。 if (tempArmor.isRegistry) ArmorManager.instance.RegiEntity(tempArmor); } SoundManager.instance.PlaySE(35); } /// <summary> /// ListPanelに所持している武器を表示させる関数。表示する武器が一つでもある場合はtrue,一つもない場合はfalseを返す。 /// </summary> /// <param name="equip_slot"></param> /// <returns></returns> public bool SetWeaponEntity(GeneralEnum.EQUIP_SLOT equip_slot) { bool existWeapon = false; for(int i = 0; i < 500; i++) { bool b1 = WeaponManager.instance.possessionWeapon[i].isRegistry; if (b1) { bool b2 = false; WeaponManager.WeaponItem weaponID = WeaponManager.instance.possessionWeapon[i].weaponID;//登録してあるWeaponEntityの元WeaponDataを取得 for (int j = 0; j < WeaponManager.instance.weaponDatas.Length; j++) { b2 = (WeaponManager.instance.weaponDatas[j].weaponID == weaponID); if (b2)//WeaponEntityの元WeaponDataがWeaponManagerに登録されていたら { GameObject Contents = new GameObject("Contents" + (i + 1).ToString()); existWeapon = true;//武器存在フラグをtrueにする。 Contents.transform.parent = content.transform; var Rect = Contents.AddComponent<RectTransform>(); Rect.transform.localPosition = new Vector3(0, 0, 0); Rect.transform.localScale = new Vector3(1, 1, 1); Rect.sizeDelta = new Vector2(0, 80); Contents.AddComponent<CanvasRenderer>(); Contents.AddComponent<Image>(); Contents.AddComponent<LayoutElement>().preferredHeight = 80; var buttonState = Contents.AddComponent<Button>(); var colors = buttonState.colors; colors.normalColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); colors.highlightedColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); colors.pressedColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); colors.disabledColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); buttonState.colors = colors; GameObject text = new GameObject("WeaponEntity" + (i + 1).ToString()); text.transform.parent = Contents.transform; var rect = text.AddComponent<RectTransform>(); rect.transform.localPosition = new Vector3(1, 1, 1); rect.sizeDelta = new Vector2(900, 90); text.AddComponent<CanvasRenderer>(); var textChild = text.AddComponent<Text>(); //テキスト生成 //-----------武器名+強化値--------- string viewtext = ""; if(WeaponManager.instance.possessionWeapon[i].enhancementValue > 0) { viewtext = WeaponManager.instance.weaponDatas[j].weaponName + "+" + WeaponManager.instance.possessionWeapon[i].enhancementValue; } else if (WeaponManager.instance.possessionWeapon[i].enhancementValue < 0) { viewtext = WeaponManager.instance.weaponDatas[j].weaponName + WeaponManager.instance.possessionWeapon[i].enhancementValue; } else { viewtext = WeaponManager.instance.weaponDatas[j].weaponName; } textChild.text = viewtext; textChild.color = new Color(40f/255f,40f/255f,40f/255f,255f/255f); textChild.fontSize = 25; textChild.alignment = TextAnchor.MiddleLeft; textChild.horizontalOverflow = HorizontalWrapMode.Overflow; textChild.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font; //テキストここまで //ボタンを押した時に対応する装備に変更する //ラムダ式を使用してOnclickに処理を登録する場合、引数をそのまま入れてしまうと参照がうまくいかないらしいので、一時変数を用意してそちらに一旦引数に使うデータを入れて登録する。 GeneralEnum.EQUIP_SLOT temp_Equip_slot = equip_slot; WeaponEntity temp_WeaponEntity = WeaponManager.instance.possessionWeapon[i]; PlayerManager temp_PlayerManager = PlayerManager.instance; int tempIndex = i; buttonState.onClick.AddListener(() => { ChangeWeapon(temp_Equip_slot, temp_WeaponEntity, temp_PlayerManager, tempIndex); }); buttonState.onClick.AddListener(DestroyAllItem); buttonState.onClick.AddListener(HideListPanel); buttonState.onClick.AddListener(PermissionEquipButton); RemoveEquipButton.onClick.RemoveAllListeners(); RemoveEquipButton.onClick.AddListener(() => { PushRemoveEquipButton(temp_PlayerManager, temp_Equip_slot); }); RemoveEquipButton.onClick.AddListener(DestroyAllItem); RemoveEquipButton.onClick.AddListener(HideListPanel); RemoveEquipButton.onClick.AddListener(PermissionEquipButton); RemoveEquipButton.onClick.AddListener(() => { DeleatEquipText(temp_PlayerManager, temp_Equip_slot); }); //ContentsにGridLayoutGroupをAddする var cGridLayout = Contents.AddComponent<GridLayoutGroup>() ; cGridLayout.constraint = GridLayoutGroup.Constraint.FixedColumnCount; cGridLayout.constraintCount = 2; //左側に武器のアイコンを表示する GameObject weaponIcon = new GameObject("WeaponIcon" + (i + 1).ToString()); weaponIcon.transform.parent = buttonState.transform; weaponIcon.transform.SetAsFirstSibling(); var iconRect = weaponIcon.AddComponent<RectTransform>(); iconRect.transform.localPosition = new Vector3(0, 0, 0); iconRect.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); weaponIcon.AddComponent<CanvasRenderer>(); var iconImage = weaponIcon.AddComponent<Image>(); iconImage.sprite = WeaponManager.instance.weaponDatas[j].weaponSprite; } } } } if (existWeapon) { ShowListPanel(); ProhibitEquipButton(); } else { SoundManager.instance.PlaySE(11); } return existWeapon; } public bool SetArmorEntity(GeneralEnum.EQUIP_SLOT equip_slot) { bool existArmor = false; for (int i = 0; i < 500; i++) { bool b1 = ArmorManager.instance.possessionArmor[i].isRegistry; if (b1) { bool b2 = false; ArmorManager.ArmorItem armorID = ArmorManager.instance.possessionArmor[i].armorID; for (int j = 0; j < ArmorManager.instance.armorDatas.Length; j++) { b2 = (ArmorManager.instance.armorDatas[j].armorID == armorID); if (b2)//ArmorEntityの元ArmorDataがArmorManagerに登録されていたら { bool b3 = false; //b3に入れる条件式をアクセサリー部位か右手・左手かそうでないかで分ける if (equip_slot == GeneralEnum.EQUIP_SLOT.ACCESSORIES1 || equip_slot == GeneralEnum.EQUIP_SLOT.ACCESSORIES2) { b3 = (ArmorManager.instance.armorDatas[j].equipPart == GeneralEnum.EQUIP_SLOT.ACCESSORIES); }else if (equip_slot == GeneralEnum.EQUIP_SLOT.RIGHTHAND || equip_slot == GeneralEnum.EQUIP_SLOT.LEFTHAND) { b3 = (ArmorManager.instance.armorDatas[j].equipPart == GeneralEnum.EQUIP_SLOT.ONEHAND); } else { b3 = (ArmorManager.instance.armorDatas[j].equipPart == equip_slot); } if (b3) { GameObject Contents = new GameObject("Contents" + (i + 1).ToString()); existArmor = true;//防具存在フラグをtrueにする。 Contents.transform.parent = content.transform; var Rect = Contents.AddComponent<RectTransform>(); Rect.transform.localPosition = new Vector3(0, 0, 0); Rect.transform.localScale = new Vector3(1, 1, 1); Rect.sizeDelta = new Vector2(0, 80); Contents.AddComponent<CanvasRenderer>(); Contents.AddComponent<Image>(); Contents.AddComponent<LayoutElement>().preferredHeight = 80; var buttonState = Contents.AddComponent<Button>(); var colors = buttonState.colors; colors.normalColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); colors.highlightedColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); colors.pressedColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); colors.disabledColor = new Color(0 / 255F, 0 / 255F, 0 / 255F, 50 / 255F); buttonState.colors = colors; GameObject text = new GameObject("ArmorEntity" + (i + 1).ToString()); text.transform.parent = Contents.transform; var rect = text.AddComponent<RectTransform>(); rect.transform.localPosition = new Vector3(1, 1, 1); rect.sizeDelta = new Vector2(900, 90); text.AddComponent<CanvasRenderer>(); var textChild = text.AddComponent<Text>(); //テキスト生成 //-----------防具名+強化値--------- string viewtext = ""; if(ArmorManager.instance.possessionArmor[i].enhancementValue > 0) { viewtext = ArmorManager.instance.armorDatas[j].armorName + "+" + ArmorManager.instance.possessionArmor[i].enhancementValue; }else if(ArmorManager.instance.possessionArmor[i].enhancementValue < 0) { viewtext = ArmorManager.instance.armorDatas[j].armorName + ArmorManager.instance.possessionArmor[i].enhancementValue; } else { viewtext = ArmorManager.instance.armorDatas[j].armorName; } textChild.text = viewtext; textChild.color = new Color(40f / 255f, 40f / 255f, 40f / 255f, 255f / 255f); textChild.fontSize = 25; textChild.alignment = TextAnchor.MiddleLeft; textChild.horizontalOverflow = HorizontalWrapMode.Overflow; textChild.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font; //テキストここまで //ボタンを押した時に対応する装備に変更する //ラムダ式を使用してOnclickに処理を登録する場合、引数をそのまま入れてしまうと参照がうまくいかないらしいので、一時変数を用意してそちらに一旦引数に使うデータを入れて登録する。 GeneralEnum.EQUIP_SLOT temp_Equip_slot = equip_slot; ArmorEntity temp_ArmorEntity = ArmorManager.instance.possessionArmor[i]; PlayerManager temp_PlayerManager = PlayerManager.instance; int tempIndex = i; buttonState.onClick.AddListener(() => { ChangeArmor(temp_Equip_slot, temp_ArmorEntity, temp_PlayerManager, tempIndex); }); buttonState.onClick.AddListener(DestroyAllItem); buttonState.onClick.AddListener(HideListPanel); buttonState.onClick.AddListener(PermissionEquipButton); RemoveEquipButton.onClick.RemoveAllListeners(); RemoveEquipButton.onClick.AddListener(() => { PushRemoveEquipButton(temp_PlayerManager, temp_Equip_slot); }); RemoveEquipButton.onClick.AddListener(DestroyAllItem) ; RemoveEquipButton.onClick.AddListener(HideListPanel) ; RemoveEquipButton.onClick.AddListener(PermissionEquipButton); RemoveEquipButton.onClick.AddListener(() => { DeleatEquipText(temp_PlayerManager, temp_Equip_slot); }); //ContentsにGridLayoutGroupをAddする var cGridLayout = Contents.AddComponent<GridLayoutGroup>(); cGridLayout.constraint = GridLayoutGroup.Constraint.FixedColumnCount; cGridLayout.constraintCount = 2; //左側に防具のアイコンを表示する GameObject armorIcon = new GameObject("ArmorIcon" + (i + 1).ToString()); armorIcon.transform.parent = buttonState.transform; armorIcon.transform.SetAsFirstSibling(); var iconRect = armorIcon.AddComponent<RectTransform>(); iconRect.transform.localPosition = new Vector3(0, 0, 0); iconRect.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); armorIcon.AddComponent<CanvasRenderer>(); var iconImage = armorIcon.AddComponent<Image>(); iconImage.sprite = ArmorManager.instance.armorDatas[j].armorSprite; } } } } } if (existArmor) { ShowListPanel(); ProhibitEquipButton(); } else { SoundManager.instance.PlaySE(11); } return existArmor; } public void ShowListPanel() { listPanel.gameObject.SetActive(true); SoundManager.instance.PlaySE(33); } public void HideListPanel() { listPanel.gameObject.SetActive(false); } public void DestroyAllItem() { if (content.gameObject.transform.childCount != 0) { foreach (Transform child in content.gameObject.transform) { //全要素削除 Destroy(child.gameObject); } } } public void ChangeWeapon(GeneralEnum.EQUIP_SLOT equip_slot,WeaponEntity weaponEntity, PlayerManager playerManager, int index) { WeaponData weaponData = WeaponManager.instance.GetWeaponDataFromEntity(weaponEntity); WeaponData nowEquipRWeaponData = WeaponManager.instance.GetWeaponDataFromEntity(playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND]); WeaponData nowEquipLWeaponData = WeaponManager.instance.GetWeaponDataFromEntity(playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND]); //武器と防具の一時変数を用意する ArmorEntity tempRHandAEntity; ArmorEntity tempLHandAEntity; WeaponEntity tempREntity; WeaponEntity tempLEntity; //右手からチェック if (playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND].nowEquip)//防具装備中なら { tempRHandAEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND]; tempREntity = new WeaponEntity(); } else if (playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND].nowEquip)//武器装備中なら { tempRHandAEntity = new ArmorEntity(); tempREntity = playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND]; } else { tempRHandAEntity = new ArmorEntity(); tempREntity = new WeaponEntity(); } //左手からチェック if (playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND].nowEquip)//防具装備中なら { tempLHandAEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND]; tempLEntity = new WeaponEntity(); } else if (playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND].nowEquip)//武器装備中なら { tempLHandAEntity = new ArmorEntity(); tempLEntity = playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND]; } else { tempLHandAEntity = new ArmorEntity(); tempLEntity = new WeaponEntity(); } if (weaponData.equipPart == GeneralEnum.EQUIP_SLOT.ONEHAND)//新しく装備する武器が片手用なら { if(tempREntity.equipPart == GeneralEnum.EQUIP_SLOT.BOTHHANDS || tempLEntity.equipPart == GeneralEnum.EQUIP_SLOT.BOTHHANDS) {//両手武器を装備中なら tempREntity.nowEquip = false; tempLEntity.nowEquip = false; weaponEntity.nowEquip = true; //右手左手のEntityを初期化 playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new WeaponEntity(); playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new WeaponEntity(); playerManager.equipWeapons[equip_slot] = weaponEntity;//選択した武器を装備部位に代入する WeaponManager.instance.possessionWeapon[index] = new WeaponEntity(); if (tempREntity.isRegistry) WeaponManager.instance.RegiEntity(tempREntity); if (tempLEntity.isRegistry) WeaponManager.instance.RegiEntity(tempLEntity); //装備部位のテキストを反映する UpdateAllWeaponText(playerManager); } else//両手武器を装備していない場合 { if(equip_slot == GeneralEnum.EQUIP_SLOT.RIGHTHAND)//右手の場合 { //装備していた武器・防具の装備中フラグをfalseにする tempREntity.nowEquip = false; tempRHandAEntity.nowEquip = false; weaponEntity.nowEquip = true;//今から装備する武器の装備中フラグをtrueにする //右手の武器・防具を削除する playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new WeaponEntity(); playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new ArmorEntity(); playerManager.equipWeapons[equip_slot] = weaponEntity;//選択した武器を装備部位に代入する。 WeaponManager.instance.possessionWeapon[index] = new WeaponEntity(); if (tempREntity.isRegistry) WeaponManager.instance.RegiEntity(tempREntity); if (tempRHandAEntity.isRegistry) ArmorManager.instance.RegiEntity(tempRHandAEntity); }else if (equip_slot == GeneralEnum.EQUIP_SLOT.LEFTHAND)//左手の場合 { //装備していた武器・防具の装備中フラグをfalseにする tempLEntity.nowEquip = false; tempLHandAEntity.nowEquip = false; weaponEntity.nowEquip = true;//今から装備する武器の装備中フラグをtrueにする //左手の武器・防具を削除する playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new WeaponEntity(); playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new ArmorEntity(); playerManager.equipWeapons[equip_slot] = weaponEntity;//選択した武器を装備部位に代入する。 WeaponManager.instance.possessionWeapon[index] = new WeaponEntity(); if (tempLEntity.isRegistry) WeaponManager.instance.RegiEntity(tempLEntity); if (tempLHandAEntity.isRegistry) ArmorManager.instance.RegiEntity(tempLHandAEntity); } UpdateWeaponText(playerManager,weaponEntity,equip_slot); } }else if (weaponData.equipPart == GeneralEnum.EQUIP_SLOT.BOTHHANDS) {//新しく装備する武器が両手用なら //装備中フラグをfalseに tempREntity.nowEquip = false; tempLEntity.nowEquip = false; tempRHandAEntity.nowEquip = false; tempLHandAEntity.nowEquip = false; weaponEntity.nowEquip = true;//今から装備する武器のフラグをtrueに //右手左手のEntityを削除する playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new WeaponEntity(); playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new WeaponEntity(); playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new ArmorEntity(); playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new ArmorEntity(); //選択した武器を装備部位に代入する。 playerManager.equipWeapons[equip_slot] = weaponEntity; //選択した武器をリストから削除する WeaponManager.instance.possessionWeapon[index] = new WeaponEntity(); //リストに装備していた武器もしくは防具を代入する。 if (tempREntity.isRegistry) WeaponManager.instance.RegiEntity(tempREntity); if (tempLEntity.isRegistry) WeaponManager.instance.RegiEntity(tempLEntity); if (tempRHandAEntity.isRegistry) ArmorManager.instance.RegiEntity(tempRHandAEntity); if (tempLHandAEntity.isRegistry) ArmorManager.instance.RegiEntity(tempLHandAEntity); //装備部位のテキストを反映する UpdateAllWeaponText(playerManager); } SoundManager.instance.PlaySE(34); } public void ChangeArmor(GeneralEnum.EQUIP_SLOT equip_slot, ArmorEntity armorEntity, PlayerManager playerManager, int index) { //装備部位が右手か左手の場合 if(equip_slot==GeneralEnum.EQUIP_SLOT.RIGHTHAND || equip_slot == GeneralEnum.EQUIP_SLOT.LEFTHAND) { //右手・左手の装備をそれぞれチェックする ArmorEntity tempRHandAEntity; ArmorEntity tempLHandAEntity; WeaponEntity tempRHandWEntity; WeaponEntity tempLHandWEntity; //右手からチェック if (playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND].nowEquip)//防具装備中なら { tempRHandAEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND]; tempRHandWEntity = new WeaponEntity(); }else if (playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND].nowEquip)//武器装備中なら { tempRHandAEntity = new ArmorEntity(); tempRHandWEntity = playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND]; } else { tempRHandAEntity = new ArmorEntity(); tempRHandWEntity = new WeaponEntity(); } //左手からチェック if (playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND].nowEquip)//防具装備中なら { tempLHandAEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND]; tempLHandWEntity = new WeaponEntity(); } else if (playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND].nowEquip)//武器装備中なら { tempLHandAEntity = new ArmorEntity(); tempLHandWEntity = playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND]; } else { tempLHandAEntity = new ArmorEntity(); tempLHandWEntity = new WeaponEntity(); } //両手武器を装備していたら if(tempRHandWEntity.equipPart == GeneralEnum.EQUIP_SLOT.BOTHHANDS || tempLHandWEntity.equipPart == GeneralEnum.EQUIP_SLOT.BOTHHANDS) { tempRHandWEntity.nowEquip = false; tempLHandWEntity.nowEquip = false; armorEntity.nowEquip = true; //右手左手の装備を削除する playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new WeaponEntity(); playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new WeaponEntity(); playerManager.equipArmors[equip_slot] = armorEntity;//選択した防具を装備部位に代入する。 UpdateArmorText(playerManager, playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND], GeneralEnum.EQUIP_SLOT.RIGHTHAND); UpdateArmorText(playerManager, playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND], GeneralEnum.EQUIP_SLOT.LEFTHAND); //選択した防具をリストから削除する ArmorManager.instance.possessionArmor[index] = new ArmorEntity(); //リストに装備していた武器を代入する。(両手武器の場合は武器だけ処理すればいい.isRegistryがfalseなら装備されてない部位) if (tempRHandWEntity.isRegistry) WeaponManager.instance.RegiEntity(tempRHandWEntity); if (tempLHandWEntity.isRegistry) WeaponManager.instance.RegiEntity(tempLHandWEntity); } else//両手武器を装備していない場合 { if(equip_slot == GeneralEnum.EQUIP_SLOT.RIGHTHAND)//右手の場合 { //装備していた武器・防具の装備中フラグをfalseにする tempRHandWEntity.nowEquip = false; tempRHandAEntity.nowEquip = false; armorEntity.nowEquip = true;//今から装備する防具の装備中フラグをtrueにする //右手の武器・防具を削除する playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new WeaponEntity(); playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.RIGHTHAND] = new ArmorEntity(); playerManager.equipArmors[equip_slot] = armorEntity;//選択した防具を装備部位に代入する。 UpdateArmorText(playerManager, armorEntity, equip_slot); //選択した防具をリストから削除する ArmorManager.instance.possessionArmor[index] = new ArmorEntity(); //リストに装備していた武器もしくは防具を代入する。 if (tempRHandWEntity.isRegistry) WeaponManager.instance.RegiEntity(tempRHandWEntity); if (tempRHandAEntity.isRegistry) ArmorManager.instance.RegiEntity(tempRHandAEntity); } else if(equip_slot == GeneralEnum.EQUIP_SLOT.LEFTHAND)//左手の場合 { //装備していた武器・防具の装備中フラグをfalseにする tempLHandWEntity.nowEquip = false; tempLHandAEntity.nowEquip = false; armorEntity.nowEquip = true;//今から装備する防具の装備中フラグをtrueにする //右手の武器・防具を削除する playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new WeaponEntity(); playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEFTHAND] = new ArmorEntity(); playerManager.equipArmors[equip_slot] = armorEntity;//選択した防具を装備部位に代入する。 UpdateArmorText(playerManager, armorEntity, equip_slot); //選択した防具をリストから削除する ArmorManager.instance.possessionArmor[index] = new ArmorEntity(); //リストに装備していた武器もしくは防具を代入する。 if (tempLHandWEntity.isRegistry) WeaponManager.instance.RegiEntity(tempLHandWEntity); if (tempLHandAEntity.isRegistry) ArmorManager.instance.RegiEntity(tempLHandAEntity); } } } else//装備部位が右手左手じゃない場合 { //現在装備中の防具を一時変数に入れる ArmorEntity tempEntity = playerManager.equipArmors[equip_slot]; //装備中フラグをfalseに tempEntity.nowEquip = false; armorEntity.nowEquip = true;//今から装備する防具のフラグをtrueに //選択した防具を装備部位に代入する。 playerManager.equipArmors[equip_slot] = armorEntity; //装備部位のテキストを反映する UpdateArmorText(playerManager, armorEntity, equip_slot); //リストに装備していた防具を代入する。 ArmorManager.instance.possessionArmor[index] = tempEntity; } SoundManager.instance.PlaySE(34); } public void UpdateWeaponText(PlayerManager playerManager,WeaponEntity weaponEntity, GeneralEnum.EQUIP_SLOT equip_slot) { WeaponData weaponData = WeaponManager.instance.GetWeaponDataFromEntity(weaponEntity); string viewtext = ""; string weaponName = weaponData.weaponName; if (weaponEntity.enhancementValue > 0) { viewtext = weaponName + " +" + weaponEntity.enhancementValue; } else if(weaponEntity.enhancementValue < 0) { viewtext = weaponName + weaponEntity.enhancementValue; } else { viewtext = weaponName; } switch (equip_slot) { case GeneralEnum.EQUIP_SLOT.RIGHTHAND: RHandEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.LEFTHAND: LHandEquipText.text = viewtext; break; default: break; } } public void UpdateAllWeaponText(PlayerManager playerManager) { WeaponEntity RHandWeaponEntity = playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.RIGHTHAND]; WeaponData RHandWeaponData = WeaponManager.instance.GetWeaponDataFromEntity(RHandWeaponEntity); WeaponEntity LHandWeaponEntity = playerManager.equipWeapons[GeneralEnum.EQUIP_SLOT.LEFTHAND]; WeaponData LHandWeaponData = WeaponManager.instance.GetWeaponDataFromEntity(LHandWeaponEntity); string RHandviewtext = ""; string RWeaponName = RHandWeaponData.weaponName; if (RHandWeaponEntity.enhancementValue > 0) { RHandviewtext = RWeaponName + " +" + RHandWeaponEntity.enhancementValue; } else if (RHandWeaponEntity.enhancementValue < 0) { RHandviewtext = RWeaponName + RHandWeaponEntity.enhancementValue; } else { RHandviewtext = RWeaponName; } string LHandviewtext = ""; string LWeaponName = LHandWeaponData.weaponName; if (LHandWeaponEntity.enhancementValue > 0) { LHandviewtext = LWeaponName + " +" + LHandWeaponEntity.enhancementValue; } else if (LHandWeaponEntity.enhancementValue < 0) { LHandviewtext = LWeaponName + LHandWeaponEntity.enhancementValue; } else { LHandviewtext = LWeaponName; } RHandEquipText.text = RHandviewtext; LHandEquipText.text = LHandviewtext; } public void UpdateArmorText(PlayerManager playerManager, ArmorEntity armorEntity, GeneralEnum.EQUIP_SLOT equip_slot) { ArmorData armorData = ArmorManager.instance.GetArmorDataFromEntity(armorEntity); string viewtext = ""; string armorName = armorData.armorName; if (armorEntity.enhancementValue > 0) { viewtext = armorName + " +" + armorEntity.enhancementValue; } else if (armorEntity.enhancementValue < 0) { viewtext = armorName + armorEntity.enhancementValue; } else { viewtext = armorName; } switch (equip_slot) { case GeneralEnum.EQUIP_SLOT.RIGHTHAND: RHandEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.LEFTHAND: LHandEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.HEAD: HeadEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.BODY: BodyEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.WEIST: WeistEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.LEG: LegEquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.ACCESSORIES1: Accessories1EquipText.text = viewtext; break; case GeneralEnum.EQUIP_SLOT.ACCESSORIES2: Accessories2EquipText.text = viewtext; break; default: break; } } public void UpdateAllArmorText(PlayerManager playerManager) { ArmorEntity headArmorEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.HEAD]; ArmorData headArmorData = ArmorManager.instance.GetArmorDataFromEntity(headArmorEntity); ArmorEntity bodyArmorEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.BODY]; ArmorData bodyArmorData = ArmorManager.instance.GetArmorDataFromEntity(bodyArmorEntity); ArmorEntity weistArmorEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.WEIST]; ArmorData weistArmorData = ArmorManager.instance.GetArmorDataFromEntity(bodyArmorEntity); ArmorEntity legArmorEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.LEG]; ArmorData legArmorData = ArmorManager.instance.GetArmorDataFromEntity(legArmorEntity); ArmorEntity accessories1ArmorEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.ACCESSORIES1]; ArmorData accessories1ArmorData = ArmorManager.instance.GetArmorDataFromEntity(accessories1ArmorEntity); ArmorEntity accessories2ArmorEntity = playerManager.equipArmors[GeneralEnum.EQUIP_SLOT.ACCESSORIES2]; ArmorData accessories2ArmorData = ArmorManager.instance.GetArmorDataFromEntity(accessories2ArmorEntity); string headViewText = ""; string headArmorName = headArmorData.armorName; if (headArmorEntity.enhancementValue > 0) { headViewText = headArmorName + " +" + headArmorEntity.enhancementValue; } else if (headArmorEntity.enhancementValue < 0) { headViewText = headArmorName + headArmorEntity.enhancementValue; } else { headViewText = headArmorName; } string bodyViewText = ""; string bodyArmorName = bodyArmorData.armorName; if (bodyArmorEntity.enhancementValue > 0) { bodyViewText = bodyArmorName + " +" + bodyArmorEntity.enhancementValue; } else if (bodyArmorEntity.enhancementValue < 0) { bodyViewText = bodyArmorName + bodyArmorEntity.enhancementValue; } else { bodyViewText = bodyArmorName; } string weistViewText = ""; string weistArmorName = weistArmorData.armorName; if (weistArmorEntity.enhancementValue > 0) { weistViewText = weistArmorName + " +" + weistArmorEntity.enhancementValue; } else if (weistArmorEntity.enhancementValue < 0) { weistViewText = weistArmorName + weistArmorEntity.enhancementValue; } else { weistViewText = weistArmorName; } string legViewText = ""; string legArmorName = legArmorData.armorName; if (legArmorEntity.enhancementValue > 0) { legViewText = legArmorName + " +" + legArmorEntity.enhancementValue; } else if (legArmorEntity.enhancementValue < 0) { legViewText = legArmorName + legArmorEntity.enhancementValue; } else { legViewText = legArmorName; } string accessories1ViewText = ""; string accessories1ArmorName = accessories1ArmorData.armorName; if (accessories1ArmorEntity.enhancementValue > 0) { accessories1ViewText = accessories1ArmorName + " +" + accessories1ArmorEntity.enhancementValue; } else if (accessories1ArmorEntity.enhancementValue < 0) { accessories1ViewText = accessories1ArmorName + accessories1ArmorEntity.enhancementValue; } else { accessories1ViewText = accessories1ArmorName; } string accessories2ViewText = ""; string accessories2ArmorName = accessories2ArmorData.armorName; if (accessories2ArmorEntity.enhancementValue > 0) { accessories2ViewText = accessories2ArmorName + " +" + accessories2ArmorEntity.enhancementValue; } else if (accessories2ArmorEntity.enhancementValue < 0) { accessories2ViewText = accessories2ArmorName + accessories2ArmorEntity.enhancementValue; } else { accessories2ViewText = accessories2ArmorName; } HeadEquipText.text = headViewText; BodyEquipText.text = bodyViewText; WeistEquipText.text = weistViewText; LegEquipText.text = legViewText; Accessories1EquipText.text = accessories1ViewText; Accessories2EquipText.text = accessories2ViewText; } public void DeleatEquipText(PlayerManager playerManager, GeneralEnum.EQUIP_SLOT equip_slot) { switch (equip_slot) { case GeneralEnum.EQUIP_SLOT.RIGHTHAND: RHandEquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.LEFTHAND: LHandEquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.HEAD: HeadEquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.BODY: BodyEquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.WEIST: WeistEquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.LEG: LegEquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.ACCESSORIES1: Accessories1EquipText.text = ""; break; case GeneralEnum.EQUIP_SLOT.ACCESSORIES2: Accessories2EquipText.text = ""; break; } } }
以前作成したアイテムのリストを応用して作っています。ざっくり説明すると、装備画面内で装備を変更したい箇所の部位のボタンを押すと、Start関数で実行しているSetEquipButtonListener関数が各々のEquipButtonを押した時に実行させたい関数(所持装備をリストに表示するSetWeaponEntity関数とSetArmorEntity関数)を登録します。
SetWeaponEntity,SetArmorEntity関数の中で、リスト内の武器及び防具の項目(Buttonコンポーネントを追加している)を押した時の処理も登録しています。登録している関数は、ChangeWeapon関数(もしくはDhangeArmor関数)、DestroyAllItem関数、HideListPanel関数、PermissionEquipButton関数です。
ChangeWeapon及びChangeArmor関数は指定した装備部位の装備を指定した装備に変更する処理です。今回、両手武器と盾の概念を入れたかったので、それぞれ装備した時にうまく機能するために関数内では結構複雑な処理をさせています。ChangeWeapon及びChangeArmor関数は元々装備していた武器を所持装備リストに登録する処理も行います。
DestroyAllItem関数はリストのコンテンツをすべて削除する関数です。これを実行しないと装備部位ボタンを押すたびに所持装備をリストに追加してしまうためおかしなことになります。
HideListPanel関数は装備一覧のリストを非表示にする関数です。武器及び防具の項目を押して装備変更したらリストを消したいのでこの関数も登録しておきます。
PermissionEquipButton関数は各EquipButtonの押下ができるようにする関数です。SetWeaponEntity,SetArmorEntity関数の最後で、その部位で装備できる武器もしくは防具が一つでもあればProhibitEquipButton関数を実行するようにしているのですが、これは装備一覧を出しているときは各EquipButtonを押せないようにしたいためです。装備変更を終えたらEquipButtonを押せるようにしたいのでこのPermissionEquipButton関数を登録しておきます。
更に、外すボタンを押した時の処理も登録させています。関数を登録する前にRemoveAllListenersでイベントをすべて削除します。そして、PushRemoveEquipButton関数、DestroyAllItem関数、HideListPanel関数、PermissionEquipButton関数、DeleatEquipText関数を登録します。PushRemoveEquipButton関数は、指定した装備部位の装備を外す関数で、DeleatEquipText関数は指定した装備部位のテキストを空白にする関数です。
EquipmentUIスクリプトを装備画面のCanvasに貼り付け、インスペクターの各々のオブジェクトを設定して実行すると以下の動画のようになります。
次回は装備による能力値の変化を実装していきます。