facebook twitter hatena line email

「Unity/Csharp/クラス」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
行2: 行2:
  
 
[[Unity/Csharp/クラス/アクセス修飾子]]
 
[[Unity/Csharp/クラス/アクセス修飾子]]
 
==クラスやプロパティ==
 
public class CanvasScript : MonoBehaviour {
 
private int cnt = 1;
 
void Start() {
 
Debug.Log("helloworld" + cnt);
 
Add(10, 15)
 
}
 
void Update() {
 
}
 
public int Add(int x, int y) {
 
return x + y;
 
}
 
}
 
 
メンバはpublicとprivateがあり省略するとprivateになる。
 
 
==単純クラス==
 
public class Animal {
 
private int footCnt = 4;
 
public void Init() {
 
}
 
public void SetFootCnt(int cnt) {
 
footCnt = cnt;
 
}
 
public int GetFootCnt(int cnt) {
 
return cnt;
 
}
 
}
 
 
==継承と基底クラスのメソッドへのアクセス==
 
base.を使う
 
 
abstract class Animal
 
{
 
    public virtual void Call()
 
    {
 
    }
 
}
 
class Cat : Animal
 
{
 
    public override void Call()
 
    {
 
        base.Call();
 
    }
 
}
 
 
==単純クラスインスタンス生成方法==
 
Animal animal = new Animal();
 
 
==オブジェクトクラスインスタンス生成方法==
 
GameObject gameObj = new GameObject();
 
ComScript sc = gameObj.AddComponent<ComScript>();
 
sc.Exec();
 
 
ComScriptはMonoBehaviourを継承している必要がある。
 
 
継承てない場合は、以下エラーが出る
 
error CS0311: The type `ComScript' cannot be used as type parameter `T' in the generic type or method `UnityEngine.GameObject.AddComponent<T>()'. There is no implicit reference conversion from `ComScript' to `UnityEngine.Component'
 
 
==新規画像インスタンス生成方法==
 
[[Unity/Csharp/画像ロード]] [ショートカット]
 
 
==オブジェクトについてるcsを呼び出し実行する方法==
 
GameObject obj = transform.Find ("/mc/mc1").gameObject;
 
ComScript sc = gameObj.GetComponent<ComScript>();
 
sc.Exec();
 
 
==プロパティ名を文字列に==
 
Debug.Log(nameof(Example.Hoge)); // Hoge
 
 
==interface==
 
インターフェイス例
 
<pre>
 
interface ICharacter
 
{
 
    string characterName{get;set;}
 
    string characterName2{get;set;}
 
    void AnimeInit();
 
    void SetKind(string kind);
 
    void AnimePlay();
 
    void AnimeStop();
 
}
 
</pre>
 
インターフェイス実装
 
<pre>
 
public class PandaCharacter : ICharacter
 
{
 
    public string _characterName = "taro";
 
    public string _characterName2 = "jiro";
 
    string characterName { get => _characterName; set => _characterName = value; }
 
    string characterName2 { get => _characterName2; set => _characterName2 = value; }
 
    public void AnimeInit()
 
    {
 
    }
 
    public void SetKind(string kind)
 
    {
 
    }
 
    public void AnimePlay()
 
    {
 
    }
 
    public void AnimeStop()
 
    {
 
    }
 
}
 
</pre>
 
 
==interfaceと継承を同時に==
 
参考:https://qiita.com/chocolamint/items/3fe51eaa7142d2b4f6de
 
 
==複数継承する場合==
 
,で区切る
 
<pre>
 
public class PandaCharacter : MonoBehaviour, ICharacter
 
{
 
 
}
 
</pre>
 
 
==オブジェクト子クラス名取得==
 
Debug.Log("className=" + this.GetType().Name);
 
 
==オブジェクトのclone==
 
<pre>
 
public User Clone()
 
{
 
    return (User)MemberwiseClone();
 
}
 
</pre>
 
参考:https://smdn.jp/programming/netfx/cloning/
 
 
==セッターゲッター==
 
 
<pre>
 
public class Player
 
{
 
    private string name = "taro";
 
    public string Name {
 
        get { return name; }
 
        set { name = value; }
 
    }
 
}
 
</pre>
 
 
<pre>
 
public class Name
 
{
 
    public string Name { get; set; } = "taro";
 
}
 
</pre>
 
 
<pre>
 
private string name = "taro";
 
public string Name
 
{
 
    get => name;
 
    set => name = value;
 
}
 
</pre>
 
 
<pre>
 
private string name = "taro";
 
public string Name { get => name; set => name = value; }
 
</pre>
 
 
参考:https://qiita.com/RyotaMurohoshi/items/d94ed539935dfb2fcdcd
 
 
==interfaceを使ったゲッターセッター==
 
===getのみの場合===
 
ICar.cs
 
<pre>
 
public interface ICar
 
{
 
    string Name { get; }
 
}
 
 
</pre>
 
Car.cs
 
<pre>
 
public class Car : ICar
 
{
 
    private string name = default;
 
    public string Name => name;
 
}
 
</pre>
 
 
===setとgetの場合===
 
ICar.cs
 
<pre>
 
public interface ICar
 
{
 
    string Name { get; set; }
 
}
 
</pre>
 
Car.cs
 
<pre>
 
public class Car : ICar
 
{
 
    private string name = default;
 
    public string Name { get => name; set => name = value; }
 
}
 
</pre>
 
===setとgetとinterfaceとSerializeFieldの場合===
 
Player.cs
 
<pre>
 
public class Player : IPlayer
 
{
 
    [SerializeField] string name = "taro";
 
    public string Name {
 
        get { return name; }
 
        set { name = value; }
 
    }
 
}
 
</pre>
 
IPlayer.cs
 
<pre>
 
public interface IPlayer
 
{
 
        string Name { get; set; }
 
}
 
</pre>
 
 
==SerializeFieldを使ったプロパティ==
 
<pre>
 
class Hoge {
 
    [SerializeField]
 
    string url;
 
}
 
</pre>
 
*[SerializeField]をつけると、privateであってもInspectorのところから値を設定できる。
 
*publicにしても、Inspectorのところから値を設定できるが、他のクラスから変更できるので、Inspectorのところから値を設定するというのを目的にしてるのであれば、SerializeFieldをつけるほうが良い。
 
*publicやprivateを、省略すると、privateになる
 
 
参考:https://qiita.com/makopo/items/8ef280b00f1cc18aec91
 
 
==プロパティ存在有無判定==
 
if (room.GetType().GetProperty("key") == null)
 

2021年11月4日 (木) 21:28時点における版

Unity/Csharp/クラス/基本

Unity/Csharp/クラス/アクセス修飾子