FC2ブログ
    04 «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.31.» 06

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

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

     

    【ハルシオンブログ】特定のRoot以下にある同じクラスをまとめてとる方法。 

    こんにちは。
    週末から暑くなってきましたね。
    そろそろ夏ですかね?まだ梅雨にもなってないですが・・・今年も暑そうだorz

    さてUnityのお話。
    同じような話は何回か書いた気もしなくはないが・・・

    Unityでこんな構成の時にまとめて文字を変えたい。
    もちろんTextじゃなくてもなんでもいいのですが、Root以下の同じクラスをまとめて取得する方法。




    Textsの子供にある、数あるuGUIのTextの文字を一気に変えたいって時、GetComponentsInChildrenを使うと楽ですよね。



    こんな感じに。

    [Blog20220530.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20220530 : MonoBehaviour
    {
    public GameObject uiBase;
    public Button btnExe;

    void Start()
    {
    btnExe.onClick.AddListener(ExecuteScript);
    }

    void ExecuteScript() {
    Text[] texts = uiBase.GetComponentsInChildren<Text>();
    foreach (Text txt in texts) {
    txt.text = "文字変更したよ";
    }
    }
    }



    GetComponentsInChildrenの戻り値は指定したクラスの配列になります。

    また、こんな感じで他のオブジェクトの子供や孫になっていてもちゃんと取ってくれます。



    上記でも問題なく文字が変更されます。

    まとめて同じ文字に変えるとかという動きはまずないと思いますが、Rootを指定してその子供のクラスを全部取るというのができるので、使い勝手はよさそうですよね!

    ということで、GetComponentsInChildren<クラス>の簡単な使い方の紹介でした。


    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】アクティブシーンの再読み込み 

    こんにちは。
    大坂です。

    アクティブなシーンの再読み込みについて。
    シーン名を文字列で指定しても出来るんですが、「SceneManager.GetActiveScene()」を使うとよさそうですね。

    SceneManager.LoadScene(SceneManager.GetActiveScene().name);


    「SceneManager.GetActiveScene()」は「Scene」がとれるので、
    「.name」を付けて名前を取得すれば、これだけでアクティブなシーンの再読み込みができます。

    ステージ制のゲームのリトライなどで使いやすそうですかね。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】uGUIのオブジェクトを複数同時に透明にしようとしたら、CanvasGroupを使うといいよ。 

    こんにちは、坂内っす。

    昨日一昨日はIndieLiveExpo2022がありましたね。

    https://indie.live-expo.games/

    2日目にポケガ3取り上げて頂きました。



    基本今までこういうのに応募してこなかったので、何書けばいいのかとか色々わかりましぇんでしたね。

    開発も中盤超えたので、このまま完成まで頑張っていこうと思いマッスル。


    UnityでuGUIの複数オブジェクトを同時に透明にする場合、どうやってますか?



    こんな感じでImageが複数あったり、Textがあったり。
    下にある「透明にする」ボタンを押すと、3個のImage、Textを透明にします。

    [Blog20220523.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20220523 : MonoBehaviour
    {

    [SerializeField] Image img1;
    [SerializeField] Image img2;
    [SerializeField] Image img3;
    [SerializeField] Text txt1;
    [SerializeField] Button btnTransparent;

    void Start()
    {
    btnTransparent.onClick.AddListener(TransparentUI);
    }

    void TransparentUI() {
    img1.color = new Color32(255, 255, 255, 0);
    img2.color = new Color32(255, 255, 255, 0);
    img3.color = new Color32(255, 255, 255, 0);
    txt1.color = new Color32(255, 255, 255, 0);
    }
    }





    こんな感じで、ボタンを押すとImage3個、Text1個を透明にできます。

    でも、透明にするオブジェクトが多いと、コードがどんどん増えていってしまいますよね。
    Imageが100個あると、 imgX.color = new Color32(255, 255, 255, 0); という行を100個書かないといけなくなってしまいます。

    そんな時にはCanvasGroupを使うといいですよね。

    空のオブジェクトを作成し、その子供として消したいオブジェクトを配置します。



    このCanvasGroupにはAlphaがあり、それをいじることで、子供全体のalphaが変更されます。



    そうすると、コードではこのCanvasGroupのAlphaだけいじればいいだけになります。

    [Blog20220523.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20220523 : MonoBehaviour
    {

    [SerializeField] CanvasGroup cg;
    [SerializeField] Button btnTransparent;

    void Start()
    {
    btnTransparent.onClick.AddListener(TransparentUI);
    }

    void TransparentUI() {
    cg.alpha = 0f;
    }
    }



    これだけで上記にあった処理と同じことができます。


    ということで、uGUIを使う方は、CanvasGroupを覚えておくと色々と便利です。

    CanvasGroupの話でした。
    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】プレハブが使っているリソースを調べる 

    こんにちは。
    大坂です。

    プレハブが使ってるリソースを調べたいときは「Select Dependencies」を使うと便利です。

    使い方はプレハブ選択して右クリックして「Select Dependencies」を選択。


    選択するとプレハブに関連するリソースが確認できますね。


    最初に選択したプレハブがさらにプレハブを使ってるとそいつに関連したのも出てくるので、
    うまく使えばプロジェクトの整理とかにも使えるんですかね。

    ではまた来週ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】あれ?何回もこの記事書いた気がする・・・・GameObjectの子供オブジェクトをとる方法をいくつか紹介。 

    また寒い日、暑い日の切り替えの激しい時期になりましたね。
    雨ばかりでじめじめしていて生きにくい!
    坂内っす。

    Unityで子オブジェクトをとる方法はいくつかあります。

    こんな構成の時にどんなものが取れるかみてみましょう。



    objParentは一番親のObjectをアサインしています。

    ①GetChildを使う

    using UnityEngine;

    public class Blog20220516 : MonoBehaviour
    {
    public GameObject objParent;

    private void Start() {
    for (int i = 0; i < objParent.transform.childCount; i++) {
    Debug.Log(objParent.transform.GetChild(i).name);
    }
    }
    }




    GetChildを使うと、子供のオブジェクトが取れます。
    でも、子供までで孫とかは取れません。

    ②foreachを使う

    using UnityEngine;

    public class Blog20220516 : MonoBehaviour
    {
    public GameObject objParent;

    private void Start() {
    foreach (Transform child in objParent.transform) {
    Debug.Log(child.name);
    }
    }
    }



    foreachで取ってもGetChildと同じく、孫までは取れません。



    ③GetComponentsInChildrenを使う

    using UnityEngine;

    public class Blog20220516 : MonoBehaviour
    {
    public GameObject objParent;

    private void Start() {
    var childrens = objParent.transform.GetComponentsInChildren();
    for (int i = 0; i < childrens.Length; i++) {
    Debug.Log(childrens[i].name);
    }
    }
    }


    全部取れます。



    ④LinqのEnumerable.OfTypeを使う

    using UnityEngine;
    using System.Linq;

    public class Blog20220516 : MonoBehaviour
    {
    public GameObject objParent;

    private void Start() {
    var childrens = objParent.transform.OfType();
    foreach (Transform trn in childrens) {
    Debug.Log(trn.name);
    }
    }
    }



    直下の子供だけ取れました。

    ⑤LINQ-to-GameObject-for-UnityのLinqを使う
    https://github.com/neuecc/LINQ-to-GameObject-for-Unity

    Linq to GameObjectを使うと簡単に子供とか親とかを取れます。


    using UnityEngine;
    using Unity.Linq;

    public class Blog20220516 : MonoBehaviour
    {
    public GameObject objParent;

    private void Start() {
    foreach (GameObject trn in objParent.Descendants()) {
    Debug.Log(trn.name);
    }
    }
    }



    こんな感じで簡単にとれる。

    何回もうちの記事でかいてた気がするが、子供オブジェクトの取り方を数パターン書いてみました。

    メモ程度に

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityで作ったC#スクリプトの文字コード 

    こんにちは。
    大坂です。

    Unityのバージョンによって作ったC#スクリプトの文字コードがデフォルトで「utf-8」にならずになんだか面倒なときがあります。
    SourceTreeなどでファイルを上げるときに気づくことが多々あります…。そして直し忘れることも多々ありますorz

    解決方法はいくつかありますが、お手軽な方法の紹介。

    プロジェクト直下の「〇〇.sln」と同じ階層に「.editorconfig」を配置する。


    「.editorconfig」以下の内容を書く。

    root = true

    [*.cs]
    charset = utf-8-bom


    これだけです。
    毎回変換して面倒だなとか思ったことがあったら試しください。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】UnityでAnalyticsを入れようと思ってFirebaseAnalyticsを入れたけど、よくわからんかったのでUnityAnalytivsにしてみた 

    ゴールデンウィークも終わりましたね。
    皆様いかがお過ごししましたでしょうか?
    3年振りになる緊急事態宣言ではないGWでしたね。
    これが続いて平常の世に戻って頂きたいと願い今日この頃。

    UnityでAnalyticsを導入しようかとFirebaseAnalyticsを入れてました。
    以下の感じでイベントログを設定していました。


    ///
    /// 街:道具屋でアイテム購入
    ///

    public void LogTownItemShop(string itemName) {
    FirebaseAnalytics.LogEvent(EVENT_TYPE_TOWN, EVENT_ACTION_TOWN_ITEMSHOP, itemName);
    }



    LogEvent(string name, string parameterName, string parameterValue)

    とのことで、パラメータとしてアイテム名を投げていました。

    こんな感じでログを取っていたのですが、Firebaseのコントロール画面で見てもパラメータが見れない・・・?

    Firebaseでこのイベントの画面を見るとこんな感じにはなるのですが、パラメータを見るところが分からない・・・



    見たいのはパラメータなんだけど。

    ということで、いまいち見方が分からなかったので、UnityAnalyticsにしてみました。

    導入自体はすごく簡単。

    UnityのServiceの中からAnalyticsをONにします。


    (なんでLegacy Analyticsなんだろう??)

    そして、コードのほうはこんな感じ。


    ///
    /// 街:道具屋でアイテム購入
    ///

    public void LogTownItemShop(string itemName) {
    Analytics.CustomEvent(EVENT_TYPE_TOWN, new Dictionary {
    { EVENT_ACTION_TOWN_BLACKSMITH, itemName }
    });
    }



    さぁ これでUnityAnalyticsに移行です。

    どんな感じにログが取れるかなぁ と




    ログは取れてますが、文字化けが・・・・・

    ということで、あとは文字化け対応すればできそうですね。

    色々試してみたいと思います。

    ということで、Analyticsを入れてみようと思ってるよー

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】GW真っ盛り!拡張メソッドつかってますか?簡単な拡張メソッドの作り方。 

    皆様GW如何お過ごしでしょうか?
    え?アプリ開発者にGWなんてない?
    まぁそういう方も多いですよね。
    私はがっつり休みます(ハルシオンは基本休日うごいてません)
    坂内っす。

    拡張メソッドって使ってますか?

    よくあるやつだと、Transform.positionのxに値を入れる時にこんな感じのことをやりますよね。


    Vector3 posi = gameObject.transform.position;
    posi.x = 100f;
    gameObject.transform.position = posi;


    めんど!ってなりますよね。

    そういう時にはこんな感じの拡張クラスを作っておくと簡単にpositionに値を入れることができるようになります。


    public static class TransformEx{
    static Vector3 v3;

    public static void SetPosiX(this Transform transform, float x){
    v3.Set(x, transform.position.y, transform.z);
    transform.position = v3;
    }

    public static void SetPosiY(this Transform transform, float y){
    v3.Set(transform.x, y, transform.z);
    transform.position = v3;
    }
    }


    こんな感じの拡張メソッドを用意すれば、xとyが簡単にセットできます。

    使い方はこんな感じ。


    using UnityEngine;

    public class Blog20220502 : MonoBehaviour
    {
    public GameObject obj;

    void Start()
    {
    obj.transform.SetPosiX(1f);
    obj.transform.SetPosiY(2f);
    }


    簡単にxとかyとか設定できるようになりましたね。


    ということで、簡単な拡張メソッドについでした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0