C# WindowsForm でコンソールを開く
#はじめに WindowsFormアプリのテンプレートだとConsole.Writelineをうっても コンソールが呼ばれないらしい。
呼ぶ方法
調べると、下記サイトのやり方でコンソールが呼べた。
おわり
なんでよべないか、理由はよくわからないので 時間があるときに勉強しておこう
Unityのイベントについてのメモ
はじめに
Unityのイベントについてちゃんと理解していないので 勉強したり、テストコード書いてなんとなくわかったことをメモる
調べて分かったことを雑多にメモ
・イベントの定義の仕方
public UnityEvent OnClickTestButton=new UnityEvent();
OnClickTestButtonという名前のイベントを定義。newしてインスタンス化が必要みたい。
・行いたい処理の登録と呼びかた
実際に行いたい処理はメソッドに書いてAddListener()をつかって登録する。 また、OnClickButton.Invoke()とすると代入したメソッドを呼べる。
TestVoid()をOnClickButtonに登録して、そのあとInvokeで呼ぶコードを書いてみる。
void TestVoid() { Debug.Log("Test"); } void Start() { OnClickTestButton.AddListener(TestVoid); OnClickTestButton.Invoke(); }
・結果 TestVoidがちゃんと呼ばれていることが分かった。
引数ありのUnityEventについて
UnityEventは引数がないメソッドしか代入できない。 引数が必要な場合はUnityEvent<T>を継承したクラスを定義する必要がある。
public UnityBoolEvent OnClickBoolTest = new UnityBoolEvent(); public sealed class UnityBoolEvent : UnityEvent<bool> { //中身は記述の必要なし }
例えば上記のようにすると、Boolを引数にした関数を登録できるUnityBoolEventを使用できる。
UIに初めから実装されているEvent
例えばButtonクラスにはOnClickというUnityEventが初めから実装されている。 OnClickはInvokeでも呼べるが、Unity上でUIのボタンをクリックすることでも呼ばれる。 UIのEventはUnity上での決められた操作によって呼ばれる。
またOnClickは、引数と戻り値がないメソッドのみを登録できる。 これはEventごと異なるので、確認する必要あり。
1つのScriptに2つクラスを書いたとき どうなるかメモ
はじめに
スクリプトに複数のクラスを書いたとき、その複数のクラスのインスタンスは生成されるのか、AwakeとかStartはよばれるのか、 どうなっているのかよくわからなかったのでテストしながら確認してみるメモ
やってみること
オブジェクトにTest.csスクリプトをアタッチ。
Test.csの中身。TestとTest2の2つのクラスがある、それぞれStart関数でlogを出すようにしている。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { // Start is called before the first frame update void Start() { Debug.Log("Test"); } } public class Test2 : MonoBehaviour { private void Start() { Debug.Log("Test2"); } }
結果
Testのみlogが表示される。
考察
TestしかStart関数が呼ばれなかった。 scriptのファイル名と同じ名前のクラスしか、インスタンス生成されない・・・?
やってみること2
Test2のインスタンスは生成されていないのかGetCompornentでみてみる。
TestControllerクラスを同じオブジェクトにアタッチ
TestController.csの中身
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestController : MonoBehaviour { // Start is called before the first frame update void Start() { Debug.Log(GetComponent<Test>()); Debug.Log(GetComponent<Test2>()); } }
結果
Test2はNull
考察
Test2はnullだった。なのでScriptの名前と同じクラスのみインスタンスが生成されるっぽい。
オブジェクトをクリックしたときに処理を発生させる
はじめに
脱出ゲームなんかを作っていると、オブジェクトをクリックするとイベントが発生するみたいな処理が必要になります。 忘れるので、やり方をメモっときます。
例えば、下の画像のPCをクリックすると、何かイベントが発生するようにしたいとします。
オブジェクトにコライダーをつける
オブジェクトにコライダーをアタッチします。
CameraにPhisics RayCasterをアタッチ
クリックしたときにイベントが発生するようにScriptを作成
スクリプトはoobaさんの記事のやつを参考にさせていただく。
public class ZoomButton :SetUpButtonAbst { public override void PushButtonClickAction() { Debug.Log("Pushed"); } public override void PushButtonDownAction() { // throw new System.NotImplementedException(); } public override void PushButtonUpAction() { //throw new System.NotImplementedException(); } internal override void ButtonSetUp() { } }
[RequireComponent(typeof(CustomButton))] public abstract class SetUpButtonAbst : MonoBehaviour { public abstract void PushButtonClickAction(); public abstract void PushButtonDownAction(); public abstract void PushButtonUpAction(); internal abstract void ButtonSetUp(); }
public class CustomButton : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler { public System.Action onClickCallback; SetUpButtonAbst _setupButton; // タップ public void OnPointerClick(PointerEventData eventData) { onClickCallback.Invoke(); } // タップダウン public void OnPointerDown(PointerEventData eventData) { _setupButton.PushButtonDownAction(); } // タップアップ public void OnPointerUp(PointerEventData eventData) { _setupButton.PushButtonUpAction(); } private void Start() { _setupButton = GetComponent<SetUpButtonAbst>(); if (_setupButton != null) { this.onClickCallback = () => { _setupButton.PushButtonClickAction(); }; } } }
ZoomButtonスクリプトをオブジェクトにアタッチする
クリックするとPushedとでたのでOK
初めてのXcodeでのビルドで手間取ったことメモ
エラー1
エラー全文
Failed to create provisioning profile.
There are no devices registered in your account
on the developer website. Plug in
and select a device to have Xcode register it.
対処
・Bandle idenfityをデフォルトから変える。日付つけるとか。
参考
困ったときのオオバさん。 参考というか、書かれてる通りにやりました。 shibuya24.info
エラー2
内容
MapFileParser.sh: Permission denied Command PhaseScriptExecution failed with a nonzero exit code
参考
対処
参考サイトに従ってMapFileParser.shにコマンドプロンプトで権限を付与する。
エラー3
内容
Build input file cannot be found:/User略Launchscreen-iPhone.storyboard
対処
プロジェクトファイルにLaunchscreen-iPhone.storyboard,xmlとLaunchscreen-iPad.storyboard,xmlというファイルがあるので.それぞれxmlを削除する
参考
ビルド後エラーじゃないけど
カスタムボタンを利用する
カスタムボタンの使い方
参考 URL
使い方
①ボタンのUI Imageを作成
②スクリプトを作成
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class CustomButton : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler { public System.Action onClickCallback; // タップ public void OnPointerClick(PointerEventData eventData) { onClickCallback.Invoke(); } // タップダウン public void OnPointerDown(PointerEventData eventData) { } // タップアップ public void OnPointerUp(PointerEventData eventData) { } }
onClickCallbackはActionデリゲート。このデリゲートにボタンを押した処理を
格納する。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LeftButton : MonoBehaviour { private CustomButton _bt; private void Start() { _bt = GetComponent<CustomButton>(); //_bt.onClickCallback = () => //{ // PushButtonAction(); //}; } private void Update() { _bt.onClickCallback = () => { PushButtonActioon(); }; } public void PushButtonAction() { Debug.Log("Push"); } }
この2つのスクリプトを、ボタンにしたいImageに張り付ける。
Imageをクリックすると、 PushButtonAction()関数が呼ばれる。
UIのキャンバスの大きさをMainCameraに合わせたい
下の画像のような場合
対処後
MainCameraの大きさと同じ大きさになった