Unity・3DCG技術ブログ

TAもどきによるUnity・3DCGに関する記事をアップします。

【Unity】GetWindowで特定のEditorWindowの隣にEditorWindowをこさせるサンプル

概要

EditorWindow.GetWindowの引数desiredDockNextTotypeofでタイプを指定すると、そのタイプの隣に ウィンドウがくるサンプル。

f:id:serialtv:20200719183702p:plain

コード

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ExampleWindow : EditorWindow
{
    [MenuItem("Window/ExampleWindow")]
    static void Init()
    {
        // SceneViewの隣にExampleWindowがドックする。
        GetWindow<ExampleWindow>(desiredDockNextTo: typeof(SceneView));
    }

    void OnEnable()
    {
        var button1 = new Button(() => Debug.Log("button1"))
        {
            name = "button1",
            text = "button1"
        };
        rootVisualElement.Add(button1);
    }
}

Unityでファイルの特定の行数にジャンプする

概要

Unityでコンソールウィンドウの行をダブルクリックしたときにコードにジャンプしますが それと同じことをUnityのインターナルなメソッドを呼ぶことでできるのでメモ

コード

    static void OpenFileOnSpecificLineAndColumn(string filePath, int line, int column)
    {
        Assembly.GetAssembly(typeof(EditorApplication))
        .GetType("UnityEditor.LogEntries")
        .GetMethod(nameof(OpenFileOnSpecificLineAndColumn), BindingFlags.Static | BindingFlags.Public)
        .Invoke(null, new object[] { filePath, line, column });
    }

使用例

        var path = AssetDatabase.GetAssetPath(アセット);
        var ioPath = Application.dataPath.Replace("Assets", "") + path;
        OpenFileOnSpecificLineAndColumn(ioPath, line, 0);

pathにはApplication.dataPathAssetDatabase.GetAssetPathをくっつけたものを指定する。

【Unity】TypeCache.GetTypesDerivedFrom

概要

Unity2019.2からTypeCacheを使用すると、あるベースクラスから継承されている派生先のクラスのTypeを取得することができる。

サンプルコード

        public interface IHoge
        {
        }

        public class HogeA : IHoge
        {
        }

        public class HogeB : IHoge
        {

        }

        foreach (var type in TypeCache.GetTypesDerivedFrom<IHoge>())
        {
            Debug.Log($"{type.Name}");
        }

出力

HogeA

HogeB

出自

TypeCache

【Unity】シンプル会話パートを作れるUniNovelを作ってみた

概要

Unityでシンプルな会話パートが作成できるUniNovelを作ってBitbucketに公開しました。 f:id:serialtv:20200526000304p:plain

機能

かなりシンプルなことしかできません^^

  • BG表示・非表示
  • キャラ表示・非表示
  • メッセージ送り
  • バックログ

GUIエディター

f:id:serialtv:20200526233009p:plain 上でコマンドを選択して+ボタンで追加できます。

コマンドリスト

  • bg : 背景表示
  • bg_off : 背景非表示
  • left_character : 左側キャラ表示
  • left_character_off : 左側キャラ非表示
  • right_character : 右側キャラ表示
  • right_character_off : 右側キャラ非表示
  • コマンド空文字 : テキスト表示

権利表記

Unityちゃんの素材を使用しています。 © UTJ/UCL

MELサンプルその1

概要

MayaのMELのシンプルなサンプルスクリプト

f:id:serialtv:20200513000426p:plain

MEL

string $toolCreate = "createTool";
string $toolName = "UI Tool";

if( `window -exists $toolCreate`)
{
    deleteUI $toolCreate;
}

window -t $toolName -w 500 -h 500 $toolCreate;
frameLayout -label "UI CTRLS" -bs "etchedIn" -cll 1 -cl 1;
gridLayout -nc 3 -cwh 90 50;
button -label "Ctrl Maker" -c "button_CtrlMaker_Clicked";
setParent ..;

showWindow $toolCreate;

global proc button_CtrlMaker_Clicked ()
{
    circle -c 0 0 0 -nr 0 1 0 -sw 360 -r 1 -d 3 -ut 0 -tol 0.01 -s 8 -ch 1;
}

覚えたコマンド

  • windowで新しいウィンドウを作成する。showWindowで表示
  • buttonの -c でコールバック button_CtrlMaker_Clicked を登録
  • frameLayoutから setParent ..; までがひとかたまり
  • frameLayoutの -cll 1 -cl 1 でCollapse表示(折りたたみ表示)になる

出自

Mayaの基本操作メモ1

MayaLTを触り始め、基本操作を少し覚えたのでメモ。

添って移動させる


・オブジェクトを選択して移動モードでC押しながらドラッグ ・オブジェクトを選択して移動モードでV押しながらドラッグ

Pivotの操作


・オブジェクトを選択してInsertキーまたはDキー

グループ化


・グループ化したいオブジェクト選択してCtrl + G

平面を回転すると裏面が黒くなる


・Lightingメニュー=>Two Sided Lightingにチェックを入れる

グループの簡単な選択方法


・グループ内のオブジェクト選択してキーボードの↑キーを押す

一定間隔で複製


・最初にCtrl+Dしてから複製物を移動させる 。次からShft + D

特殊な複製


・編集=>特殊な複製で□を押す。

・transform zに2、Numに30などと指定でzが2おきに30個複製可能

参考書籍

  • Mayaベーシックス 3DCG基礎力育成ブック

オブジェクトをミラー複製するMEL

概要

MayaのMELでオブジェクトを複製する。

使い方

下記をスクリプトエディタに貼り付け実行する。

// トランスフォームのフリーズ
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 -pn 1;

// pivotを原点に移動
string $objs[]=`ls -sl`;
for ($obj in $objs){
    move 0 0 0 ($obj+".scalePivot") ($obj+".rotatePivot") ;
}

// 特殊な複製
duplicate -rr; scale -r -1 1 1;

// pivotリセット
manipPivotReset true true;
manipMoveValues Move;

// 複製元を選択
for ($obj in $objs){
    select -r $obj;
}

// pivotリセット
manipPivotReset true true;
manipMoveValues Move;