Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゲーム開発研修(C#ハンドブック編)【ミクシィ22新卒技術研修】

MIXI ENGINEERS
April 25, 2022
190

 ゲーム開発研修(C#ハンドブック編)【ミクシィ22新卒技術研修】

MIXI ENGINEERS

April 25, 2022
Tweet

More Decks by MIXI ENGINEERS

Transcript

  1. Unity for 2020.3.33f 2022/04/19 株式会社ミクシィ UnityのためのC#言語学習 Code例 解説 using System;(a)

    using System.Collections; using System.Linq; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEngine.Networking; namespace Mixigameslib.Networkgame (b) { [Serializable] (c) public struct ApplicationSetting (d) { public int targetFrameRate; public float maskalphatime; public Vector3 gravity; public float gravityscale; public static ApplicationSetting Default => new ApplicationSetting (e) { targetFrameRate = 60, maskalphatime = 0.5f, gravityscale = 2f, gravity = Vector3.up * -9.81f, }; } /// <summary> /// /// </summary> [Serializable] public class ApplicationSystem (f) { public ApplicationSetting setting; public void Setup() { setting = ApplicationSetting.Default; (g) Application.targetFrameRate = setting.targetFrameRate; Physics.gravity = setting.gravity* setting.gravityscale; Physics.clothGravity = setting.gravity * setting.gravityscale; #if !DISABLE_DEVELOPMENTMODE (h) DebugEx.IsDebug = true; DebugEx.IsDevelopment = true; #endif } } public abstract class ISceneHandler : MonoBehaviour (i) { public abstract string currentscene { get; } (j) public abstract string backscene { get; } public Button back; // protected virtual void Awake() { back = GetComponentsInChildren<Button>(true)?             .FirstOrDefault(c=>c.name.ToLower() == "back"); (k) (q) back?.onClick.AddListener(OnClickBack); } public virtual void StartLoadSceneSingle(Action callback = null) => this.StartLoadSceneSingle(currentscene, callback); (l) public void SceneDontDestroyOnLoad() { // root object dontdestroy var scene = SceneManager.GetActiveScene();  foreach (var obj in scene.GetRootGameObjects()) (m) { this.SetDontDestroyOnLoad(obj); (n) } } void _StartLoadSceneSingle(        string scenename,        Action callback,        bool maskenable) { Bootstrap.Instance.StartCoroutine(          _IEnumeratorLoadSceneSingle(scenename, callback, maskenable)); } (o) IEnumerator _IEnumeratorLoadSceneSingle(       string scenename,       Action callback,       bool maskenable) { Debug.Log($"_IEnumeratorLoadSceneSingle {scenename}"); (p) if (maskenable) { mask.gameObject.SetActive(true); SetMask(true); } yield return new WaitForSeconds(appsetting.maskalphatime); yield return LoadScene(scenename); if (maskenable) { (a) using は import library な役割。 C#言語基本library はSystem Unity関連libraryは UnityEngine および UnityEngine.XXX (b) namespace定義によって同名classでも識別する。 同一namepspace内か、usingの指定で呼び出す。 (c) attribute(=属性)の指定によって直下の宣言に役割を追加できる。 [Serializeble]はUnityのInspectorウィンドウでpublic宣言された fieldタイプを参照閲覧できる。 また[SerializeField]宣言したfieldタイプであればprivateでも参照で きる。 (d) struct型(構造体)宣言 (e) =>渡しは左辺property宣言に初期値をセットする new 型(){field=value} によってインスタンスを作成する ()は省略されることがある (f) class宣言 (g) static property の参照に . (ドット)シンタックス class property / struct property も同様に . (ドット)シンタッ クス (h) ifdef(イフデフ)は条件コンパイル。最上段で#defineするかビルド時 に与えてバージョンをコントロールする。Unityのbuildsettingパラメータ でも指定できる #define XXXX #if XXXX // この中がdefineがあれば有効 #endif (i) abstract宣言 宣言のクラスで関数等のoverride派生時に実装を示す べき箇所があることを示す。また、abstract classはインスタンスかできな い。 (j) property(プロパティ)タイプの宣言。同様にfield(フィールド)が あり、区別される。 get set の入出力情報を指定できる。 左記例 {get;} は、get(=参照)しかできず setは認められない。 abstract property宣言としている。 このabstractクラス上ではget返却値はなく、派生した実装classでこの返却 値を決定する。 (k) <Button> はGeneric型渡し。参照先関数ではGenericクラス型で抽象 化のまま実装されており、所定の型の範囲で同じ関数を別の型にも使える。 型の限定には呼び出し関数側の実装で T method<T>() where T : Component { } という具合で指定する。 (l) 関数内容を1行で記述する場合 => が使用できる。返却値がある場合は retrun が省略される。 (m) foreach ~ in構造 (n) this 自身のインスタンスの参照。省略できる。または、明示的に this. とする場合には extensionで実装した拡張メソッドへ、this渡し呼 び出しができる。 public static class ExtensionClass { public static void Method(this AnyClass c) { } } (o) IEnumerator型の返却値は出力タイミングを先送りにする処理。主に Coroutineへ渡す関数処理。 出力には yield return ~ または yield break を用いる (p) string情報ダブルクォーテーション前方に「$」をつけることで  {value}  の記述形式で変数/関数戻り値を直接記述することができる。 © mixi, Inc. All rights reserved
  2. Unity for 2020.3.33f 2022/04/19 株式会社ミクシィ SetMask(false); yield return new WaitForSeconds(appsetting.maskalphatime);

    } callback?.Invoke();(q)  } public Action backscenecallback; (r) IEnumerator ISetMask(bool flg, Action callback) { mask.gameObject.SetActive(true); Bootstrap.Instance?          .mask.CrossFadeAlpha(flg ? 0f : 1f, 0f, false); (s) Bootstrap.Instance?          .mask.CrossFadeAlpha(flg ? 1f : 0f, appsetting.maskalphatime, false); yield return new WaitForSeconds(appsetting.maskalphatime); callback?.Invoke(); if (!flg) mask.gameObject.SetActive(false); maskcoroutine = null; } IEnumerator _Iwait(Action callbak, Func<bool> checkbool) (t) { while (!checkbool()) { yield return null; } callbak?.Invoke(); } /// <summary> /// /// </summary> /// <param name="file"></param> /// <param name="callback"></param> /// <param name="onerror"></param> /// <returns></returns> public IEnumerator GetFromStreamingAsset( string file, Action<object> callback = null, Action<object> onerror = null) { string filename = $"{StreamingAssetPath}/{file}"; yield return Connect(           filename,           (r) => callback?.Invoke(r.downloadHandler.text), (u)           onerror); } } } (q) インスタンス参照の「.」ドット右辺に「?」付与をする場合、返却値がな い場合があっても「.」ドット以降を処理せず閉じられる。 (r) Action型は戻り値のない関数処理を当てることができる。引数がある場 合にはGeneric渡しでAction<int> というように宣言する。 (s) flg ? 0f : 1f の記述で三項演算子としてflg判定に応じて0fまたは 1fが出力される。 (t) 戻り値(bool)のある処理を割り当てるには Func<bool> 、引数(int )がある場合には Func<int, bool> という具合に使用する。 (u) 無名関数作成に () => someaction(); 例示されている引数ありAction<T>型には (a) => someaction(); と記述する。 変数化するには var act = (b) => someaction(); ()の入力変数名a,b,r,は任意自由。 act , someactionは記述例のため適宜変更する。 © mixi, Inc. All rights reserved