UnrealEngine4でPython リターンズ その2

前回、UE4のPythonの基本設定まで行いました。今回は具体的なツールにしてみましょう。
そもそもなぜ、Pythonが必要か?という目的ですが、CADから変換する場合、そのパーツ数が多く、その全てにマテリアルを設定して、マテリアルエディタでノード接続し、BluePrintでその全てにプログラムを組むとなると気が遠くなります。
そこでPythonの出番です。さらにプログラムを操作するとなると、せっかく文系でも使えるUE4が使いにくくなるので、UE4Editorもカスタマイズして、誰でも使えるようにできる、という話です。

さて、前回はマテリアルを自動生成しましたが、それは別の機会に細かく説明します。今回はBluePrintの代わりにPythonが使える、という例です。

まず、コンテンツブラウザから「ブループリントクラス」を実行します。通常「Actor」とか作りますが、下の「すべてのクラス」から「py」で検索して、「PyActor」を探し「選択」します。それ以外に「PyHMD」「PyCharactor」「PyPawn」などもありますね。いずれ解説します。

普通のActorのBPが起動しますが、「Python」という項目があります。

前回やりましたが、「ウインドウ」→「PythonEdtor」を起動して、以下のプログラムを入力します。

import unreal_engine as ue

ue.log('Hello i am a Python module')

class Hero:

    # this is called on game start
    def begin_play(self):
        ue.log('Begin Play on Hero class')
        
    # this is called at every 'tick'    
    def tick(self, delta_time):
        # get current location
        location = self.uobject.get_actor_location()
        # increase Z honouring delta_time
        location.z += 100 * delta_time
        # set new location
        self.uobject.set_actor_location(location)

一度「Save」した後、左の項目をダブルクリックして「funnygameclasses」に名前を変更します。

BPに戻って、Pythonの項目に「 python module」を「funnygameclasses」に「PythonClass」を「Hero」にします。

Cubeのスタティックメッシュのコンポーネントを追加します(なんでもOKですが)。ここでコンパイルします。

作ったActorBPをレベルに出して、Playします。
Cubeが上に限りなく飛んでいくでしょう。

上のプログラムの12行目の
def tick(self,delta_time)
がBluePrintのTickイベントでマイフレーム実行されます。16行目の

location.z += 100 * delta_time
で、Z座標にマイフレームごとの100追加していき、次の行で設定します。
これで上に移動するのです。

「ウインドウ」→「デベロッパーツール」→「PythonConsole」を見ると、プログラムの3行目と9行目のメッセージが確認できます。
ue.log(文字列)
でコンソールに通知しているので、PythonがBluePrintの中で動いているのが判ります。
def begin_play(self)
これはBluePrintの「BeginPlay」のことです。このようにBluePrintの操作をPythonで書くことができます。

年内のBrosブログはこれでお休みです。次回は1月10日(木)から再開します。

Unity 2018.3 HDRPでビジュアライゼーション入門②

さて、Unity2018.3の2回目です。具体的にコンテンツを作っていきます。
やはりカーコンフィグレータをやってみたいものです。

Mayaで作成したシーンはこちらです。フリー素材のランボルギーニです。
FBXに変換して、Unity2018.3の通常版にインポートします。

色や質感も変換されました、がこれは当たり前ですよね。


ところが、HDRPのUnityだと、こうなってしまいます。
過去のUnityのアセットのパッケージをインポートしても同じです。


これはバグでもなんでもなく、HDRPのシェーダに強制的にされるので、過去のUnityの設定はリセットされてしまうようです。
(図は左が2018.3通常版、右がHDRP版の同じマテリアルのInspector)

前回の2018.3-HDRPシーンに真っ白なランボルギーニを配置します。

床をコピーします。2018.3の最も特筆する改良点は、「Prefabのネスト」です。
この建築現場みたいなアセットは「Workshop Set」という1つのPrefabです。
いままでだと、その1つだけを操作できませんしたが、それが、できるようになりました。

Prefabの中の床だけ選んでコピーしました。

新規マテリアルを作成して、前回のハサミでやりましたが、メタリックなレッドに仕上げました。

前と同じでは面白くないので、実験として、あえて「Anistiropy」=異方性反射反射を使ってみましょう。

InpectorでAnistiropyの数値を上げるとヘアライン仕上げの角度が変わります。
(車のボディではこの設定おかしいので戻しますが)

このサンプルシーンに元からあるマテリアル集があるので、これをコピーして修正したりして、ランボルギーニに設定していきます。

一通りマテリアルを付け、カメラも移動します。
次にガラスを作成してみます。


SurfaceOptionを「Transparent」にします。

Opactyを下げれば透明な質感出来上がりです。
いかがでしょうか?

もうひと手間。「Light Probe Group」をシーン全体に大きくします。
これでGIを設定します。


さらに「Reflection Probe」を設定して映り込む範囲を決めます。この辺も2018からの新機能です。

これで完成です。いかがでしょうか?
年内のUnityの連載はこれで終了です。

 

 

UnrealEngine4でPython リターンズ その1

5月のブログUnrealStudioにPythonが正式に使えるようになったので、試してみたのですが、その後は連載してませんでした。
というのも、資料などがなく判りにくい、制限が多いなど壁にぶつかってました。
弊社ではUE4のPythonプログラミングの研究はしており、こちらのGitHubで公開されている「非公式バージョン」が実は機能が豊富でサンプルも多いのです。

公式ではダメなランタイム実行やエディタカスタマイズもできるので、UnrealStudioでなくても動きますし正直こっちを推したい、と常々思ってました。
と思ったら、conquestarrow.com様のブログでも公式と非公式の比較をされてますね。
気になってたのは、公式版Pythonが出たので、非公式は開発中止で公開終了・・・とかなるとガッカリなので懸念してました。

しかし、プラグインのバイナリー版リリースを見ると、ちゃんとUE4.21も出ています。これは公式と並行していくのかも・・・と期待したいと思います。

こちらの良い点は、UE4.15から使え、さらにPython3、それも最新の3.7もOKという点です。
というわけで非公式の方で連載記事を書いていこうと思います。

では、第一回ですので、セットアップからです。ちょっと手間ですが、難しくありませんのでご安心ください。
まず、上のリンクから、自分のUE4バージョンに合ったプラグインをダウンロードします。ここでは4.21にしてます。

Python3も使えますが、あえてMayaなどに合わせてPython2.7にします。
これを解凍して、UE4プロジェクトに「Plugin」フォルダを新規に作成して(自動で作ってくれないので注意)、そこに全て入れます。

UE4の起動の前に、Pythonをインストールしましょう。ここからダウンロードします。

いっぱいあって判りにくいのですが、Windowsの方なら「Windows x86-64 MSI installer」ですね。

特に設定なくインストールしたら、UE4を起動してください。


起動後の注意ですが、「編集」→「Plugins」で「PythonEdtor…」をONにしないでください。これは公式のPythonで、非公式と同時に起動すると起動時にクラッシュします。
しかし、公式Pythonがない4.20以前の場合はインストールしたプラグインなのでONにしなくてはなりません。少し面倒ですね・・・

上手くいったら、ウインドウ→「PythonEdtor」メニューが出ます。

これがPythonEdtorです。「New」ボタンをクリックします。

ソースコードを入力します。

from unreal_engine.classes import Material
new_material = Material()
new_material.set_name('New python Material')
new_material.save_package('/Game/Materials/NewPythonMaterial'

細かい説明は今回は省きますが、新規のマテリアルを作成し、「New python Material」という名前を付け、コンテンツブラウザの「Materials」フォルダに作成する、というプログラムです。

「Execute」で実行します。

Pythonから新規でマテリアルを作成できました。
いかがでしょうか?

次回から詳しく説明していきます。