FC2ブログ
    08 «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.» 10

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

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

     

    【ハルシオンブログ】メインカメラとは別のカメラを使ってミニマップ的なものを作ってみた。 

    こんにちは!坂内っす。
    もう今日で9月も終わりですね。
    今年も残すところあと2か月!はやい!

    Unityで1画面に2カメラを使いミニマップみたいのを作る方法。

    まずは箱を横から見るだけのものを作ります。


    ミニマップ用のカメラを作成し、配置する。



    次にRenderTextureを作成。

    作成したRenderTextureをミニマップ用のカメラの「Target Texture」にアサインします。



    ミニマップを映すオブジェクトを用意する。

    今回はuGUIのRawImageに映してみます。

    RawImageを用意し、Textureに先ほどのRenderTextureをアサインすると、こんな感じにミニマップ的なのが簡単にできちゃいます!




    3D空間に移す場合はRawImageではなく、Quadを使うみたいですよ!
    もちろんTextureで表示するため、Cubeとか普通の3Dオブジェクトにも映せるようです。


    ということで、今日は簡単にメイン以外のカメラを他の場所に映す方法でした。


    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】3D空間でカメラとの距離にあわせた3Dサウンドの出し方(基本中の基本) 

    こんにちは!坂内っす。

    シルバーウィーク?なにそれおいしいの?

    ということで、今週も張り切っていきましょう!

    普段2Dのゲームばっかり作ってたんで、3Dゲームのサウンドとかをやろうと思った時に、「あれ?サウンドが2Dだ・・・」となりました。

    そりゃそうですね。

    SoundManager的なもの(SoundManagerにSoundSourceいっぱいついてて、一元で管理するようなもの)でやると、SEも2Dのままなんですね。
    BGMとかUIの音なんかは3Dの必要ないので、今まで通りSoundManagerでいいと思いますが。


    音を3Dにするには、マネージャーではなく、音を出すオブジェクトにサウンドソースを付けて、以下の設定する必要があります。


    ①音を出すオブジェクトにAudioSourceを付ける
    ②Spitial Blendを3D寄り(1)にする



    これだけで、3Dにあった音になります。

    カメラ(AudioListnerがついてる)とサウンドを付けたオブジェクトの距離が近いと音量がMAXで、離れるとどんどん音が小さくなっていきます。
    この時に、「どれだけ離れたら完全に聞こえなくなる」や、「この距離だとどれくらいの音量」などを設定もできます。





    Max Distanceがデフォルトでは500になっています。
    これは、「500m離れると完全に聞こえなくなる」という距離です。

    その下のグラフで「この距離の場合はこれくらいの音量」というのが設定できますね。


    これが簡単な3Dサウンドの設定かと思います。

    大体こんな感じで3Dサウンドは行けるんじゃないかな?

    以上です!あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Visual Studio 2019を導入してみた。 

    こんにちは。
    大坂です。

    あまりにもネタがなかったのでVisual Studio 2019の導入について。
    ダウンロードや新機能は以下で確認できます。
    Visual Studio 2019 の新機能

    Unityで使用する場合はインストール時に以下にチェックを入れる。

    ※クリックで拡大します。

    これでUnityの「Edit」-「Preference」を開けば選べるようになります。

    ※クリックで拡大します。

    ついでに上の新機能に載ってないやつで便利そうだったのをちょっとだけ。

    CodeLens機能。デフォルトで有効になってるのですぐ気づきますが。
    メソッドなどの参照個数をコード上に出してくれるやつです。
    クリックしたらどこで使ってるかとか使用箇所に飛ばしてくれる機能もついてます。


    クリックするとこんな感じです。


    邪魔で消したければ、「ツール」-「オプション」を開いて、
    「テキストエディター」-「すべての言語」-「CodeLens」のチェックを外せば消えます。


    もう1個。
    コピーの履歴から貼り付けができるみたいです。
    ctrl+shift+vを押すとコピーしている履歴から貼り付けができます。


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

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】DoTweenのDoRotateで360度回そうとしたときに回らないやつ。 

    こんにちは。

    TGS皆さまお疲れ様でした。
    毎年いってましたが、今年はいかなかった坂内です。

    デジゲーの参加サークルリストも公開されましたね。


    そしてもちろんデジゲーは客として遊びにいきます。


    Unityの簡単なお話。

    DoTweenでCubeをクルクル回そうと思い、こんなコードを書きます。


    using UnityEngine;
    using DG.Tweening;

    public class Test0917 : MonoBehaviour
    {
    [SerializeField]
    Transform cubeTran;

    void Start()
    {
    cubeTran.DORotate(new Vector3(0f,360,0f), 2f).SetLoops(-1, LoopType.Restart).SetEase(Ease.Linear);
    }
    }





    しーーーーーん・・・・・


    全然回りません。

    こんなことありませんか?

    実はこれこんなコードに変えると回るようになります。


    using UnityEngine;
    using DG.Tweening;

    public class Test0917 : MonoBehaviour
    {
    [SerializeField]
    Transform cubeTran;

    void Start()
    {
    cubeTran.DORotate(new Vector3(0f,360,0f), 2f, RotateMode.FastBeyond360).SetLoops(-1, LoopType.Restart).SetEase(Ease.Linear);
    }
    }






    ね。

    デフォルトではRotateMode.Fastになっているらしく、こちらは対象の角まで早い方に回るといった感じでしょうか?

    ターゲットの角度が360度なので、0度から360度まで最短ルートで回転し、360度以上は回転しないようです。

    RotateMode.FastBeyond360は、0度から360度までちゃんと回転し、360度以上でも回るようです。


    って感じで、今日は簡単ですが、DoTweenのDoRotateでオブジェクトを回転する方法でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Math.Roundで特定の桁を丸めたいとき。 

    こんにちは。
    大坂です。

    以前もMathf.Roundについては書きましたが、特定の桁で丸めたいときとか、前の記事でやってなかったこととか。
    【Unity】Mathf.Roundを使ったときの悲しみ

    まずは前の記事でやらなかったこと。
    Mathf.Floor使って対策しましたがそんなことはしなくても良かったです。。
    MathfではなくMathを使ってやる感じですね。
        Debug.Log(Math.Round(1.5f,MidpointRounding.AwayFromZero));
    Debug.Log(Math.Round(2.5f,MidpointRounding.AwayFromZero));

    「MidpointRounding.AwayFromZero」を引数につけてあげると偶数には寄せなくなります。
    結果です。

    ちゃんと偶数に寄せられないで四捨五入されますね。

    特定の桁で丸めたいときは引数に丸めたい桁数を入れるだけです。
    こんな感じ。
        Debug.Log(Math.Round(1.25f,1,MidpointRounding.AwayFromZero));
    Debug.Log(Math.Round(1.125f,2,MidpointRounding.AwayFromZero));

    結果。

    ちゃんと指定した桁までで結果が得られます。

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

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】プレハブを使ってオブジェクトを好きな場所に出す方法。位置調整とかめんどいっすよね・・・・ 

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

    今日は台風15号のせいで寝不足でございます。

    さてUnityの話。

    出したい場所にオブジェクトを出す方法について。

    【前提】
    [画面に出す石の絵のプレハブ]



    石のSpriteをつけたuGUIのImageプレハブです。

    [画面構成]


    [SpawnManager.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class SpawnManager : MonoBehaviour
    {
    [SerializeField]
    Image stonePrefab;
    [SerializeField]
    Transform canvasTran;
    }



    今はまだこれだけ。


    【出したい場所にオブジェクトを出す方法 其の1】
    座標をそのまま書いちゃう方法。


    using UnityEngine;
    using UnityEngine.UI;

    public class SpawnManager : MonoBehaviour
    {
    [SerializeField]
    Image stonePrefab;
    [SerializeField]
    Transform canvasTran;

    Vector2[] positions = {
    new Vector2(100f,100f),
    new Vector2(-130f,-250f),
    new Vector2(200f,250f)
    };

    private void Start() {
    foreach(Vector2 posi in positions) {
    Image img = Instantiate(stonePrefab, canvasTran, false);
    img.gameObject.transform.localPosition = posi;
    }
    }
    }





    なんかポジション書くのもいいんだけど、どこに出すのかの座標をいちいちやるのはめんどいですよね。
    仕様でちゃんと座標指定されているのならばあれですが・・・
    あんまり数値をコードに書きたくないっすね。

    positionをpublicにしてアサインするのも手ですが。


    【出したい場所にオブジェクトを出す方法 其の2】
    出したい座標にオブジェクトを置いて出す方法。




    こんな感じに、オブジェクトを出したい場所に空のGameObjectを置きます。

    [SpawnManager.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class SpawnManager : MonoBehaviour
    {
    [SerializeField]
    Image stonePrefab;
    [SerializeField]
    Transform canvasTran;

    [SerializeField]
    Transform[] trans;

    private void Start() {
    foreach(Transform tran in trans) {
    Image img = Instantiate(stonePrefab, canvasTran, false);
    img.gameObject.transform.localPosition = tran.localPosition;
    }
    }
    }


    コードをこんな感じにいじります。




    Transformをそれぞれアサインします。

    これで実行すると、先ほど置いた空のGameObjectの場所にImageのオブジェクトが出ます。


    という感じで、大体この2パターンを主流に使ってます。
    どちらかといえば最近は2番目の方が多いかな。

    これで好きな場所にオブジェクトが出せますね!

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】相対パスから絶対パスが欲しいとき 

    こんにちは。
    大坂です。

    ツールを作っていてファイルの相対パスから絶対パスが取得したかったので方法のご紹介。
    System.IO.Path.GetFullPathを使うだけなのですごい簡単なんですけどね。

    こんな感じで書くだけです。
        string path = "Assets/test/test.txt";
    Debug.Log(System.IO.Path.GetFullPath(path));
    結果


    ということで何かで使うかもしれませんね!
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ゲームで、キャラの状態異常とかを付けてみよう!バフ・デバフなどの効果をComponentで管理してみたよ。 

    こんにちは!坂内っす。

    UnityでRPGやアクションゲーム等のバフ・デバフ的なものを作ろうと思った時に、こうやったよーって話。

    まずは、状態クラスのベースを作りました。
    簡易版ですけどね。

    【PlayerConditionBase.cs】

    using UnityEngine;

    public class PlayerConditionBase : MonoBehaviour
    {
    protected bool isSetUp = false;
    protected PlayerController pController;
    float endTime;
    float timer;

    public virtual void SetUp(PlayerController pcon, float effectiveTime) {
    pController = pcon;
    endTime = effectiveTime;
    isSetUp = true;
    ProcStartCondition();
    }

    private void Update{
    if(!isSetUp){
    return;
    }
    timer += Time.deltaTime;
    if(timer >= endTime){
    ProcAfterEndCondition();
    Destroy(this);
    }
    }

    /// <summary>
    /// 状態異常が開始する時に行う処理
    /// </summary>
    public virtual void ProcStartCondition() {
    }

    /// <summary>
    /// 状態異常が終わる時に行う処理
    /// </summary>
    public virtual void ProcAfterEndCondition() {
    }
    }



    とりあえずこのクラスの子供を対象オブジェクトにくっつけたとして、すぐに動作しないようにisSetUp変数を持たせています。

    あ、キャラにはPlayerControllerが付いているの前提の話なので、Playerだとか自分のクラスに置き換えてくださいね。

    SetUpをすることで、引数で指定したタイマーが動き、effectiveTimeを越すと消える仕組みです。


    上記クラスを踏まえて、一定時間足が遅くなるクラスを作ってみました。

    【PlayerConditionSlowMovement】

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

    public class PlayerConditionSpeedUp : PlayerConditionBase
    {
    [SerializeField, Header("移動速度 効果倍率")]
    float moveSpeedEffectRate;

    public override void SetUp(PlayerController pcon, float effectiveTime) {
    base.SetUp(pcon, effectiveTime);
    }

    public override void ProcStartCondition() {
    pController.speedRate = moveSpeedEffectRate;
    }

    public override void ProcAfterEndCondition(){
    player.speedRate = 1.0f;
    }
    }



    【PlayerController.cs】


    PlayerConditionSpeedUp conditionSpeedUp = AddComponent<PlayerConditionSpeedUp>();
    conditionSpeedUp.SetUp(this, 5f);




    こんな感じでAddComponentをしてあげれば、SetUpで指定した時間の間プレイヤーのspeedRateが変動できます。

    これを使えば、色々な状態異常ができそうですよね!

    色々素敵なやり方はあると思いますが、今日はキャラの状態異常にComponentを付けてあげる方法でした。
    これなら状態異常毎にクラスを作るから管理が簡単かも??

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0