隣のデスク覗く言語さん

unityとかc#とかの勉強・発見ログです.参考まで.

publicを利用してGameObjectをコンポーネント上で操作できるようにする

はじめに

前回の続きみたいなものです.

前回はpublic指定した値をコンポーネント上で操作する機能について説明しました.
今回は数値ではなくヒエラルキー上にあるオブジェクトも操作できることについて説明します.

publicでGameObjectの変数を宣言

まず,適当に空のオブジェクト(Create Empty)を用意して,New Scriptをコンポーネント上で作成します.今回はそれをGameobject_rotationという名前にしておきます.

 

f:id:gengoshori:20180111134023j:plain

この時点では何もありません.スクリプトを下記のように編集します.

Gameobject_rotation.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Gameobject_rotation : MonoBehaviour {
    //publicで指定したオブジェクトを回転させるだけのスクリプト
 
    public GameObject rotation_t;
 
    void Update () {
        rotation_t.GetComponent<Transform>().Rotate (3, 2, 1);
    }
}
 

今回も回転させるだけのスクリプトですが,違いはpublic指定している変数rotation_tの方がGameObject型であるということです.
rotation_tのTransformというコンポーネントをGetして,Transformの中のRotateを(3,2,1)にしてね,という意味のスクリプトをUpdate()に記述します.

こうすると,コンポーネント上ではどうなっているかといいますと

f:id:gengoshori:20180111134109j:plain

前回数値が入力できたかのように,Gameobjectを入力できます.変数名はRotation_tですね.

GameObjectの入力の方法は,2種類
ヒエラルキー上のオブジェクトをドラッグ・アンド・ドロップ
②右側の◎みたいなマークをクリックしてオブジェクトを選択

今回は②のパターンでやってみます.[None(Game Object)]の右側にある◎みたいなものをクリックすると

 

f:id:gengoshori:20180111134115j:plain

ヒエラルキー上にあるオブジェクトが一覧で表示されます.Assetで色々ダウンロードしていたらもっとたくさん出てきます.今回は予め生成しておいたCylinderを選択します.Cylinder…つまりは円柱ですね.

 

f:id:gengoshori:20180111134124j:plain

選択できました.これで,スクリプト上ではRotation_tはコンポーネント上にあるCylinderになります.

実際の挙動

この状態で実行しますと

f:id:gengoshori:20180110233114g:plain

 

やったぜ動いたぜ.
このようにしてヒエラルキー上にあるオブジェクトを視覚的に指定して,スクリプトに載せることができます.直感的にやりやすい…

 

まとめ

publicでGameObjectを指定することでヒエラルキー上のオブジェクトを操作することができる.

工夫次第では,同じスクリプトで同じ挙動をさせたいけどオブジェクトが異なるものを,同じスクリプトで賄うことができます.しかも視覚的に確認できる.良いですね.

Unity 2018.1 beta公開

 

はじめに

表題のとおりです.

2018年最初のUnityバージョンリリースが発表されました.

個人的に関心が強いので,バージョンアップ記事の突発的レビューです.

 

Unity 2018.1 beta 内容

blogs.unity3d.com

大きな変更点は4点でしょうかね.

GPUレンダリングの強化

・視覚的なShader作成ツールのサポート

C#Job Systemの追加機能

・旧パーティクルシステムの段階的な廃止

 

個人的には

Wii Uサポートの廃止

・Mono Developmentサポートの廃止

これが関心ありますね.

 

以下,要約と意見です.

 

GPUレンダリングの強化

そうそう,こういうのいいですよね.GPUレンダリングの発展はタブレットPCなど小型端末でも今後ものすごい伸びるであろう(と個人的に思っている)コンテンツですから,この辺のサポートを公式に発表するのは素敵なことです.

 

・視覚的なShader作成ツールのサポート

HP上ではShader Graph Toolとなっていますが,AnimationツールのShader版の認識で良いと思います.

スクリプトだけの記述では難しいところを視覚的にサポートする地盤が固まりつつあります.ある意味,個人アプリ開発者としては,敷居を低くするものであり,広まる意味では良いような,それでいいんかいな,という気持ちです.

だってスニペットみたいなツールばっかりでシステム作っても,それはエンジニアと言えるのか,って思っちゃうじゃないですか.

 

C#Job Systemの追加機能

申し訳ない,これはあまりアンテナ張ってないです.でも本格的に取り組もうとしている?

以下,憶測を含みます.

マルチスレッド対応ですが…並列化計算の関心はGPUに合わせて関心が高まっているわけですね.視覚的なプログラミングが多い印象のUnityでも求められることなんですねえ.

要は,レンダリング以外での並列化計算の効率化みたいなものですから,マルチエージェントとか,レンダリングの裏で動くアルゴリズムを高速化する意図ですかね…

 

・旧パーティクルの段階的な廃止

Shurikenが一般化しつつありますから,まあこれは妥当では.

むしろ,Shurikenの発展に期待します.パーティクルは,演出からシミュレーションまで工夫次第で面白くなりますから.軽くて汎用性の高いものであるべきです.

 

Wii Uサポートの廃止

完全にNintendo Swichに移るわけです.当然ですが,時の流れを感じて私は切ないです.

Unity発のSwichソフトウェアは,増えた…かどうかは知りませんが,有名企業やコンテンツで「Unityで作ったぜ」とニュースを見るようになりましたからね.

今後もこういったが発展することを望みます.個人的にはWebGLの発展を望みますが,イマイチですね.やっぱりWebGLスマホコンテツとの相性がよくない感.

 

・Mono Developmentサポートの廃止

これは驚き.ノーマークでした.Visual Studioメインでやると…

いや,いいんですけどね,どうも個人的にVisual Studio使いにくんですよ…個人的にですよ?(Mono Developmentが使いやすいとは言わない)

いっそUnity発のツール作れば良いのでは,と思ってしまいます.VisualStudio重すぎません?超軽量なツールのほうが私は嬉しいです.

 

まとめ

2018年Unityが驚きと面白みのあるソフトウェアとなって,更なるグッドニュースを望みます.グッドラック!

 

 

privateとpublicの違いについて図付きで説明

はじめに

privateとpublicはunity初見には意味不明です.
でも視覚的に見れば「なるほど」となります.今回はその例です.
 

本題

privateとpublic
publicとしてa
privateとしてbを宣言してみます.
 
Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour {
    //オブジェクトを回転させるだけのスクリプト
 
    public float a;
    private float b=10.0f;
 
    void Update () {
        this.transform.Rotate (0, a, b);
    }
}
 
Test.csスクリプトはオブジェクトを回転させるだけの簡単なものです.
aとb,この二つがどのように異なるかです.
 
 
privateのbはコンポーネント上に表示されません.だけでなく,他のclassやスクリプトから呼び出すことできなくなります.
言うなれば,privateは文字通りプライベートで,そのスクリプト(class)でしか使わない変数にさせるのです.
 
一方,publicのaはコンポーネント上に表示されました.この数値をいじれば,スクリプトに影響します.
言うなれば,publicは文字通りパブリックで,そのスクリプト(class)以外でも干渉できる変数にさせるのです.
unity上では特にそれがコンポーネント上に表示されます.
これ,とても便利なのです.
数値だけでなく,任意のオブジェクトやファイルを引用することもできます.
 

実行例1

 
実行

f:id:gengoshori:20180110172509g:plain

 
x軸回転はしません.aは0なので.(gif画像が動いてなければ横回転しているのだと思ってください)
次に,コンポーネント上でaの値を10に変えて実行してみます.
 

実行例2

 
実行
 

f:id:gengoshori:20180110172533g:plain

 
(gif画像が動いてなければ斜め横回転しているのだと思ってください)
影響を及ぼしましたね.もちろんスクリプトを直接いじり,aの値を変えれば同じことができるわけですが,コンポーネント上でそれが編集できるのは強い.
デバッグなどにも使えそうです.
 

まとめ

 
private:変数を,そのスクリプト(class)でのみ使う指定をする
public:変数コンポーネント上で自由に扱うことできる指定をする
 
次回あたり,publicの更なる便利さを述べていきたいと思います.
 
 
 

Unityよくあるエラー〜"All compiler errors have to be fixed before you can enter playmode!"と “Please fix any compile errors and assign a valid script."〜

はじめに

私が苛まれたエラーランキングNo.1です.
そしてUnityへの数少ない苛立ちの一つです.
 

よくあるエラー

All compiler errors have to be fixed before you can enter playmode!:
意訳)プレイモード実行前に,全てのコンパイラエラーを修正する必要があります!
 
Please fix any compile errors and assign a valid script.:
意訳)コンパイルエラーを修正し,有効なスクリプトを指定してください.
 
実行時に出ます.このエラー見たときは「なんでじゃい」となるわけです.
原因:ネット上からスクリプトをコピペしたりする時によく発生します.
問題は超シンプル,多くの場合,スクリプトの名前が間違っているんです.要確認です.
 
コピペした時に変数名やらファイル名がミスっているなんていうときは,スペルミス,まあ不注意かなって思うわけですが…
 

Unityの苛立ちポイント

ここで本題の苛立ちポイント.
大文字小文字表示が「ある部分で理不尽」なんです.
 
コンポーネント名としての大文字小文字の差異
.csファイルなんかは,きっと皆さんローマ字で書きますが,大文字小文字のルールは人それぞれだと思います.
仮に,.csファイルの最初の一文字を小文字にしたとします.すると,混乱が起きます.
 
 
 
Obj_rotate.csは一文字目は大文字ですが,obj_rotate2.csは小文字です.しかし,コンポーネント名としてはどちらも大文字です.obj_rotate2.csのファイル名は小文字なのに…
 
これでは,普通にファイル名指定をミスるケースが出ます.
public変数として用意した”Temp”も,スクリプト中では”temp”で宣言しているんです.でも図中では,強制で大文字になってしまいます.
 
じゃあ大文字にしとくか,といって.csのスクリプトを下記のようにしたとします.
 
obj_rotate2.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Obj_rotate2 : MonoBehaviour {
    public  int temp;
    private int temp2;
 
    void Update () {
        this.transform.Rotate (5, 0, 0);
    }
}
 
スクリプトの中身は言いたいことと関係ないので気にしないでください.
 
仮にclass宣言部の
public class obj_rotate2 : MonoBehaviour {
public class Obj_rotate2 : MonoBehaviour {
と大文字にしようものなら
Please fix any compile errors and assign a valid script.
です.
 

結果

普通に混乱します.いや,混乱しました.
じゃあどうするの.答えは
「.csなどファイル名は大文字始まりにする」というくらいです.
まあこれくらいなら良いか,って思います.対策対策.
 
ですが,先程も言いましたが,変数名もコンポーネントとしての表示上は,大文字始まりなのです.
変数名まで一文字目を大文字にするのはなんだか違和感があります.
 
うーん.いい解決法無いものか.というか,コンポーネントとしての名称はいいとして,変数名の一文字目も大文字にするの勘弁してもらいたい…普通に間違える…
 
 

まとめ

All compiler errors have to be fixed before you can enter playmode!
Please fix any compile errors and assign a valid script.
が出たときに主に確認する場所
 
 
・ファイル名とclass宣言部の名称が合っているか確認
・大文字小文字の差異,スペルミスなど確認
プログラミング経験者ならスペルミスなんて日常茶飯事です.しょうもないミスでモチベーションを失ってはいけない.
 
教訓
c#のファイル名の一文字目は大文字推奨
 
 
参考まで.

初回

 

はじめに

テスト投稿です.

 

unityとかc#とかを勉強し始めて,困ったときに何かとはてなブログに行き着くことが多かったので,少し加担しようと思いました.

 

unityは日々目覚ましい進化,発展していると感じておりますゆえ,個人の開発者側からすると「なんでじゃい」というエラーに苛まれたりすること,多いかと思います(私がそうです).

 

同じつまづきを感じている方の参考になればと思いながら,ログ的な形で残していきます.

今回初回なので軽く.昨年末にリリースされたunity2017.3のリリースノートから個人的に気になる点をピックアップします.

 

unity2017.3 リリースノートより

unity3d.com

 

以下,上記URL引用含みます.

OSX: Removed support for targeting 32bit macOS applications. Replaced BuildTarget.StandaloneOSX* enums with BuildTarget.StandaloneOSX.

MacOSXでの開発環境において32bitはサポート外となったようです.近年では困りませんが,32bit排斥がどんどん迫っているなと感じます.

XR:〜

XR系の修正や機能追加が多いように感じました.旧来のVR〜というのは前回(2017.2.0f)から廃止されたと思いますので,統一して更に発展,といったところでしょうかね.

憶測になってしまいますが,AR,MR,VRを一緒くたにXRとしたのではないかと思います.定義はそれぞれ異なりますが,技術的な面やコード自体は似通う点多いようにも思うので,分ける方が効率悪くなりそうですし,いい流れではないかと思います(個人的な感想).

 

リリースノートは流し見すると意外と面白い新機能が見つかったりします.翻訳機使いながら見るといいと思います.

 

今後 

unityの初歩的なルールやら構築でつまづいた点,気づいた点をログにしたり,そのうちVRシステムでも公開できたら嬉しいです.

細々とやっていきます.

 

 

参考まで.