ぱふの自由帳

週2更新目指す技術ブログ。メインはUnity。最近、競プロ始めましたー!良ければフォローお願いします(`・ω・´)

unity1week放送アーカイブ置き場(仮)

おしらせ

このページは『unity1week全クリ放送』のアーカイブへのリンクを一時的に載せています。放送が全部終了したら、改めてちゃんとした記事に直す予定です!

アーカイブリンク集

1日目

途中でPCを再起動したので、2つに分かれています。

前半
【Unity1week】久しぶりにやるぞーーー!!!【初日】 - YouTube

後半
【Unity1week】久しぶりにやるぞーーー!!!【初日】 - YouTube

2日目

【Unity1week】もしや、余裕で終わるんじゃ??【2日目】 - YouTube

3日目

【Unity1week】今日で半分終わるぞ!【3日目】 - YouTube

【Unity】コンポーネントをスクリプトから追加or削除する方法

やりたいこと

タイトルのように、
スクリプトからコンポーネントを追加or削除』したい!

こうする

-- 追加 --
gameObject.AddComponent<コンポーネント名>();
-- 削除 --
Destory(GetComponent<コンポーネント名>);

補足

コードの例は、コンポーネントの追加or削除を ”スクリプトがアタッチされたGameObject” に対して行う場合を想定しています。なので、他のGameObjectに対して操作を行う場合は書き換えましょう。

おわり

Twitterフォロー歓迎です...(`・ω・´) ヨロシク!

【C#】エディタで「possible loss of fraction」の警告が出た時

possible loss of fractionの意味

取り敢えず、googleで翻訳してみましょう。

google『可能な分数の損失』

うーん...意味が分からない...。自分で訳すしかないですね。笑
......
......
『分数の損失が起こりうる』という意味かな。

原因

C#では割り算の際にint / intintになります。(切り捨て)
10 / 4という計算をすると2.25ではなく2になるわけです。

この計算をfloatdoubleの変数に代入したり、floatdoubleを引数に取る関数に渡したりすると、possible loss of fractionという警告が出るわけです。

解決方法

int / intの割り算を故意的に行っている場合は問題ないと思います。
故意的でない場合は(float) int / intのようにキャスト変換してあげれば問題ないと思います。

おわり

Twitterフォロー歓迎です...(`・ω・´) ヨロシク!

【C#】数値を表示する際に0で埋める方法

こういうことがしたい

63と表示するのではなく063のように指定した桁数まで0で埋めたい!

こうする

int speed = 63;
string s = "";

// 方法1
s = String.Format("時速{0:D3}kmです", speed);

// 方法2
s = String.Format("時速{0:000}kmです", speed);

// 方法3 -C#6.0以上-
s = $"時速{speed:D3}kmです";

// どの方法でもsは「時速063kmです」となる。

ちょっと解説

キモは{A:X}となっている部分です。

Aの部分はFormatでいつも指定している要素を表す番号です。
Xの部分でD3000という風に0埋めの桁数を指定出来ます。

おわり

Twitterのフォロー歓迎です...(`・ω・´) ヨロシク!

【イベント】今回もやります!Unity1週間ゲームジャムの投稿作品を全てプレイ!

---お知らせ!---

ゲームを愛する方々!アノ季節がやってきましたね!
「...なんのイベント?」ですって...?

Unityroomの1週間ゲームジャムのことですよ!


f:id:PafuOfDuck:20180831191721p:plain
「Unityroom?ナニソレ?」という方はコチラ
「1週間ゲームジャム?ナニソレ?」という方はコチラ




と、いうことは...?!


そうです!
今回もやっちゃいます!!

f:id:PafuOfDuck:20180831173220p:plain

(今回はバナー広告まで作って気合入れました...笑)



---イベント内容---

私(ぱふ)心身を削りながらたったの1週間でイベント期間中に投稿された全てのゲーム(※1)の攻略挑戦するイベントです!

(※1)遅れて投稿されたゲームも放送期間内であれば含む

攻略の様子についてはYoutube上で生放送を行う予定です!



---開催期間---
09/10(Mon) ~ 09/16(Sun)

平日:20:00~24:00(予定)
土・日:10:00~24:00(予定)



---皆様にお願い---

放送当日の放送開始前にYoutubeの放送URLをTwitterでお知らせします。
放送期間の間、お手数ですがTwitterのフォローをお願いします!

フォローはココをクリック



---さいごに---

「自分のゲームが実際にプレイされているのを見たい!」
「他の人のアイディアを見たいけどプレイが面倒!」
「視聴者同士で意見をぶつけ合いたい!」 etc...

という方は是非、放送にお越しください!
私もコメントが盛り上がっている方がモチベーションも数倍以上になります!!なので、コメントもしてくださいね!笑

それでは、放送当日にお会いしましょう!ノシ

眺めてコピペするだけ!Odin便利属性7選!

いきなりですが注意!

「Odin?何それ?」って思った方!
実はコレ、二部構成の後半記事です。

前半記事(きつねうどんさん担当)を読んでなくても大丈夫な構成になっていますが、『Odinとは?』について解説されているので是非読んでみてください〜!

qiita.com

はじめに

『Unity アセット真夏のアドベントカレンダー 2018』も本日が最終日! 皆さんも最終日なので読み疲れて来たんじゃないでしょうか?

なので...最終日はOdinの便利な属性たちを《Gif動画+サンプルコード》でお届け致します! 眺めて便利なものをコピペするだけ!最終日に相応しいラクだと思いませんか?!

簡単に追加できるのに便利!というものを全属性から7つ選びました! Unityを扱う全員が使えるかどうかを第一に考えているので、是非ご覧下さい!

では、早速紹介していきますよー!

便利属性7連発!

その1:アタッチ間違いを回避だ!

「Prefabをアタッチしようとしたら、Scene上のオブジェクトをアタッチしてた!」 そんな方はコチラ↓↓↓

f:id:PafuOfDuck:20180830031439g:plain

  • Asset Only Obj
    • AssetであるPrefabObjectはアタッチできる
    • AssetではないSceneObjectがアタッチできない
  • Scene Only Obj
    • Scene上にあるSceneObjectはアタッチできる
    • Scene上にないPrefabObjectはアタッチできない

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [AssetsOnly]
    public GameObject AssetOnlyObj;
    
    [SceneObjectsOnly]
    public GameObject SceneOnlyObj;
}

その2:アタッチし忘れを回避だ!

「Inspector上でアタッチし忘れてた!これがバグの原因の元に...」 そんな悲しい思いをしたことがある方はコチラ↓↓↓

f:id:PafuOfDuck:20180830031630g:plain

何もアタッチされていないと、エラーが出ているのが確認できると思います!

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [Required]
    public GameObject NeedObj;
}

その3:試作でGUIのボタン作るの面倒だ!

「『ボタンが押されたら〇〇』の動作を確かめるのにSceneに仮のボタン配置は面倒!」 そんな方はコチラ↓↓↓

f:id:PafuOfDuck:20180830031734g:plain

もちろん、ゲームを再生中にも有効なのでGUIのボタンなしでテスト可能です!

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    public int Number;
    
    [Button]
    private void AddNumber()
    {
        Number++;
    }
}

[Button]の配置の派生バージョンとして
[InlineButton]
[ButtonGroup]
[EnumToggleButtons]
があるので、気になる方は使ってみてください。

その4:要素に見出しを付けるのだ!

「見出しをつけて、変数を見やすくしたい!」 そんな方はコチラ↓↓↓

f:id:PafuOfDuck:20180830031813p:plain

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [Title("Player")]
    public string PlayerName = "PAFU";
    public int PlayerAge = 80;
    
    [Title("Enemy", "SubTitle", bold: false, horizontalLine: false, titleAlignment: TitleAlignments.Centered)]
    public string EnemyName = "MODOKI";
    public int EnemyAge = 10;
}

追加で設定できる要素は以下の4種類です。
・SubTitle:サブタイトルを設定できます。
・bold:太さを設定できます。デフォルトはtrueです。
・horizontalLine:水平線の有無を設定できます。デフォルトはtrueです。
・titleAlignment:Titleの表示場所を設定します。

その5:要素の名前を分かりやすくするのだ!

「コードでStage Numを定義したけど、Inspectorでは現在のステージと表示したい!」 という方はコチラ↓↓↓

f:id:PafuOfDuck:20180830031832p:plain

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [LabelText("現在のステージ")] public int StageNum;
}

「Inspector上の名前を動的に変更したい!」 そんな方に追加情報!

Odin05.gif

コードも置いておきます!

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{   
    [LabelText("$text")] public string text = "自由な変数名";
}


敵キャラが沢山いて、キャラの名前を動的に変更したい時に便利なのかも??

その6:ドロップダウンを使って値をセットするのだ!

「予め登録しておいた値をInspectorからセットしたい!」 という方はコチラ↓↓↓

f:id:PafuOfDuck:20180830031922g:plain

GIF動画でも分かるように型によっては検索機能も付いています。

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [ValueDropdown("speedArray")]
    public int Speed;

    private int[] speedArray = { 10, 20, 30 };
}

応用として、値に名前を付けて設定しやすく出来ます! (コードは公式のやつ持って来ちゃいました。)

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [ValueDropdown("myVectorValues")]
    public Vector3 MyVector;

    // The selectable values for the dropdown, with custom names.
    private ValueDropdownList<Vector3> myVectorValues = new ValueDropdownList<Vector3>()
    {
        {"Forward", Vector3.forward },
        {"Back",    Vector3.back    },
        {"Up",      Vector3.up      },
        {"Down",    Vector3.down    },
        {"Right",   Vector3.right   },
        {"Left",    Vector3.left    },
    };
}

↑のようにコードを書けば... ↓のように設定できます...!

f:id:PafuOfDuck:20180830031945g:plain

その7:インフォメーションを表示したい

「Inspector上にもメモを残したい!」 という方はコチラ↓↓↓

f:id:PafuOfDuck:20180830032115p:plain

ちなみに[InfoBox("お知らせ", InfoMessageType.XXX)]と書くことで、枠内のアイコンが変更できます。

f:id:PafuOfDuck:20180830032143p:plain

上から
InfoMessageType.None
InfoMessageType.Info(デフォルト)
InfoMessageType.Warning
InfoMessageType.Error
に設定したものです。

サンプルコード

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    [InfoBox("ここにお知らせが書けるよ!")]
    public int Num;
}

インフォメーションを出すかどうかをbool値で管理出来ます。

using UnityEngine;
using Sirenix.OdinInspector;

public class OdinSample : MonoBehaviour
{
    public bool IsDisplay;
    
    [InfoBox("ココに情報を書けるよ!", "IsDisplay")]
    public int Num;
}

↑のようにコードを書けば... ↓のようにインフォメーションを表示or非表示に出来ます...!

f:id:PafuOfDuck:20180830032309g:plain

おわり

バババッ!と7つ紹介しました!気になる使い方はあったでしょうか? Odinを持っているかに関わらず参考になった箇所があれば嬉しく思います!

大トリですが、締めもなくサッと終わりますよ!
執筆者の方々&読者の方々お疲れ様でしたー!!!

【Unity】EventTriggerを使ったらScrollViewが機能しなかった話

はじめに

Unityのデフォルト機能であるScrollViewを使っているときに下のような問題にぶち当たりました。

  • ButtonだとScrollViewは動く
  • EventTriggerをアタッチしたオブジェクトだとScrollViewが動かなくなる

参考GIF↓↓↓(Button以外はEventTriggerがアタッチされています) f:id:PafuOfDuck:20180818214959g:plain

Buttonはイベントの発行タイミングをイジれないので使いたくない...。
なので、EventTriggerを使いたいのに...こんなのヒドい!

となりまして、解決したのでメモを残しておきます〜。

代替案

Unityの内部を理解していないので詳しくは分かりませんが、あるオブジェクトAにEventTriggerを使ってしまうとAの上ではScrollViewのスクロールが無効化(当たり判定が貫通しなくなる?)されるようです。

そこで、EventTriggerと同じ機能を自前で実装することで解決します。
(おそらく、厳密には同じではないです。同じだとScrollViewが機能しませんから笑)

実装

今回は例として、EventTriggerのPointer Clickと同じ機能をつけたいと思います。

以下のスクリプトを実装して、EventTriggerの代わりにアタッチしましょう。

using UnityEngine;
using UnityEngine.EventSystems;

public class ContentClickListener : MonoBehaviour, IPointerClickHandler {
    
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("クリックされたよ。");
    }
}


すると、以下のGIFのようにScrollViewのスクロールを妨げずにEventTriggerと同じ機能が使用可能になります!パチパチ!!

f:id:PafuOfDuck:20180818221138g:plain


今回はPointer Clickを実装したかったのでIPointerClickHandlerを実装してOnPointerClickメソッドを実装しましたが、他のイベントも【基本的に】同じように実装できます。

GIFを見ると、ドラッグするとクリックが無効化されていますね。これはUnityの仕様で、ドラッグが始まるとクリックがキャンセルされるようです。(気になる方はググってみてください)

おわり

EventTrigger (EventSystem側?) でも当たり判定を貫通させるパラメータありそうだけど見つからなかったので、この方法で押しました〜。
知っている方がいましたら教えてください!

Twitterのフォロー歓迎です...(`・ω・´) ヨロシク!