C# WindowsForm でコンソールを開く

#はじめに WindowsFormアプリのテンプレートだとConsole.Writelineをうっても コンソールが呼ばれないらしい。

呼ぶ方法

調べると、下記サイトのやり方でコンソールが呼べた。

www.wareko.jp

おわり

なんでよべないか、理由はよくわからないので 時間があるときに勉強しておこう

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さんの記事のやつを参考にさせていただく。

shibuya24.info

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をデフォルトから変える。日付つけるとか。

IphoneMACをつなげて認識させる

参考

困ったときのオオバさん。 参考というか、書かれてる通りにやりました。 shibuya24.info

エラー2

内容

MapFileParser.sh: Permission denied Command PhaseScriptExecution failed with a nonzero exit code

参考

qiita.com

対処

参考サイトに従ってMapFileParser.shにコマンドプロンプトで権限を付与する。

エラー3

内容

Build input file cannot be found:/UserLaunchscreen-iPhone.storyboard

対処

プロジェクトファイルにLaunchscreen-iPhone.storyboard,xmlとLaunchscreen-iPad.storyboard,xmlというファイルがあるので.それぞれxmlを削除する

参考

stackoverflow.com

ビルド後エラーじゃないけど

qiita.com

カスタムボタンを利用する

カスタムボタンの使い方

使い方

①ボタンの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に合わせたい

下の画像のような場合


対処方法

CanvasのレンダーモードをScreenSpace Cameraにして
Render CameraにMain Cameraをドラッグアンドドロップ

対処後

MainCameraの大きさと同じ大きさになった