【ハルシオンシステム】コードからオブジェクトの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)
【ハルシオンブログ】コードの可読性についてツイッターで聞いてみた結果。(switch文のcaseのあとにifが・・・)
今週終わればゴールデンウィークですね!
みなさんどこかへお出かけの予定は?
僕は家にいます。
さてさて、こんなコードを見かけました。
switch(a){
case 0:if(b == 0)
処理A
break;
}
き”も”ち”わるいー!!
「ネットにこんな書き方ありましたよ?」
え?まじで?まじかよ。気持ち悪いの俺だけなの?
と思って、色々調べてみたら、某大学の教授の講義?にこんな書き方があったんですよ・・・・
まじかぁ~
ってことで、ツイッターで聞いてみました。
switchの case の後に if って気持ち悪いの俺だけ?
— ざぼさま@㈱ハルシオンシステム (@Zabosama) 2019年4月19日
例)
int a;
int b;
switch(a){
case 0:if(b == 0)
処理A
break;
case 1:if(b == 0)
処理B
break;
case 2:if(b == 0)
処理C
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)
【ハルシオンブログ】コンソールログのコピペ
木曜なのを忘れてました・・・。
何もなかったので小ネタです。
コンロールログのコピーをするときにこの部分でCtrl+cをしてもトレースまでコピペできるよって話。
ここです。

こんなですね。

ではこれで・・・ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】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を使う上での注意点でした。
あでゅ~ノシ
【ハルシオンブログ】ファイルの拡張子だけとか拡張子抜いた文字列が欲しい時
さてネタはファイルの拡張子とかが欲しい時です。
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)
【ハルシオンブログ】TokyoSandboxに初めて遊びにいってみたよー 写真ぶっれぶれでやんの!
先週土曜に秋葉原でTokyoSandboxが行われたので、行ってきたよ。
https://tokyosandbox.com/
(インディーゲームの展示会みたいなもんすかね)
とまぁ、いつも通り知り合いのブースを覗いて遊ばせてもらってをしてました。
(今回は写真がいつも以上にぶれているため、勝手にツイート貼らせてもらう形にします)
【果てのマキナ】
知る人ぞ知るおづみかんさんのブース。
遊ばせて頂いたが、面白い!
2Dアクションですね!
操作がコントローラのRとLメインという感じでしたが、中々なれなかった・・・・


ブーメランワープアクションゲーム「果てのマキナ」誠意制作中です。興味がございましたら。 #果てのマキナ #MachinaoftheEndhttps://t.co/5qjajnhFnL pic.twitter.com/DQohxWSYi8
— おづみかん (@ozumikan) 2018年10月2日
【ジラフとアンニカ】
これまた良い作品!
紙パレットさんの3Dアドベンチャー&音ゲー(?)ジラフとアンニカ!
あれ なんか写真これしかないけど・・・・

これがすごい良い!
ちょうどいいTLあったので紹介!
めちゃめちゃ面白そうですよ!
本日のTOKYOSANDBOXのジラフとアンニカの僕のインタビューがアーカイブで見れますので見逃した方はどうぞ~~!=リ
— 紙パレット=リ1ワTOKYOSANDBOX ジラフとアンニカ (@kamipallet) 2019年4月7日
゙はずい!=リ゙
TokyoSandboxのTokyo Sandbox 2019 (Day 2)をhttps://t.co/iF2a9M5VxPでチェック*しよう* https://t.co/X6rtBa0HOl
【フライングガールストライカー】
taniさんのブース。
3Dシューティングがすごい!
スマホなのにぬるぬる動くんすよこれ。

【お知らせ】4/6~4/7にベルサール秋葉原で開催されるインディーゲームイベント「TOKYO SANDBOX」に、現在開発中のシューティングデームの出展が決定しました(゚Д゚)
— tani<リ[゚シューティング開発中 (@stardia_game) 2019年2月27日
インベントの詳細については決定次第再度アナウンスさせて頂きますので、是非遊びに来てください宜しくお願いします#TOKYOSANDBOX pic.twitter.com/CbCpYJWn1g
【ガラクタファクトリー&CURUPON】
タイラーさんのブース。


(なんかタイラーさんのブースの写真だけあんまりぶれてない・・・・)
パズルゲームのCURUPONとシミュレーションのガラクタファクトリーを展示してました。
CURUPONやらせてもらったけど、難しい!慣れると連鎖とか狙えるようになるやつやね!
手触り感いい感じだったので、皆さんもやってみてね!CURUPONはリリースされてるぽいよ!
パズルゲーム「くるぽん ポルク王子とポンコツの国」がリリース!
— 無責任商会タイラ~@Tokyo SandBox (@tylor240) 2019年2月21日
★ぷよぷよ!セガ、docomoのスゴ得コンテンツで公開されていたものよりも大幅バージョンアップして新登場!ひっくり返して消して、大連鎖がきもちいい爽快パズル!
iOS:https://t.co/tWtQvFsSBN
Android:https://t.co/hxKz3cTzlo pic.twitter.com/dlzS8Zw29G
【ことだま日記】
Ske6さんのブース。
あれ?名前変わってる?以前は「ことだまっち」だったのに・・・
いつもながらの可愛いブース。
放置育成ゲームを作っています。


【ことだま日記 / Ske6】
— Ske6 カ% ことだま日記@TOKYO SANDBOX (@Kotodamatchi) 2019年3月17日
言葉をどんどん食べさせて成長を楽しむ育成ゲーム『ことだま日記』を開発しています。2019年春のリリース予定です。
あなたの応援が開発者の栄養になります…!!#pixelart #ドット絵 #gamedev #indiedev #indiegame #TOKYOSANDBOX #ことだまっち #ことだま日記 #KotodamaDiary pic.twitter.com/m0cNRcHG78
他にもいくつかブース回りましたが、みんな凄いっす!
負けてられません!
ということで、本日はここまで!
次のイベントはデジゲーかな?Bitsummitは今のところ行くかどうか不明です。
ではあでゅ~ノシ
Category: その他日記
【ハルシオンブログ】ディレクトリを削除しようとしたらエラー
さて、ちょっとプログラムからディレクトリを削除しようたときの話。
ディレクトリを消すのはこんなですね。
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)
【ハルシオンブログ】新しい元号は「令和」。いや、違う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)
| h o m e |