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

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

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

     

    【ハルシオンブログ】Linqを使ってリストをランダムに並び替える 

    こんにちは。

    桜も咲いてだいぶ春めいてきましたね。
    週末には満開みたいですが、関東は天気がいまいちですね。。
    まぁお花見はしないですけど。

    さて、今週もネタがないので適当なやつ。
    Linqでリストの順番をランダムにするだけ・・・。

    「using System;」、「using System.Linq;」を追加しないと使えないのでお忘れなく。
        List list = new List();
    for(int i = 0; i < 10; i++) {
    list.Add(i);
    }
    // ランダムに並び替え
    list = list.OrderBy(a => Guid.NewGuid()).ToList();

    foreach(int i in list) {
    Debug.Log(i);
    }

    これだけですねー。
    結果はこんな感じ


    それでは今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

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

    こんにちは。ハルシオンシステムですっ!

    UnityでScriptableObjectを使い、マスタデータ的な感じでデータを使う方法ってあるじゃないですか。

    それを簡単にやってみたいと思います。

    ①ScriptableObjectのコードを作成

    [TestData.cs]
    using UnityEngine;

    [CreateAssetMenu(fileName = "TestData",menuName = "ScriptableObjects/MakeTestData")]
    public class TestData : ScriptableObject
    {
    public int testNo;
    public string testName;
    public int testAge;
    }


    こんな感じで、testNo、testName、testAgeを持たせたTestDataクラスを作成します。

    クラスの前にCreateAssetMenuというのがありますが、これは実際のScriptableObjectを作成する時に使う設定です。
    これを書くことで、UnityのオブジェクトをCreateする場合に、menuNameに書かれた項目が出るようになります。



    MakeTestDataを実行すると、以下のようなTestDataという名前のScriptableObjectができます。



    ②ScriptableObjectに値を入れる



    こんな感じで、値を入れてみました。

    ③コードからScriptableObjectのデータを使用

    [Script20190325.cs]
    using UnityEngine;

    public class Script20190325 : MonoBehaviour
    {
    [SerializeField]
    private TestData testData;

    void Start()
    {
    Debug.Log(testData.testNo + " : " + testData.testName + " ; " + testData.testAge);
    }
    }


    TestDataには先ほど作成した、ScriptableObjectをアサインします。




    これで実行すると、こうなる。


    (みずらい!)

    こんな感じでScriptableObjectは用意し、使うことができます。


    マスタデータのように使うんだったら、ScriptableObjectの方はこんな感じにした方がいいと思いますが。

    [TestData.cs]
    using System.Collections.Generic;
    using UnityEngine;

    [CreateAssetMenu(fileName = "TestData",menuName = "ScriptableObjects/MakeTestData")]
    public class TestData : ScriptableObject
    {
    public List<TestEachData> testDatas = new List<TestEachData>();

    [System.Serializable]
    public class TestEachData {
    public int testNo;
    public string testName;
    public int testAge;
    }
    }


    こうすることで、Listとして管理できます。



    使う時はこうですね。

    [Script20190325.cs]
    using UnityEngine;

    public class Script20190325 : MonoBehaviour
    {
    [SerializeField]
    private TestData testData;

    void Start()
    {
    foreach(TestData.TestEachData data in testData.testDatas) {
    Debug.Log(data.testNo + " : " + data.testName + " ; " + data.testAge);
    }
    }
    }




    まぁ好きなように使ってやってください。

    ということで、ScriptableObjectの作り方と使い方の紹介でした!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】2DSprite、SpriteRendererの形によってPolygonCollider2Dをフィットさせたい!そんな時はこう! 

    はい、こんにちは。

    月曜日、ブログの時間がやってまいりました。

    2DのSpriteRendererでキャラを作り、アニメーションをさせます。
    このキャラにぶつかり判定のColliderを付けようと思うと、こうなってしまいます。

    いや、全然これでもいいんですけどねw



    付けたのは、PolygonCollider2D。

    でもちょっと、キャラの形に合わせてColliderも動かしたいですよね。

    そんな時に便利なのがこのアセット!

    Advanced Polygon Collider
    https://www.gameassetdeals.com/asset/52265/advanced-polygon-collider



    なんと無料!!


    ①Advanced Polygon Colliderをインポート

    ②スプライトのRead/Write Enableにチェックを入れる
    アニメーションで使うすべてのSpriteにチェックを入れてください。



    ③PolygonCollider2Dの付いているSpriteにAdvancedPolygonColliderのコンポーネントを追加


    ④SpriteにAdvancedPolygonColliderの値をいじって、キャラにフィットさせる



    ⑤SpriteにAdvancedPolygonColliderの「Run In Play Mode」にチェックをいれる

    これで、SpriteにフィットしたPolygonCollider2Dの完成です。




    こんな感じで、こちらのアセットを使うと簡単にSpriteにフィットしたColliderを作ることができるみたいです!

    ということで、本日は簡単なアセットの紹介でした!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】コルーチンでボタンが押されるまで待ちたいときとか。 

    こんにちは。
    大坂です。

    今週はたまに書くコルーチンネタ。
    コルーチン処理中にyield returnで待つときに時間で待たせたり他のコルーチンの処理を待ったりしますが、
    ボタン押したら次に行きたいときとかのやり方です。

    では、コードです。
    public class Test_1 : MonoBehaviour {

    bool flg = false;

    void Start() {
    StartCoroutine(Test());
    }

    IEnumerator Test() {
    Debug.Log("flg:" + flg);
    // flg が false の間待つ
    yield return new WaitWhile(() => !flg);
    Debug.Log("flg:" + flg);
    }

    public void OnClickBtn() {
    flg = true;
    }
    }

    一応実行結果はこんなですね。

    ボタンが押されてからログが出てますね。
    ということでこんな感じでも待つことができるのでなにかに使えるかもしれません!

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】(Unity)SpriteRendererを3D空間において、ライティングと影を使いたい! 

    こんにちは!坂内っす。(これいる?)

    Unityで3D空間に2Dキャラとかを置く場合、どうしましょう?

    そのままSpriteRenderer置いてもライトの影響とか、影とか出ないっすよねー

    適当な床と壁を用意し、キャラはアセットストアのフリーのやつを置いてみます。

    とりあえず適当に左右に動くようにしてみました。



    この方法だとライティングも影も無視ですよねー

    以下の方法をいじってみましょう。

    ①ライトの設定で、影を付けるようにする

    ライトのShadowTypeをHaed ShadowsかSoft Shadowsにする。



    ②以下のShaderを用意
    https://answers.unity.com/questions/976048/how-do-you-flip-a-sprite-that-has-a-normal-map-mat.html
    ここのフォーラムにあったShaderが使えます。

    ③マテリアルを作成
    マテリアルを用意し、①のShaderにする
    StandardのShaderを使用すると、FlipやScaleをマイナスにして左向き等した場合に、描画されなくなります。

    ④SpriteRendererのマテリアルを②で作ったものに変更
    これで、ライティングが有効になります。



    ⑤影を付けてみる
    SpriteRendererのShadowをONにしたいが、そんな項目がありません。
    そこでInspectorをDebugモードにします。



    ここのハンバーガーボタンを押してDebugモードにします。

    SpriteRendererのCast Shadowを「Two Sided」にします。

    これで大体の設定は終わりです。



    SpriteRendererで、ライトと影が使えるようになりました!!


    ※上記でも影が出ない場合は以下の設定も追加でやってみてください。

    Edit>ProjectSetting>Quality>ShadowsがOFFになっている場合、「Hard and Soft Shadows」に変更。



    これでできると思います!

    ってことで、今日はこれにてあでゅ~ノシ


    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】スクリプトをアタッチしたときに特定のコンポーネントを付けたいとき 

    お疲れ様です。
    大坂です。

    花粉がやばいっすねー。
    むずむずが止まりません。

    さて今週のネタ。
    スクリプトをアタッチしたときに必ず組にして使う必要があるコンポーネントがある場合、
    スクリプトをアタッチすると自動でつけてくれる方法があるよってお話
    書き方はこんな感じです。
    [RequireComponent(typeof(BoxCollider2D))]
    public class Test_1 : MonoBehaviour
    {

    って書くとTest_1のスクリプトをゲームオブジェクトとかにアタッチしたときにBoxCollider2Dも一緒につけてくれます。



    必ず組で使うコンポーネントなんかがあるとこうやってやれば便利ですね!
    では今週もこれでノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityでのシーン間のデータの受け渡し…初心に戻ってみました。 

    花粉が飛び始めた感じですね。
    今年もまた多いとか・・・つらい時期が始まりました。坂内っす。

    ネタが思いつかないので、初心に戻って「シーンを跨いだデータの渡し方」をやってみましょう。

    まずはシーンを2つ用意します。

    シーン


    シーン


    やることは、「シーン1のインプットフィールドに文字を入力し、ボタンで次のシーン(シーン2)に行って、テキストにシーン1で入力した文字を出力する。」です。

    シーン間で引き継げるクラスとオブジェクトを用意する。
    まずは、以下のクラスを作成。

    引き継ぎ用クラス
    [DeliverClass.cs]
    using UnityEngine;

    public class DeliverClass : MonoBehaviour
    {
    public string deliverString;

    private void Start() {
    DontDestroyOnLoad(this);
    }
    }


    上記クラスをシーン1に置きます。

    ●シーン1



    受け渡す準備が完了しました。

    それでは、シーン1で「ボタンを押したら、インプットフィールドに入力した文字をDeliverクラスに引き渡す」をやってみましょう。

    [Scene1.cs]
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;

    public class Scene1 : MonoBehaviour {
    public InputField inputField;

    public void OnClickButton() {
    // DeliverClassを取得
    DeliverClass deliver = FindObjectOfType<DeliverClass>();
    // InputFieldの文字列をDeliverに渡す
    deliver.deliverString = inputField.text;
    // シーンを20190304_02に移動
    SceneManager.LoadScene("20190304_02");
    }
    }


    ボタンを押した時にOnClickButtonが呼ばれるようにしておきましょう。

    これで、InputFieldに文字を入力したものが、DeliverClassのdeliverStringに入り、次のシーンに持ち越すことができます。

    それでは、シーン2の方のコードも書いてみましょう。

    [Scene2.cs]
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;

    public class Scene2 : MonoBehaviour
    {
    public Text txtString;

    private void Start() {
    // DeliverClassを取得
    DeliverClass deliver = FindObjectOfType<DeliverClass>();

    // DeliverClassから文字列を取得し、セット
    txtString.text = deliver.deliverString;
    }

    public void OnClickBackButton() {
    SceneManager.LoadScene("20190304_01");
    }
    }


    シーン2の方では、Startの中でDeliverClassから値を持ってきて、Textにセットすることをしています。

    実際に実行すると、DeliverのオブジェクトがDontDestroyOnLoadのところにあるのが確認できると思います。



    これが「シーンが変わっても消えないオブジェクト」になります。

    これで、シーン1のInputFieldの値をシーン2に引き渡すことができます。

    ってことで、簡単かつ基本的なことでしたが、誰かの役に立てば幸い・・・・
    あでゅ~ノシ

    Category: 開発日記(Unity)

    Thread: プログラミング

    Janre: コンピュータ

    Tag: Unity  ゲーム開発  C#  シーン  Scene  シーン間   
    tb 0 : cm 0