あいりすすすすすすすすすすすすすs

あいりすがなんかするブログ

今年の振り返り後編 【きゃねぽよサーバーアドカレ】

きゃねぽよアドカレ19日目の記事です。

adventar.org

 

昨日の記事はこちらです。

meshin.hateblo.jp


 

・初めに


12月も後半になってきました

そろそろ今年の後半の記事書きますよ。

早めに書こうと思ったけどポケカに再度ハマったり色々あって

遅れてしまいました。

 

それではいきましょう!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

・7がtttttttっつっつつつつつつ


 

写真フォルダを見てみたらなんとなんと 5枚も写真がはいってました!!!

 

すごいですね!!

 

f:id:IriSValkyrie:20211218231052j:plain

 

 

キーボードの写真とグラボを海外輸入したらこんだけ安いのかと思った時の写真

だけしか写せるものないじゃん

 

ほかには何かあるかなぁ・・

 

おっとこれを忘れてました

 

DDLCplus71!!!!!!! 

 

 

Unityで作りなおされていることでテンションが爆上がりします

 

メインストーリーはいつも通りのモニカがかわいい感じでしたが

サイドストーリーがサイドストーリではないボリュームで

カロリーが高すぎて死にました

 

 

他には 初運転もこの月でした

車で買いに行ったロッテリア めっちゃうまかったのを覚えてます

これはたぶん 自転車が欲しくなった時期だと思います

就職したら平地に引っ越したいなと思ってたので急にロードバイク

サイトを見漁った記憶があります

 

・8がががつつつつつつつつついつつつ


 

写真はもう宛にならないのでtwitterから持ってきます

 

 

内定先から面接のお知らせが来てますね

 

 

 そういえばこの時bot制作してましたね

Discord.pyとAnnictを使ってアニメ検索ボットを作りました

YoutubeDlも使って 検索したアニメのopを再生することができる

優れモノでしたが、、、、、

 

突如として groovyやRythmがなくなりそうになったり

Discord.pyの制作者が手を離れたりとかで タイミングがめっちゃ悪かったですね

来年からスラッシュコマンドのみになるので僕が作ったbotも使えなくなっちゃったりとかで悲しいです

 

・Ⅸ月


 

 

 

Model-Oのマウスを中古で買ったら清掃されていない断線してるマウスだったので

自分でパラケーブル購入して付けました

 

収縮チューブをライターで焼くときに若干導線が焦げて焦りましたが

現在まで一応問題なく使えています

軽くて6000円は最強です

 

 

内定ようやく決まりました

最高です

最近ちょっとブラックじゃないか不安ですけど

 

 

らしいです

2回目は結構地獄でしたね

 

 

これわかる人いないですかね

薬の副作用らしいですけど

 

そういえばこの月にGirakメンバーで

最南端まで行きましたね

空いてる店も少なくて微妙でしたけど

楽しかったんでおkです

 

・🔟月


夏休みも終わっていよいよ学校への登校が始まります

 

ついにSerumの支払いが完了して僕の物になりました!!!!!!!!!!!!!!!!!!!!これで音楽作り放題ですね!!!!!!!!

と思ったんですけど全然音楽作る暇がなくて今も作ってないです

来年からKompleteを買って再開しようかなって思ってます

 

最近買い物してないなと思って

新しいワイヤレスイヤホンでLifeP3を買いました

 

f:id:IriSValkyrie:20211218235146j:plain

コスパ最強なので皆買ったほうがいいです

ノイキャンは微妙ですがコスパがいいのでこのくらいがちょうどいいですね

割と人が居るとこに出るとBluetoothが混線してちょくちょく止まるんで悲しいですけど・・

田舎羨ましい

 

 

CinemachineをMainCameraの子に付けた状態でImpulseを使うと

カメラの角度がずれてしまう不具合ですね

互いに作用してカメラの表示から外れるオブジェクトが出るので使う人は注意で

 

・⓫月


 

AmazonMusicからSpotifyに乗り移りたかったのに

Sheeridの学割に学校が登録されていないことしか考えてなかったです

 

写真もめぼしいツイートもほとんどないですね

 

 

・壱弐がつwtづいうぇいううぇhふぉいうぇうfh


推しの3D配信があったり SSDを買い替えたり チルアウトを箱買いしたり

FireStickTVを買ったり cssにハマったりポケカにハマったりと

楽しくやってます

f:id:IriSValkyrie:20211219000541j:plain

丁度この記事を書いた今日 スタートデッキが発売されて予約して購入したものが届きました

僕のデッキは31番でおそらくハズレ枠ですね

記事を書く前にコンビニとかいろいろなカード売り場を車で探しに行きましたが

どれも売り切れで売ってなかったです

みんなもポケカやろうね

 

最後に現在のロケリの成績です

カジュアル

f:id:IriSValkyrie:20211219001513p:plain

レート1700行きそうなんですけど敵が強くなりすぎてボイチャ喋れないレベルなんですよね

 

ダブルスランク

f:id:IriSValkyrie:20211219001627p:plain

徐々に個人技がうまくなりつつあるんでしょうね

 

スタンダードランク

f:id:IriSValkyrie:20211219001704p:plain

やっぱり意思疎通が取れないと成績が安定しないですね

人口が少なすぎて味方全員野良で相手フルパみたいなことが多いです

味方が萎えて止まったりゴール前で突っ立ってトロールしてたりと

散々なのでもう一生やりたくないです

 

ロケリ流行れ!!!!!!!!!!!!!!!!!

 

・最後に


 

今年一年地獄でしたね

もう就活なんて一生したくないです

多分転職する

来年は公私混同して休みの日に仕事の事考えないようにしたいと思います

 

ばいばい!!!!!!!!!

 

 

 

次の記事はきゃねぽよらしいです。

 

f:id:IriSValkyrie:20211219003127p:plain

 

僕も昔 フロンティアすこおおおおおおしだけやってました

5秒くらい・・・

 

 

 

 

 

 

1年振り返り【きゃねぽよサーバー2021年アドベントカレンダー 】

きゃねぽよアドカレ8日目の記事です。

adventar.org

 

昨日の記事はこちらです。

kyanepoyo.hatenablog.com

 

・初めに


久しぶりです。

 

完全にこのブログの存在を忘れていました。

 

Youtubeなどで動画投稿をしている方々というのは毎日やってるのかと思うと

頭が上がりません・・

 

 

今年振り返るよ


 

まあ、一言で言えば

                            制作 就活

                                                                ですかね

音楽を作る機会も1回しか無かったしほとんどコーディングの作業とポートフォリオの制作、就活でした。

何とか就活には成功して今はゆっくりと制作に入っていますが

(まだ制作してるよこの人・・・)

ガチガチな企業みたいな場所の就職はほとんどうまくいかず

なぜか新卒に技術をある程度技術を求めていて中途採用しか募集していないような場所に通ってしまったので(社会不適合者)

内定ブルーな感じになってます。

まあ、関東に行きたくないって気持ちが強すぎたのが原因な気がしますけどね

 

1月


マジでなんも覚えていないの一言ですが

この時は確か個人で音ゲーを作ろうとしてた時期ですかね。

ポートフォリオに乗せるために必死にやりました。

 

この辺からUnity初心者を卒業してMonoBehaviourを継承しないクラスを使うようになりました。

 

そういえばこの時期にKeychron K6を買ってますね。

今も使っていますがサイズがちょうどよくてお気に入りです。

NIZと一緒に代わる代わる使っています。

https://cdn.discordapp.com/attachments/757544703087607811/915987502219792384/IMG20210118104336.jpg

 

f:id:IriSValkyrie:20211206154916p:plain

1月のロケリ

この頃のロケリは不調っぽいですね。

大体複数以上の制作で忙しい時は調子が悪いのでしょうがないですね

シーズン2のアプデ後からランクの幅が変わるのでここから一気にダイヤに駆け上がります

 

2月


この辺マジで覚えてないです。

学校の制作はこの時には終わりかかっていて後は自分の制作だけだったので

余裕がある時だったのでロケリはやってはいましたが

ゲーム制作の面白さを知ってからはゲームやるよりコード書く方が好きになってしまったので

深夜まで自分の音ゲー制作をしてました。

 

3月


現在内定をもらってる企業に訪問に行ったり

ほぼ無理な企業に選考出してお祈り貰ったりとかしてました。

休みに入って自分の制作がサクサク進むようになって

頑張っています

もちろんこの時期もロケリだけは欠かせません

f:id:IriSValkyrie:20211206161008p:plain

3月のロケリ

クソほど停滞してます。

モチベが下がりまくってました

 

4月


自作の音ゲーもβ版が完成したのでポートフォリオを作成します。

オンライン授業も終わって定期的に登校するようになる。

そしてついに卒業制作が始まってしまいます

 

5月


免許の試験がありましたが無事獲得することができました。

今年からSNSをほとんど見なくなってしまったため

ほとんどツイートすることもないし

家から出ないから写真も撮らないしで何も記録がない。

 

 

f:id:IriSValkyrie:20211208222146p:plain

5月のロケリ

ダイヤに上がってロケリのモチベめちゃめちゃ上がった時期

ロケリめっちゃ楽しい

6月


この時期 お祈りメールばかりでメンヘラになっていました

そしてこの時期、Pythonを使ったbot作りにハマってしまいます。

C#よりもコードが簡単なので今でもお気に入りの言語です

 

・あとがき


 

今年の前半完全に虚無ですね。

後半にかけてはコロナも収まってきてGirakで集まる事多かったんで色々なことがあったと思います。

 

次は 

ukpさんの1年の振り返り前篇です。後半にご期待ください

最強のPCケースを求めて

この記事はきゃねぽよ Advent Calendar 2020の記事です

 はじめに


Unityの記事を書き終えて何とか試験も合格しやっと落ち着いてきた所で

また記事を書かなければならない時が来てしまいました

今回は自作PCの中でも特にこだわらなければならない部分

PCケースについて話していきたいと思います



 僕の理想のPCケース



さて、世の中には数々のPCケースがありますが

皆さんはどんなケースがいいと思うのでしょうか


黒光りしたゲーミング仕様のPCケース

静音を重視した真っ黒のPCケース

コスパを重視したケース

オープンフレーム仕様のかっこいい奴や完全水冷用の完全に剥き出しになるケース


お前らどんだけ真っ黒いものが好きなんだ??????


なんでこんなに黒光りしてるのかってぐらいPCケース黒ばっかなんだけど

まじでどうなってるの


そんなこんなで僕の理想のPCケースはこんな感じです

  • 片面ガラス
  • 裏配線がしやすい
  • 5インチベイが一個搭載

色なんて正直そのPCがかっこよければなんでもいいんですよ

問題は5インチベイなんです!

最近のPCは5インチベイが非搭載なんですよ!!!!!

白色で5インチベイ搭載といえばこれってのがありましたね


Thermaltake Versa H26 White

f:id:IriSValkyrie:20201220201434j:plain

嫌いじゃないけどこれの黒持ってたんですよね

ケースも外しやすくてととっても使いやすかったです

ですが5インチベイのマウントがデカいんですよね

フロントのボタンが上とか横についていると丁度いい感じなんですけど

最終的に色々探して至った僕が思う理想のPCケースが見つかりました


Cooler Master MasterBox MB600Lf:id:IriSValkyrie:20201220205253p:plain


これですこれ!

5インチベイが一個ついてて中身がスッキリしている感じ!!!

白色ではないですが塗装が普通の黒とは違っていて好みです


 なぜ5インチベイにこだわるのか




僕がなんでこんなに5インチベイにこだわっているのか説明します

そもそもなんでこんなに5インチベイにこだわっているのかというと・・・


f:id:IriSValkyrie:20201220211912j:plain

こういうのだったり・・・・

f:id:IriSValkyrie:20201220211913j:plain

こういうのだったりを搭載したいからです!!

ケース外に搭載する方法も考えたのですが、机を占領するのがあまり好きではないのでケースに搭載したいと思っていました

なんかこういうのロマンありません?????

超好きなんですよねぇ

 おすすめのケース(僕の偏見)



まずはコスパ重視見た目重視のケース

Cooler Master MasterBox Q300L

f:id:IriSValkyrie:20201220215126j:plain


サイドにフロントのボタンついてるのエッチすぎません??

まじでCoolorMasterのPCケースのデザインは神

次組むなら確定でこれですね


デザイン重視のケース

Lian Li O11 DYNAMIC WHITE

f:id:IriSValkyrie:20201220220741j:plain



フロントパネルのガラスに障害物が一切ないのが感動しました

簡易水冷向けですがPCの内部がよく見えていいケースだなと思いました


軽量ケース(某学校の人など向け)

INWINIW-ALICE-ORG

f:id:IriSValkyrie:20201220221458j:plain

なんとこのケース、プラスチックです。

見た感じ組みやすそうで使い勝手が良さそうです

移動が多い人は使ってみてはどうでしょうか(僕は使わないですけど

 あとがき



いかがだったでしょうか

記事書きながらケースみてたら

PC組みたくなってきました

僕は今までお友達のPCを7台ほど組んできたのですが構成を決める時気づいたら2時間とか経ってたりする時があります

大体ケースで時間が潰れていくんですよね

みんな同じようなゲームがやりたいわけなので

中身自体は同じような物を付けていればそれほど問題はない感じで大体同じようなもので組んでます

僕の文章力がゴミ以下なので変なとことか多いと思いますがここまで見てくださった方ありがとうございました

次の記事はまたUnityかもしれません。ちょっと音ゲーに挑戦したいなーと思っています

その時は完成して時間に余裕ができたらまた投稿しようと思います

ありがとうございました


明日はゆりなさんです



f:id:IriSValkyrie:20201220223053p:plain
🤔
・・・・?

キーツを救いたい【Part2】

この記事は Girak Advent Carender 14日目の記事です

 



 はじめに



今回もUnityやっていくわけですが・・・・・

前回のスクリプト ItemのIDの型が間違っていたので修正しておきました

なんで記事書いてから間違いが見つかるんだよって感じですが

たまたま今週のやることが増えてしまいなかなか作業できず今もこの記事を書いてる暇なんてないんじゃないかってぐらいやることがあります



 今日作るもの



 

 今日作るのはこんな感じです!

  • UI周り
  • アイテムをドラッグアンドドロップできるようにする
  • ウィンドウを開き所持アイテムを見ることができる
  • アイテムの個数を表示する

今回できるのは時間的にもこれくらいだと思います。クラフトだったりだとかはもう時間的に間に合わないなーって思って諦めました

そのほかのスクリプトは時間があれば後日また書くかもしれません


 UIの配置



f:id:IriSValkyrie:20201215210723p:plain
  • ①インベントリのパネル
  • imageコンポーネントのColorを黒にして一番後ろの背景に使ってます

  • ②アイテム用のパネル
  • imageコンポーネントのColorを白にしてインベントリの白い背景に使っています

  • ③インベントリの背景
  • インベントリのスロットの背景をグループ化しています

    スロットを整列するためにGridLayoutGroupを使用して整列しています

  • ④クラフト用パネル
  • パネルのColorを白にして背景に使っています

    クラフト用のスロットと+や=などのテキストを入れています

  • ⑤インベントリのアイテムの画像や個数
  • 各スロットにパネルの中にアイテムのアイコンが入るRawImageと個数を表示するTextが入っています

    Imageじゃない理由はSpriteじゃなくTextureで読み込んでるからです

    親オブジェクトにGridLayoutGroupをアタッチして配置するのがおすすめですが

    そのままにしておくとアイテムのドラッグアンドドロップのスナップが効かなくなるので

    ③の位置と重なったら親のGridLayoutGroupを削除し、各パネルのRectTransformの

    Anchorsをcenter middleに設定してください

スクリプトを作成後に再生するとこうなります

f:id:IriSValkyrie:20201215215810p:plain

アイテムの画像や個数はスクリプトで取得するので配置だけ行ってください


 インベントリを開くスクリプト/アイテムの表示



 アイテムを開く

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Player : MonoBehaviour
{


    /*アイテム関連フロント*/


    [SerializeField]  GameObject InventoryCanvas;



 void Update()
    {
      Inventory();
    }

void Inventory()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {

            
            if (InventoryCanvas.activeSelf ==false)//閉じていた場合
            {
                Cursor.visible = true;
                Cursor.lockState = CursorLockMode.None;
                InventoryCanvas.SetActive(true);
            }
            else//開いていた場合
            {

                 Cursor.visible = false;
                 Cursor.lockState = CursorLockMode.Locked;
                InventoryCanvas.SetActive(false);

            }

        }


    }

とっても簡単ですね

canvasを取得してキー操作でオンオフしてるだけです

 アイテムの画像の表示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class InventoryIcon : MonoBehaviour
{




    [SerializeField] RawImage texture;

    public Texture2D image;

     void Start()
    {
        texture.texture = image;
     }

手動でTextureを入れているだけです

この辺に関してはIDで指定しようと思いましたが思いつかなかったので

これでいっかってことになっています

 アイテムの個数の表示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.UI;
public class Inventory : MonoBehaviour
{
    public List<Item> inventory = new List<Item>();

    [SerializeField] ItemData itemdata;



   

    public Dictionary<string, int> dic;

    string itemid;




    public Text panel0001num;
    /*panel2*/
    public Text panel0002num;
    /*panel3*/
    public Text panel0003num;
    /*panel4*/
    public Text panel0004num;
    /*panel5*/
    public Text panel0005num;
    /*panel6*/
    public Text panel0006num;
    /*panel7*/
    public Text panel0007num;
    /*panel8*/
    public Text panel0008num;
    /*panel9*/
    public Text panel0009num;
    /*panel10*/
    public Text panel00010num;


    public void AddItem(string itemname)
    {

        for(int i = 0; i < itemdata.item.Count; i++)
        {

            if(itemname == itemdata.item[i].Name)
            {

                inventory.Add(itemdata.item[i]);
                Debug.Log(inventory[inventory.Count - 1].Name +"を獲得しました");
                 itemid = itemdata.item[i].ID;
                CountItem(itemid);

            }


        }

        
    } 


    void CountItem(string itemid)
    {
        dic = new Dictionary<string, int>();
        foreach( Item item in inventory)
        {
            //Debug.Log(item.Name);
            if (dic.ContainsKey(item.ID))
            {
                dic[item.ID]++;

            }   
            else 
            {
               
                dic.Add(item.ID, 1);
            }
        }
        foreach(string key in dic.Keys)
        {
            Debug.Log(key + " = " + dic[key]);
            
        }
        updateNum();


    }

    void updateNum()
    {
        foreach (KeyValuePair<string, int> tmp in dic)
        {
            switch (tmp.Key)
            {
                case "0001":

                    panel0001num.text = "x" + tmp.Value;

                    break;
                case "0002":

                    panel0002num.text = "x" + tmp.Value;
                    break;
                case "0003":

                    panel0003num.text = "x" + tmp.Value;
                    break;
                case "0004":

                    panel0004num.text = "x" + tmp.Value;
                    break;
                case "0005":

                    panel0005num.text = "x" + tmp.Value;
                    break;
                case "0006":

                    panel0006num.text = "x" + tmp.Value;
                    break;
                case "0007":

                    panel0007num.text = "x" + tmp.Value;
                    break;
                case "0008":

                    panel0008num.text = "x" + tmp.Value;
                    break;
                case "0009":

                    panel0009num.text = "x" + tmp.Value;
                    break;
                case "00010":

                    panel00010num.text = "x" + tmp.Value;
                    break;

            }
        }
    }
}

はい、馬鹿ですね

panel○○○○numにはスロットのアイテムの個数を表示するTextを入れています

アイテムが10個固定という前提で書いているのであればこれでも問題ないのですが

さらに多くのアイテムを扱うとなるとめんどくさくなります

対策としてはアイテムの中身に個数の要素を作って個数を追加する関数を作ることでさらに扱いやすいスクリプトができると思われます

今回はこれが原因でクラフトの要素がややこしくなり作るのが困難になりました

アイテムの中身を作るときはちゃんと考えてから作りましょう;;;;;;

アイテムの個数を数える部分に関しては

スクリプト内で宣言したdictionaryをアイテムを数える関数ないでインスタンス化してインベントリ内のアイテムのIDをKeyとして順番に登録していき

IDが重複するとValueの中に数を追加するようにしています



 アイテムをドラッグ&ドロップする



アイテムをマウスでドラッグアンドドロップできるようにします。

クラフトのスロットで離すとスナップするようにしてそれ以外の場所で

離すと元の位置に戻るようにしたいと思いますこれがとっても簡単に設定できるコンポーネントがあります

それがこちら

f:id:IriSValkyrie:20201215223744p:plain

 EventTrigger君です!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

このコンポーネントはアタッチされているオブジェクトがクリックされた時やドラッグされた時また他オブジェクトがドロップされた時などいろいろな条件を簡単に実装してくれるガチで便利なコンポーネントです

今回初めて使ってみました

インベントリ画面で必要なのはドラッグ&ドロップだけなので DragとEndDragのみを追加してください

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class InventoryIcon : MonoBehaviour
{




    [SerializeField] RawImage texture;

    public Texture2D image;


    [SerializeField] GameObject initParent;
   
    Vector2 initPos;


    int itemquantity;
    // Start is called before the first frame update
    void Start()
    {
        texture.texture = image;
        
        initPos = transform.position;


        //Debug.Log(initPos);
      //  Iteminfo();
    }

    // Update is called once per frame
    void Update()
    {
       
    }

    public void OnDrag()
    {
        this.transform.position = Input.mousePosition;
    }

    public void OnEndDrag()
    {
        List<RaycastResult> results = new List<RaycastResult>();
        PointerEventData pointer = new PointerEventData(EventSystem.current);
        pointer.position = Input.mousePosition;
        EventSystem.current.RaycastAll(pointer, results);
        
        foreach (var hit in results)
        {


            Debug.Log("検索中" + hit.gameObject.name);
            if (hit.gameObject.CompareTag("SnapUI"))
            {
                Debug.Log("SnapするUIを検出");
                transform.position = hit.gameObject.transform.position;
                this.gameObject.transform.SetParent(hit.gameObject.transform);
                break;
            }
            else
            {
                this.transform.SetParent(initParent.transform);
                this.transform.position = initPos;
            }


        }

        Debug.Log("検出されませんでした");
    }



}

ドラッグをする時はマウスの位置にオブジェクトの位置を同期させているだけです

ドラッグを離すとマウスの位置のUIにRayCastAllをしてすべて取得します

クラフトのスロットにはSnapUIというタグがつけられているので

取得したオブジェクトのタグがSnapUIであればそのオブジェクトと親子関係に設定するというスクリプトになっています

もしもなければStart関数で取得した初期位置に戻ります

実行するとこんなかんじです

f:id:IriSValkyrie:20201215230507g:plain

 あとがき


本来は間に合うはずがいろいろな予定で一日遅れてしまった・・・

クラフトは作ってみたもののバグだらけでまともにうごかなかったのでまた今度ということで・・・・

次回はおそらくきゃねぽよサーバーのアドベントカレンダーで投稿すると思います

明日(今日)はメガホンさんです。どんな記事か楽しみにしています!



ここまで見てくれた皆さんありがとうございました。キーツが今年度Unityを触るのか楽しみにしてます

キーツを救いたい【Part1】

この記事は Girak Advent Carender 6日目の記事です

 

 

 

キーツ........Unityやらないか?

 

 はじめに



さて、一年ぶりのアドベントカレンダー今回は今年から僕が始めたUnityについて

自分の勉強も兼ねて書いていこうかなと思います。

元々キーツが麻雀しててなかなかゲーム制作に手を付けないことに乗っかってこの記事を書こうと思いました、初心者が書くプログラムですのであんまり綺麗にかけてないかもしれないですが許してください。

 

(ちなみに名前の使用許可は取りました)

 

 

f:id:IriSValkyrie:20201205023120p:plain

 

 開発環境



 

  • Unity2019.3.14f1

 

 どんなものを作るか



 

 キーツが言うにはこういう機能のあるゲームが作りたいらしいです

 

  • 3人称視点のゲーム
  • ワールドにアイテムがポップアップしてプレイヤーがそれを回収できる
  • ウィンドウを開き所持アイテムを見ることができる
  • アイテムをクラフトできる
  • アイテムをクラフトすることで機械をつくることができる
  • 機械をワールド上に設置できる
  • 機械は何かしらのエネルギーを消費してアイテムの生成効率を上げる機能がある

 

イクラじゃねえか!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 今回作る機能について



 

さすがに今回だけですべてを作ることは僕のスケジュール的にも不可能なので

APEXのランクとか回せてないから回したいとか言えない

今回は

 

  • アイテム管理
  • インベントリ周り
  • アイテムのポップアップ
  • アイテムの回収

 

らへんをやっていこうかなって思います

 

 アイテムの生成



まずは動かすキャラクターと地面を用意しましょう

今回はUnityちゃんを使って動かします

実際に動かすスクリプトなどは省きますが一応参考になりそうなサイト貼っておきます

 

f:id:IriSValkyrie:20201205145542p:plain

 

unity-shoshinsha.biz

 

今回登録するオブジェクトを追加します

f:id:IriSValkyrie:20201205150325p:plain

 

今回追加するオブジェクトの種類は上のようになっています

実際にワールド上に生成させるのは1,2,3番のアイテムです

これをプレハブ化します

プレハブ化する前にアイテムに付いているColliderコンポーネントのisTriggerにチェックを必ずつけてください

これを付け忘れると僕のスクリプトではアイテムを回収できなくなります

 

f:id:IriSValkyrie:20201205150538g:plain

hierarchyからProjectのResourcesにドラッグ&ドロップで入れてください(ない場合は作成してください)

入れたらhierarchyの中にあるアイテムオブジェクトはすべて消してください

 

スクリプト

次にアイテムを生成するスクリプトを書いていきます

アイテムを生成する場所はx軸とz軸が50から-50です、y軸は0.5に固定してます

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemGenerator : MonoBehaviour
{

[SerializeField] ItemData ItemDataBase; //アイテムの一覧

[SerializeField] GameObject[] FieldItem = new GameObject[20]; //フィールド内のアイテムが入る変数

float x; //ワールドのx軸の変数 
float y = 0.5f;// y軸
float z;//z軸

float counttime;//アイテム再生成のクールタイム
// Start is called before the first frame update
void Start()
{
GenarateObject();
counttime = 10f;
}

// Update is called once per frame
void Update()
{
counttime -= Time.deltaTime;//クールタイムから1フレームにかかった時間を常に引く


if(counttime <= 0.0f)//クールタイムが0になったら再生成を実行
{
counttime = 10;


GenarateObject();
}
}


void GenarateObject()//アイテムを生成する関数
{
int itemnum;//アイテムの配列の番号


for (int i = 0; i < FieldItem.Length; i++)
{

if (FieldItem[i] == null)//フィールドのアイテムが消されてnullになっている場所にアイテムを生成する
{

itemnum = Random.Range(0, 3);//どのアイテムを生成するかランダムで決める

x = Random.Range(-50,50);//指定した範囲内でのx軸をランダムに決める

z = Random.Range(-50, 50);//z軸を決める


FieldItem[i] = Instantiate(ItemDataBase.item[itemnum].Object,new Vector3(x,y,z),Quaternion.identity);//Instantiateで指定したアイテム番号のアイテムを生成する
Debug.Log(ItemDataBase.item[itemnum].Name);

}

}

 


}
}


再生ボタンを押すとこんな感じに動作します


f:id:IriSValkyrie:20201205153920g:plain

アイテム3が出ていないのですが導入する前の動画だったので生成されていませんが
ちゃんと動作しています

またアイテムを大量に導入する場合アイテムをランダムで選出するところをDirectoryのKeyなどで選出して

アイテムの生成はエリア分割を行いそのエリアで決められたアイテムが出現するようにするといいかもしれません


 アイテム要素


まずはアイテムの要素を作っていきます
今回アイテムの要素は

  • 名前
  • オブジェクト
  • ID
  • アイテムの種類
  • アイテムの説明文
  • アイテムのアイコン

で構成していこうと思います
他に入れたいものがあれば任意でここに書き加えてください

 

 

 

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Item
{

    /*アイテムの中身を設定する場所*/


    public string Name;//アイテム名
    public GameObject Object;//実際のオブジェクト
    public string ID;//アイテムのid
    public ItemType type;//アイテムの種類
    public string Description;//アイテムの説明文
    public Texture2D icon; //アイテムのアイコン


    public enum ItemType //enumでアイテムの種類を切り替えて入れれるようにしています
    {
        item,
        machine,


    }


    public Item(string name, GameObject itemobject, string id, ItemType itemtype, string desc)//Itemをインスタンス化し外から呼び出して使う
    {
        Name = name;

        Object = itemobject;

        ID = id;

        type = itemtype;


        Description = desc;

        icon = Resources.Load<Texture2D>("item" + id); //Resourcesフォルダから ファイル名 <item0000> (0000はアイテムid)を取得して代入する


    }

}

今更ですが構造体にしてもよかったかもしれないです。(どっちでもいいと思っている)
今回の規模のゲームであればどっちでもいいとは思います
iconですがResourcesフォルダ内に名前を "item○○○○" という名前で入れておいてください(〇にはそのアイテムのIDが入ります)

  public enum ItemType
    {
        item,
        machine,


    }

この部分ですがenumを使用しているのでItemType.itemと入力するとアイテムの種類がitemになります
enum今まで使ったことなかったんで勉強になりました

 アイテム一覧データ



 

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemData : MonoBehaviour
{

    /*実際にアイテムを保管する場所*/

    public List<Item> item = new List<Item>();
    
    
    // Start is called before the first frame update
    void Start()
    {
        item.Add(new Item("item1",Resources.Load<GameObject>("item1object"),0001,Item.ItemType.item,"このアイテムはitem2とクラフトするとitem3になります"));

       
        item.Add(new Item("item2", Resources.Load<GameObject>("item2object"), 0002, Item.ItemType.item, "このアイテムはitem1とクラフトするとitem4になります"));



        item.Add(new Item("item3", Resources.Load<GameObject>("item3object"), 0003, Item.ItemType.item, "このアイテムはitem4とクラフトするとmachine1になります"));



        item.Add(new Item("item4", Resources.Load<GameObject>("item4object"), 0004, Item.ItemType.item, "このアイテムはitem3とクラフトするとmachine1になります"));


        item.Add(new Item("machine1", Resources.Load<GameObject>("machine1object"), 0005, Item.ItemType.machine, "このアイテムはitem3とitem4を入手すると獲得できる機械です地面に設置できます"));

    }

オブジェクトはResources.LoadでResourcesフォルダ内にあるオブジェクトを持ってくることができます
もしアイテムを持っていきたいスクリプトがある場合はItemDataをインスタンス化して持ってきてください

最後に空のオブジェクトにItemManagerと名付け
ItemData.csをアタッチすれば完了です
f:id:IriSValkyrie:20201205162447g:plain



 アイテム回収

アイテムを回収するスクリプトはプレイヤーを動かすスクリプトの中に入れておきます
ここではアイテム回収に必要のない部分のコードは省きます

 

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Player : MonoBehaviour
{
 
    /*アイテム関連*/
    [SerializeField] Inventory inventory;//インベントリのスクリプト

    [SerializeField] ItemData itemdata;//アイテム一覧のスクリプト

 private void OnTriggerEnter(Collider other)//何かに当たるたび動作する
    {
        Debug.Log("衝突");
    
        for(int i = 0; i < itemdata.item.Count; i++)//アイテム一覧のアイテムの数だけ繰り返す
        {
           
            if(other.name.Contains(itemdata.item[i].Object.name))//衝突したオブジェクトの名前にアイテム一覧の配列のi番目のオブジェクトの名前が含まれていたら動作する
            {
                
                Debug.Log(i+"番目と一致");
                inventory.AddItem(itemdata.item[i].Name);//インベントリにインスタンス化した配列の中に追加する


                Destroy(other.gameObject);//落ちてるアイテムを消す
            }



        }
          

    }
}

まず今回はOnTriggerEnterで衝突を判定します
衝突したオブジェクトとアイテム一覧のアイテムの名前を比較して追加するのですが
なぜContainsで判定しているかというと
衝突した後拾ったオブジェクトはプレハブを生成したものとなり、Inspector上の表記が○○○(Clone)となってしまって名前をうまく取得できないため
名前が含まれているかで判定しています

 インベントリ



 

スクリプト

最後はインベントリです

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour
{
    public List<Item> inventory = new List<Item>();

    [SerializeField] ItemData itemdata;

    public void AddItem(string itemname)
    {

        for(int i = 0; i < itemdata.item.Count; i++)
        {

            if(itemname == itemdata.item[i].Name)
            {

                inventory.Add(itemdata.item[i]);
                Debug.Log(inventory[inventory.Count - 1].Name +"を獲得しました");

            }


        }


    } 
}


プレイヤーがアイテムを回収するとInventoryのAddItem関数を実行します


 あとがき


僕の担当2日あるので今回はこの辺で終わります
Unityやらない人にとってはマジでどうでもいい内容だったけど普通に俺が勉強なったからよかったです
まだまだ技術不足なこともありますが頑張っていこうと思います

 

次(12/7)の記事はきゃねぽよ/kyaneeku⭐️⭐️くんが書いてくれます
どんな怪文書か楽しみにしてます

 

最後に

 

 

キーツここまでやったからにはUnityやれよ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

なんかよくわからないけどアドベントカレンダーを書く

・自己を紹介します。


ほとんど見るのはかのぽよ鯖の人だから自己紹介しなくていいかなって思ったけど

とりあえず自己紹介します

僕はあいりすといいます、ごく普通の実質高専生です。普段はゲームをやったり音楽作ったり動画編集したり画像編集したりPCの事考えたり

なんかやりたいことだけやってます。(最近こんなんでいいのか不安になったりしてる)

音楽は基本的になんでも聞きますがKawaiiFutureBassが大好きです。もうね、超好き、

エモい。ゲームはFPSから音ゲーからエロゲとかレースゲーまで一通りやってます。

(ホラゲー苦手だけどドキ分はやったことある)

 動画編集はaviutlとかVEGASproとか使ってますあんまりデザイン面得意じゃないので

クソクオリティです。はい。絵も描くことがあるんですけど最近描いてないです。

MMDとかもしてます。

 

じゃあ今年振り返りますか


 といっても文字を見るためにスクロールするのもうみんな見飽きたでしょ。

動画でつくったほうが見やすいと思ったので適当な動画作りました

適当に作ったのでクオリティは期待しないでください。

www.youtube.com

 ね?適当でしょ?

今年あったことはここに大まかに書かれていますが詳しく説明していきましょうかね

かのぽよサーバーの周りでやってたことについて詳しく掘り下げていきます

1月~4月の間のときのそら像があるサーバーは初めて僕がGCPで鯖立てしたやつです

この時期はLinuxのコマンドひたすら調べたり試行錯誤しながら鯖管理してました

(まあ管理というほどでもなかったんですけど)

 そのあとPVPが作りたいと誰かが言い始めたのでコマンドブロックでタイマーとかの

勉強してました。実際に動かしたのは1・2回ですがバグり散らかして諦めました

そのあとは夏休みまでみんなちょこちょこ適当に遊んで終わりました

8月からはかのぽよの生活鯖にゲリラMODを入れるガイジサーバーに移住して

家具MODを楽しんでました

他にもいろいろあったけど大体忘れてる。

毎回通話が楽しかったことしか思い出せない、、、、

 

・あとがき


 適当に書いたブログでしたがどうでしょうか。

この一年将来の事ずっと考えながら生活してましたが何一つ将来何したいかわからなかったですね。こんな中途半端に生きてていいのか・・・

とりあえず来年にはC++C#ぐらいちゃんと使えるようになっていたいですね。

かのぽよサーバーの方々には一年付き合ってくれてありがとうございました

来年も変わらず遊んでくれると嬉しいです。

アドベントカレンダーを企画したかにぽよに感謝

 

 

次回は「きんかんとかにぽよのテンションは反比例する!?実験してみた!」です

ありがとうございました