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

ゲーム開発研修(Unity実装テクニック編)【ミクシィ22新卒技術研修】

 ゲーム開発研修(Unity実装テクニック編)【ミクシィ22新卒技術研修】

B16717ef4b7aab0b253d933c3934f280?s=128

mixi_engineers
PRO

April 25, 2022
Tweet

More Decks by mixi_engineers

Other Decks in Programming

Transcript

  1. Unity for 2020.3.33f1 2022/04/18 株式会社ミクシィ Unity 実装テクニック集 i. 距離の測り方 (positiona-positionb).magnitude

    // magnitude計算コストは高い // vector.srqMagnitude は平方根しない // directioin.srqMagnitude で代用できるならする ii. 対象への振り向き方 • transform transform.LookAt(target.transform, Vector3.up) • vector3 // transformの向き transform.forward // target方向への2点間ベクトル // 任意の2点 targetposition , currentposition ver to = (targetposition-currentposition).normalized; // speed 1~ float step = speed * Time.deltaTime; // ゆっくりベクトルを変更 var newdir = Vector3.RotateTowards(transform.forward , to, step) //rotaionに与えて回転する transform.rotation = Quaternion.LookRotation(newdir); iii. 対象から見た固定座標の取り方 // 任意位置(Vector3) offsetposition は自身を (Transform) target から見て常にoffsetpositionのLocal座標を保つ transform.position = target.position + target.rotation * offsetposition; transform.rotation = Quaternion.LookRotation(target.position - transform.position, Vector3.up); iv. 速度の保ち方 • rigidbody.vector.magnitude > maxspeed // 超過 • (x * x + y * y + z * )の平方根 © mixi, Inc. All rights reserved
  2. Unity for 2020.3.33f1 2022/04/18 株式会社ミクシィ • magnitude計算コストは高い • 代わりに、vector.srqMagnitude は平方根しない

    • rigidbody.vector.srqMagnitude > maxspeed * maxspeed // 超過 • 速度制限以下ならrigidbody.AddForce()する v. 遅延追従 • // 2点間を滑らかに移動するパターン transform.position = Vector3.Lerp(startMarker.position, endMarker.position, volume); • //目標地点まで等速で移動するパターン transform.position = Vector3.MoveTowards(transform.position, newpos, speed) vi. クリック2d座標の3d座標変換 // marker は任意3d object var ray = CameraController.Instance.worldcamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) marker.transform.position = hit.point; vii. 3d座標の2dpos変換 // 任意のRectTransform ui // 3d表示中のcameraインスタンス // 3d座標 position ui.position = RectTransformUtility.WorldToScreenPoint(camera, position) viii. 2つの3dオブジェクトをカメラ表示領域に自動で納めるカメラViewport Rect var min3d = new Vector3(Mathf.Min(target[0].position.x, target[1].position.x), Mathf.Min(target[0].position.y, target[1].position.y)); var max3d = new Vector3(Mathf.Max(target[0].position.x, target[1].position.x), Mathf.Max(target[0].position.y, target[1].position.y)); var targetrect = Rect.MinMaxRect(min3d.x, min3d.y, max3d.x, max3d.y); // rectにしておくとobject追加時にContains判定可能 var min = Camera.main.WorldToViewportPoint(targetrect.min); var max = Camera.main.WorldToViewportPoint(targetrect.max); var targetviewport = Rect.MinMaxRect(min.x, min.y, max.x, max.y); © mixi, Inc. All rights reserved
  3. Unity for 2020.3.33f1 2022/04/18 株式会社ミクシィ ix. 実行中の値の取り出しには、コンテキストメニュー利用 • [ContextMenu("my menu")] 呼び出しによってDebug.Log()、ファイル保存など

    • (後述のエディタ拡張 attribute 参照) x. テキスト保存 System.IO.File.WriteAllText(name, contents); // 例はプロジェクトフォルダ直下にname名で保存 xi. Scene読み込み using UnityEngine.SceneManagement; /// using はscript上部に追加 SceneManager.LoadSceneAsync(name, LoadSceneMode.Single) ; // 切替 SceneManager.LoadSceneAsync(name, LoadSceneMode.Additive ) ; // 加算 xii. エディタ拡張 インスペクタ属性(Attribute)...関数上に記述する属性 [Range(0, 5)] // スライダー [HeaderAttribute ("Title")] // タイトル [MultilineAttribute (2)] //複数行text [TextAreaAttribute(2, 5)] // 複数行可変text [HideInInspector] // 非表示 [ContextMenu("my menu")] // インスペクタ設定プルダウンメニュー(インスペクタ右上歯車) [ContextMenuItem("my menu")] // インスペクタ変数(field)クリックmenu, いずれかの変数field上に記述するattribute [MenuItem("my click menu","CallMethodName")] // in editor 右クリックメニュー、対象関数にMenuCommand commandが渡される インスペクタ表示作成 ...Editor https://docs.unity3d.com/jp/current/ScriptReference/Editor.htm l using UnityEngine; using UnityEditor; [CustomEditor(typeof(MyComponent))] public class CharacterEditor : Editor { public override void OnInspectorGUI() {} } © mixi, Inc. All rights reserved
  4. Unity for 2020.3.33f1 2022/04/18 株式会社ミクシィ 自作ウィンドウ作成 …EditorWindow https://docs.unity3d.com/ja/current/ScriptReference/EditorWindow.html using UnityEngine;

    using UnityEditor; public class MyWindow : EditorWindow{ [MenuItem("custom/my window")] public static void Show() { EditorWindow.GetWindow<MyWindow>(); } void OnGUI() { GUILayout.Label("message"); } } © mixi, Inc. All rights reserved