[過去ログ] UnityでC#勉強してMMO作たいけどどうする!?(^^ [無断転載禁止]©2ch.net (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
209: 2017/09/06(水)20:57 ID:zgtqawfd(1/29)調 AAS
ボッキングくん
起きていても寝ていても元気よく返事をしたまえ
211: 2017/09/06(水)21:07 ID:zgtqawfd(2/29)調 AAS
うむ、俺の元気がなくなった

ではさっそくだが
作業していただこう
ソースの整理である
212: 2017/09/06(水)21:08 ID:zgtqawfd(3/29)調 AAS
あ、作業前にバックアップしたまえ

■ItemTest.cs

消す public ItemData ItemData;

[SerializeField]
Public int ID; //publicを消す

■ItemSlot.cs

ItemManager itemManager; static つける
Sprite[] itemIcon; staticつける

static public void setItemIcon(Sprite[] icons){ staticつけて引数名修正
itemIcon = icons; 引数名直してとthis.を消す
}

static public void setItemManager(ItemManager im){ staticつけて引数名修正
itemManager = im;
}
213: 2017/09/06(水)21:12 ID:zgtqawfd(4/29)調 AAS
■Playerbokking.cs

以下不要になったので削除
private List<int> itemIDs = new List<int>();
public List<int> getItemIDs()
{

return itemIDs;
}
ここまで

if (dis < AttackRange)
{

int IDちんこ = target.GetComponent<ItemTest>().アイテムIDかえす();
itemIDs.Add(IDちんこ); この行削除
int アイテム取得 = target.GetComponent<ItemTest>().ID; この行削除
itemManager.setItem(IDちんこ); 引数直す
Destroy(target);
}

public void アイテム返すメソッド()
{
int IDちんこ = target.GetComponent<ItemTest>().アイテムIDかえす();
itemIDs.Add(IDちんこ); この行削除
}
214: 2017/09/06(水)21:14 ID:zgtqawfd(5/29)調 AAS
■ItemManager.cs

Start内を下記に直す

textures = Resources.LoadAll<Sprite>("ItemTityPotions");
Slots = GameObject.Find("Slots");
bokking = GameObject.Find("Ethan").GetComponent<Playerbokking>();
GameObject slotPrefab = (GameObject)Resources.Load("itemSlotPrefab");

ItemSlot.setItemIcon (textures);
ItemSlot.setItemManager (this);

for (int i = 0; i < 100; i++)
{
GameObject slot = Instantiate(slotPrefab);
slot.transform.SetParent(Slots.transform);
ItemSlot itemSlot = slot.GetComponent<ItemSlot> ();
itemSlotList.Add(itemSlot);
}

終わり
215: 2017/09/06(水)21:22 ID:zgtqawfd(6/29)調 AAS
何をしているかというと
インベントリ関連の不要になったコードの削除と
効率悪い処理を直している

これ終わったらインベントリ処理の説明をする
説明理解して消化できれば
アイテムの配置換えはヒントぐらいでできるであろう
217: 2017/09/06(水)21:29 ID:zgtqawfd(7/29)調 AAS
はやっ

ちゃんとうごくかね?
219: 2017/09/06(水)21:31 ID:zgtqawfd(8/29)調 AAS
さよか
では説明

まず、フィールド上に配置されるアイテムのスクリプト
itemTest.csだっけ?
この中身をみる

見た目はともかく、宣言されてるのはIDだけだな?
ここにはexcelで作ったデータとか一切ない
IDのみ
魂の器は空っぽなのよ
220: 2017/09/06(水)21:34 ID:zgtqawfd(9/29)調 AAS
次に
Playerbokking.csの
アイテム取得処理をみる

else if(targetTag == "Item")
{
Vector3 Apos = transform.position; //このスクリプトの持ち主、つまりplayerの座標
Vector3 Bpos = target.transform.position; //targetの座標
float dis = Vector3.Distance(Apos, Bpos); //距離計算しておく

if (dis < AttackRange)
{
int IDちんこ = target.GetComponent<ItemTest>().アイテムIDかえす();
Debug.Log ("IDちんこ");
itemManager.setItem(IDちんこ);
Destroy(target);

}

距離が一定以内なら、アイテムをとる、すなわち
itemTestのIDもらって、ItemManagerにIDを渡し、destroyする
ただこれだけしかしない IDの意味について考えるのはItemManagerであって
bokkingはたいしたことはしない
222: 2017/09/06(水)21:38 ID:zgtqawfd(10/29)調 AAS
ちょっと寄り道して

ItemSlot.cs

static ItemManager itemManager;
static Sprite[] itemIcon;

staticは意味わかるか?
223: 2017/09/06(水)21:38 ID:zgtqawfd(11/29)調 AAS
難しいと思う
225: 2017/09/06(水)21:41 ID:zgtqawfd(12/29)調 AAS
というか、文法的には普通のことしかしてない
むしろボッキング向けになるべく簡単なコード選んでる
ラムダはこのスレッド内で誰か説明してたからあえていれてる
226: 2017/09/06(水)21:42 ID:zgtqawfd(13/29)調 AAS
staticはまぁそんな感じ
ラムダも含めて猫でも知っているので猫に尋ねたらよろしいな
228: 2017/09/06(水)21:45 ID:zgtqawfd(14/29)調 AAS
そんで

ItemSlotはインベントリに100個ならべてるイメージのスクリプト

public void setId(int id){
img.sprite = itemIcon [id];
this.id = id;
}
このメソッドが呼ばれると、渡されたIDを保存しつつ
itemIconのID番目の画像を取り出して設定している
230
(1): 2017/09/06(水)21:49 ID:zgtqawfd(15/29)調 AAS
んでItemManager.cs
どうやってIDを処理しているか

public void setItem(int id)
{
int index = itemSlotList.FindIndex(s => s.getId() == 0);
itemSlotList [index].setId(id);
}
PlayerbokkingにまるなげされたIDがここで呼ばれる
何をするかというと、itemSlotのスクリプトのリストを調べて
IDが0のものを探すというラムダ
ID0が設定されているスロットは要するに「空」
「空」のスロットを探して、このスロットのスクリプトのリストがなんばん目であるか
indexに保存している
そのindexのスロットに対して、さっきのItemSlot.setidを読んでやる
231: 2017/09/06(水)21:51 ID:zgtqawfd(16/29)調 AAS
slotListの初期化とか飛ばして説明しているので
今は理解できないかも
あとで初期化も含めて読み直してみるべし

以上で「アイテムがスロットにセットされる」
232: 2017/09/06(水)21:53 ID:zgtqawfd(17/29)調 AAS
日本語で流れを整理すると

playerbokkingがアイテムをクリック
アイテムIDを入手してItemMangerに渡す
ItemManagerが空きスロットを探して
そのスロットにIDと画像をセットする
234: 2017/09/06(水)21:56 ID:zgtqawfd(18/29)調 AAS
ちょっと補足すると

ItemManagerはitemSlotのスクリプト100個、Startで所有しているので
空きをしらべてIDを渡すことができる

itemSlotはSpriteをすべてもっているので指定IDの画像を自分自身にセットできる
236
(1): 2017/09/06(水)22:00 ID:zgtqawfd(19/29)調 AAS
結局のところ
IDを渡して、IDに相当する画像セットしてるだけで
回復するとかなんとかまったくここまででてこない

あとで自分で流れおいながらコメントつけてみな
それで多分わかるようになる
239: 2017/09/06(水)22:02 ID:zgtqawfd(20/29)調 AAS
もうちょっとでおわるよ

こっからアイテムの使用

さっきまではクリックされたアイテムIDがスロットにセットされるという説明

今度はスロットをクリックして保存されてるIDを使う処理
240: 2017/09/06(水)22:06 ID:zgtqawfd(21/29)調 AAS
スロットの

public void OnPointerClick(PointerEventData eventData){
//右クリック対応
if (eventData.button == PointerEventData.InputButton.Right) {
//アイテム使用
itemManager.useItem(id);
setId(0); //画像をからっぽに
}
}
が右クリックされたときの処理

このメソッドは特殊で
public class ItemSlot : MonoBehaviour, IPointerClickHandler {

IPointerClickHandler
これがないと機能しない
インターフェイスという文法
これがついてると

OnPointerClick

はクリックされたときの処理の意味になる

そんでこれは右クリックなら・・・という意味で
if (eventData.button == PointerEventData.InputButton.Right) {

ItemManagerにアイテム使用を指示し
//アイテム使用
itemManager.useItem(id);
使った以上は、スロットのIDと画像を0に設定している
setId(0); //画像をからっぽに
242: 2017/09/06(水)22:13 ID:zgtqawfd(22/29)調 AAS
itemManagerは

itemManager.useItem(id);
を実行するので

public void useItem(int id){
funcs [id] (itemData.param[id], bokking);
}
が呼ばれる

ここが一番難しいかも

ここは文法的にはデリゲートつて関数を変数に蓄えておいて呼び出すような処理
その応用編で、関数の配列にしてある
243: 2017/09/06(水)22:14 ID:zgtqawfd(23/29)調 AAS
そうだなレフトだろうな

で、理解できるかはともかく、つづけると

このスクリプトの一番下がその配列
ItemFunction[] funcs = {
//0番
(itemData, bokking) => {
Debug.Log ("なんもないがな");
},
//1番
(itemData, bokking) => {
Debug.Log ("HPが" + itemData.HP回復量 + "回復した");
bokking.recoveryHP(itemData.HP回復量);
},
(itemData, bokking) => {
Debug.Log ("しらんがな");
},
(itemData, bokking) => {
Debug.Log ("わからんがな");
}
};

このデリゲートの処理で、やっとScriptableObjectにデータを問い合わせて
ID1番なら1番のアイテムデータを取り出して使っている

実際の回復処理はPlayerbokkingが処理すべきなので
必要なデータを渡しつつrecoveryHPというPlayerbokkingのメソッドを
作っておいて実行している
244: 2017/09/06(水)22:15 ID:zgtqawfd(24/29)調 AAS
ID2番てどんな効果?
246: 2017/09/06(水)22:20 ID:zgtqawfd(25/29)調 AAS
なら1番のコードそのままつかえる
コピペでも多分動く
247: 2017/09/06(水)22:21 ID:zgtqawfd(26/29)調 AAS
Debug.Log ("しらんがな");

Debug.Log ("HPが" + itemData.HP回復量 + "回復した");
bokking.recoveryHP(itemData.HP回復量);

にかえてやればおそらくそのまま動く
248: 2017/09/06(水)22:22 ID:zgtqawfd(27/29)調 AAS
うわあああああああああああああああ

ぎゃあああああああああああああ

ぐおおおおおおおおおおおおおおおおお
250: 2017/09/06(水)22:24 ID:zgtqawfd(28/29)調 AAS
デリゲートうんぬんとかアーキテクチャ的に理解できなくても
以降、4番5番と実装していけばアイテム増やしていくことは
ボッキングでもできると思う

ただこのコードを書いてるとき
せいぜいアイテム数200だろうと思ってこんな風に書いたのだが
2000とかいうぶっとんだアイテムをまじで実装するなら
もっと高度というかそれなりの処理をしないと無理
というか2000個もメソッド書くとか意味わからない
251: 2017/09/06(水)22:26 ID:zgtqawfd(29/29)調 AAS
あ、そうww
なんかおまいはわかりやすいなw
ま、ちゃんと前半理解すればアイテム配置換えもできるよ

そいじゃーな
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.030s