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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

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

Avatar for MIXI ENGINEERS

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