facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(setとgetとinterfaceとSerializeFieldの場合)
 
(同じ利用者による、間の7版が非表示)
行1: 行1:
==クラスやプロパティ==
+
[[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になる。
+
[[Unity/Csharp/クラス/アクセス修飾子]]
  
==単純クラス==
+
[[Unity/Csharp/クラス/クラス分割]]
public class Animal {
+
private int footCnt = 4;
+
public void Init() {
+
}
+
public void SetFootCnt(int cnt) {
+
footCnt = cnt;
+
}
+
public int GetFootCnt(int cnt) {
+
return cnt;
+
}
+
}
+
  
==継承と基底クラスのメソッドへのアクセス==
+
[[Unity/Csharp/クラス/継承元から継承先実行]]
base.を使う
+
  
abstract class Animal
+
[[Unity/Csharp/クラス/インターフェイス]]
{
+
    public virtual void Call()
+
    {
+
    }
+
}
+
class Cat : Animal
+
{
+
    public override void Call()
+
    {
+
        base.Call();
+
    }
+
}
+
  
==単純クラスインスタンス生成方法==
+
[[Unity/Csharp/クラス/引数可変]]
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
+
 
+
==オブジェクト子クラス名取得==
+
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)
+

2024年10月22日 (火) 21:20時点における最新版

Unity/Csharp/クラス/基本

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

Unity/Csharp/クラス/クラス分割

Unity/Csharp/クラス/継承元から継承先実行

Unity/Csharp/クラス/インターフェイス

Unity/Csharp/クラス/引数可変