FC2ブログ
    03 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 05

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンシステム】コードからオブジェクトのLayerを変えたかった 

    こんにちは。
    大坂です。

    毎度のごとく小ネタですよ。
    オブジェクトのLayerをコードから変えたい時があったのでその方法をば。

    こんな感じですねー
     current.gameObject.layer = 1;

    文字列で変えたいときはこうですねー
     LayerMask.NameToLayer("Test");

    これだと、指定したオブジェクトしか変わらないので、子供も変えたいときはこんな感じでやると良さそうです。
     public static void SetLayer(Transform parent, int layer) {
    parent.gameObject.layer = layer;

    foreach (Transform child in parent) {
    SetLayer(child, layer);
    }
    }

    これで変えられます。
    コードから変えたいことはそんなにないかもしれませんが何かの役に立てば。
    ではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】コードの可読性についてツイッターで聞いてみた結果。(switch文のcaseのあとにifが・・・) 

    おはようございます!坂内っす。

    今週終わればゴールデンウィークですね!
    みなさんどこかへお出かけの予定は?
    僕は家にいます。

    さてさて、こんなコードを見かけました。

    switch(a){
    case 0:if(b == 0)
    処理A
    break;
    }


    き”も”ち”わるいー!!

    「ネットにこんな書き方ありましたよ?」

    え?まじで?まじかよ。気持ち悪いの俺だけなの?
    と思って、色々調べてみたら、某大学の教授の講義?にこんな書き方があったんですよ・・・・
    まじかぁ~

    ってことで、ツイッターで聞いてみました。




    558票の回答ありがとうございます!そして色々なご意見ありがとうございます!

    【結果】
    気持ち悪い 80%!
    普通 20%!



    やっぱり皆気持ち悪いとのこと。

    ただし、普通に思っている人が20%もいるので、皆さんもいつか出会うことがあるかもしれません。

    ただ、このアンケートのコード例が悪く、”フロー自体をこうやった方がいい”等のご意見が多かったです。
    ほんと申し訳ないですorz
    caseのところだけ書いておけばよかったと反省しております。
    あ、あとC#って書いてませんでしたね・・・・

    そこじゃないんだ!見てほしいのはそこじゃないんだ!と常に思っておりました(笑)

    このコード、可読性が悪いのが問題だと思っております。

    switch(a){
    case 0:if(b == 0)
    処理A
    break;
    }


    これって、こう書けばいいだけよね。

    switch(a){
    case 0:
    if(b == 0){
    処理A
    }
    break;
    }


    まだこうやった方が可読性があがると思いませんか?

    上も下も処理の流れ自体は全く同じ物になります。

    自分も結構コードぐちゃぐちゃに書いていってしまうことはありますが、なるべく可読性も考えた書き方にしていきたいっすね。

    ということで、皆さま可読性に気を付けてコードを書きましょう!という回でした。

    それでは、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】コンソールログのコピペ 

    こんにちは。
    木曜なのを忘れてました・・・。

    何もなかったので小ネタです。
    コンロールログのコピーをするときにこの部分でCtrl+cをしてもトレースまでコピペできるよって話。
    ここです。


    こんなですね。


    ではこれで・・・ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ScriptableObjectを使う時の注意点。そのまま使うとマスタの値が変わっちゃうよ? 

    今日は素敵な天気ですね!こんな日は散歩がしたくなります!
    まぁ しませんけど。坂内です。

    以前ScriptableObjectの作成方法や、使い方を紹介しました。
    【ハルシオンブログ】UnityでScriptableObjectを作成して、使う方法の紹介。なんか使いやすいように使ってください! 】

    マスタデータ的な感じで使うことが多いかと思いますが、使う上で気を付けないといけない点があるので、紹介。

    こんなデータを作成します。
    【Enemy.cs】
    public class Enemy : ScriptableObject
    {
    public List enemys = new List();

    [System.Serializable]
    public class EnemyData {
    public string name;
    public int maxHp;
    public int hp;
    public int atk;
    public Sprite image;
    }
    }




    これで、敵のデータ作成完了。

    次に画面にボタンを置き、クリックすることで、敵に攻撃をする感じのを作ります。



    【Script20190415.cs】
    using UnityEngine;
    using UnityEngine.UI;

    public class Script20190415 : MonoBehaviour
    {
    [SerializeField]
    Enemy enemyMst;
    Enemy.EnemyData currentEnemy;

    // UI
    public Text lblEnemyName;
    public Text lblEnemyHP;
    public Image imgEnemy;

    private void Start() {
    MakeNewEnemy();
    }

    public void OnClickAttack() {
    // 攻撃ダメージ(10~30)
    int atkDmg = Random.Range(10,31);
    currentEnemy.hp -= atkDmg;
    if (currentEnemy.hp <= 0) {
    MakeNewEnemy();
    return;
    }
    lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
    }

    private void MakeNewEnemy()
    {
    // 敵のデータをランダムで1体作成
    currentEnemy = enemyMst.enemys[Random.Range(0, enemyMst.enemys.Count)];
    lblEnemyName.text = currentEnemy.name;
    lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
    imgEnemy.sprite = currentEnemy.image;

    }
    }


    ボタンをクリックしたときにOnClickAttackを呼ぶようにします。

    そうすると・・・・




    えっ!

    なんかおかしい・・・・
    調べてみると、こうなっているのが分かります。



    えー!マスタの値がかわってるうううううう!!!

    これじゃマスタとしての意味なくなってしまいます。

    これ、値渡しじゃなくて参照渡しだから起きちゃうんですよね。

    なので、ScriptableObjectのオブジェクトを使う場合にはディープコピーにて使ってあげるといいと思います。

    なんかいい方法あるのかもしれませんが、今のところこんな感じでやってます。

    【Enemy.cs】
    using System.Collections.Generic;
    using UnityEngine;

    [CreateAssetMenu(fileName = "EnemyData", menuName = "ScriptableObjects/MakeEnemyData")]
    public class Enemy : ScriptableObject
    {
    public List<EnemyData> enemys = new List<EnemyData>();

    [System.Serializable]
    public class EnemyData {
    public string name;
    public int maxHp;
    public int hp;
    public int atk;
    public Sprite image;
    public void Copy(EnemyData enemyData)
    {
    this.name = enemyData.name;
    this.maxHp = enemyData.maxHp;
    this.hp = enemyData.hp;
    this.atk = enemyData.atk;
    this.image = enemyData.image;
    }
    }
    }


    コピーメソッドを付けてあげます。

    次にScript20190415.csのMakeNewEnemyメソッドを次のように変えます

    Private void MakeNewEnemy()
    {
    // 敵のデータをランダムで1体作成
    currentEnemy = new Enemy.EnemyData();
    currentEnemy.Copy(enemyMst.enemys[Random.Range(0, enemyMst.enemys.Count)]);

    lblEnemyName.text = currentEnemy.name;
    lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
    imgEnemy.sprite = currentEnemy.image;
    }



    こんな感じでやれば、ちゃんと動くようになります。



    気を付けないと、マスタデータが書き換わってしまいます。

    という感じで、今日はScriptableObjectを使う上での注意点でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    Tag: Unity  ゲーム  ゲーム開発  C#  ScriptableObject 
    tb 0 : cm 4   

    【ハルシオンブログ】ファイルの拡張子だけとか拡張子抜いた文字列が欲しい時 

    今週もこんにちは。

    さてネタはファイルの拡張子とかが欲しい時です。

    Splitを使ってもいいのですがPathを使うと簡単に取れます。
    System.IOなので「using System.IO;」を加えてあげてください。
        string testName = "test1.png";
    // ファイル名全部を取得
    string fileName = Path.GetFileName(testName);
    // 拡張子のみを取得
    string ext = Path.GetExtension(testName);
    // 拡張子なしを取得
    string noneExt = Path.GetFileNameWithoutExtension(testName);

    Debug.Log("ファイル名:" + fileName);
    Debug.Log("拡張子のみ:" + ext);
    Debug.Log("拡張子なし:" + noneExt);


    結果。


    これだけだと微妙なのですがパスが含まれてても大丈夫なところが便利です。
    testName変えてるだけです。
        string testName = "c:\\test\\test2.jpg";
    // ファイル名全部を取得
    string fileName = Path.GetFileName(testName);
    // 拡張子のみを取得
    string ext = Path.GetExtension(testName);
    // 拡張子なしを取得
    string noneExt = Path.GetFileNameWithoutExtension(testName);

    Debug.Log("ファイル名:" + fileName);
    Debug.Log("拡張子のみ:" + ext);
    Debug.Log("拡張子なし:" + noneExt);


    結果。

    ちゃんとパスなしで取得できてますね!

    では今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】TokyoSandboxに初めて遊びにいってみたよー 写真ぶっれぶれでやんの! 

    こんにちは!坂内っす。

    先週土曜に秋葉原でTokyoSandboxが行われたので、行ってきたよ。
    https://tokyosandbox.com/
    (インディーゲームの展示会みたいなもんすかね)

    とまぁ、いつも通り知り合いのブースを覗いて遊ばせてもらってをしてました。
    (今回は写真がいつも以上にぶれているため、勝手にツイート貼らせてもらう形にします)

    【果てのマキナ】
    知る人ぞ知るおづみかんさんのブース。
    遊ばせて頂いたが、面白い!
    2Dアクションですね!

    操作がコントローラのRとLメインという感じでしたが、中々なれなかった・・・・








    【ジラフとアンニカ】
    これまた良い作品!
    紙パレットさんの3Dアドベンチャー&音ゲー(?)ジラフとアンニカ!
    あれ なんか写真これしかないけど・・・・


    これがすごい良い!

    ちょうどいいTLあったので紹介!

    めちゃめちゃ面白そうですよ!




    【フライングガールストライカー】
    taniさんのブース。
    3Dシューティングがすごい!
    スマホなのにぬるぬる動くんすよこれ。







    【ガラクタファクトリー&CURUPON】
    タイラーさんのブース。




    (なんかタイラーさんのブースの写真だけあんまりぶれてない・・・・)

    パズルゲームのCURUPONとシミュレーションのガラクタファクトリーを展示してました。
    CURUPONやらせてもらったけど、難しい!慣れると連鎖とか狙えるようになるやつやね!
    手触り感いい感じだったので、皆さんもやってみてね!CURUPONはリリースされてるぽいよ!




    【ことだま日記】
    Ske6さんのブース。
    あれ?名前変わってる?以前は「ことだまっち」だったのに・・・
    いつもながらの可愛いブース。
    放置育成ゲームを作っています。








    他にもいくつかブース回りましたが、みんな凄いっす!

    負けてられません!

    ということで、本日はここまで!

    次のイベントはデジゲーかな?Bitsummitは今のところ行くかどうか不明です。

    ではあでゅ~ノシ

    Category: その他日記

    tb 0 : cm 0   

    【ハルシオンブログ】ディレクトリを削除しようとしたらエラー 

    はい。こんにちは。

    さて、ちょっとプログラムからディレクトリを削除しようたときの話。
    ディレクトリを消すのはこんなですね。
        Directory.Delete("Assets/DeleteTest");


    しかしディレクトリの中にファイルが有るとこんなエラーが出ます。
    「IOException: Directory Assets/DeleteTest is not empty」
    空っぽじゃないよって怒られてますね。

    ということでディレクトリの削除をする前に、中に入ってるファイルを全部消してあげればいいですね。
    こんな感じで全部取ってきて削除します。
        string deletePath = "Assets/DeleteTest";
    // ディレクトリ内のファイルを取得
    string[] files = Directory.GetFiles(deletePath);
    foreach(string file in files) {
    // 読み取り専用とかの対策
    File.SetAttributes(file, FileAttributes.Normal);
    File.Delete(file);
    }

    Directory.Delete(deletePath);

    これでディレクトリの中にファイルがあっても削除できます。

    ディレクトリの中にディレクトリがある場合は、
        Directory.GetDirectories(deletePath)


    で取れるのでディレクトリを全部取ってこの中も全部削除するとかする必要があります。
    やることはそんなに変わらないので割愛。

    ディレクトリを消すとかはそんなないは思いますが、こんな感じでできますよって話でした。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】新しい元号は「令和」。いや、違うUnityHub入れてみました。 

    こんにちは。坂内っす。
    ついに新元号の発表ですね!
    一体何になるんでしょうか?

    「令和」になったようです!
    来月から令和元年ですね。

    そしてシステム屋の皆さん頑張ってください!

    さて、UnityHubみなさん使ってますか?

    今僕のPCには以下のUnityが入ってます。
    ・Unity 5.4.0f3 (64-bit)
    ・Unity 5.5.0f3 (64-bit)
    ・Unity 5.6.0f3 (64-bit)
    ・Unity 2017.3.0f3 (64-bit)
    ・Unity 2018.1.4f1 (64-bit)
    ・Unity 2018.1.6f1 (64-bit)
    ・Unity 2018.1.8f1 (64-bit)
    ・Unity 2018.2.0b1 (64-bit)
    ・Unity 2018.2.0f2 (64-bit)
    ・Unity 2018.3.0f2 (64-bit)
    ・Unity 2018.3.8f1 (64-bit)
    ・Unity 2018.2.10f1 (64-bit)



    はい、管理がめんどいです。

    もう5系とか使わないでしょうに・・・・・ちょっと前まで4系も入ってましたが・・・・


    ということで、Hub入れてみましょう!

    Unityの公式からダウンロードできます。


    さて、起動するとこんな画面。



    「Installs」で使うUnityをインストールorインストール済みのフォルダを選択

    これで、UnityHubからプロジェクトを開くと、インストールされているバージョンで勝手にプロジェクトを開いてくれるようになりました。

    皆さんも是非UnityHubつかってみてね!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0