チュートリアル / Shotgunスクリプト入門
第3回:Perforceと連携してみよう
- Flow Production Tracking
- コラム
- スクリプト・API
- スマイルテクノロジーユナイテッド
- チュートリアル
- 上級者
- 中級者
はじめに
皆さんこんにちは。スマイルテクノロジーユナイテッド株式会社の榎本です。
今回は、前回と同じようにファイルアップローダーを拡張していくことで、Shotgun スクリプトに慣れていただきたいと思います。
1. 今回の内容
Shotgun を活用する多くの制作現場では、社内にあるファイルサーバーをメインのデータ共有先としていると思います。制作において成果物となるファイルの管理は最も大事なことですが、ファイルサーバーでのファイル共有ではバージョン管理が大きな課題になることがあります。そこで今回はバージョン管理システムとの連携についてご紹介します。
Shotgun では制作における様々な情報が集まります。しかし、実の成果物となるファイルはローカルディスクやファイルサーバーなど Shotgun とは別の場所に置かれており、Shotgun にはファイルパスを持たせて連携させることになります。そのファイルパスの代わりにバージョン管理システムの URL をリンクすることで実ファイルへのアクセス情報をスタッフ間で共有し、ファイルパスを個別に伝える手間が省けます。
実例としてバージョン管理システムの簡単なご紹介とともに、ファイルアップローダーの機能追加についてやっていきましょう。
1.1. バージョン管理システムについて
バージョン管理システムはファイルの更新履歴を管理するための仕組みです。ソフトウェア開発の現場では欠かせないツールであり、Subversion や Git などのオープンソース製品が広く知られています。
Shotgun が活躍する制作現場では、サイズが大きいファイルや、画像・動画などのバイナリファイルが多く、実は Git などのバージョン管理システムとの相性が悪い面もあります。その中で、Perforce 社(*1)の提供する Helix Core(*2)という製品は大きなバイナリファイルの扱いにも長けており、ゲーム開発の現場などで利用されている実績があります。Helix Core はもともと Perforce という名称で広く知られているので本稿でも Perforce と呼びます。
今回、連携するバージョン管理システムは Perforce とします。Perforce は商用製品ながら限定された条件下であれば無償で利用できるので、小規模な検証などは手軽に始められることも大きなメリットです。
*1 Perforce 社のサイト: https://www.perforce.com/
*2 Helix Core について: https://www.perforce.com/products/helix-core
1.2. Perforce との連携方法の種類
Shotgun と Perforce の連携はさまざまな手段が考えられますが、大きく分けて四つの方法があります。
<Shotgun と Perforce の連携方法>
1. ファイルアップローダーの機能として実装する
2. Shotgun イベントデーモンとして実装する
3. Perforce サーバーのトリガー機能として実装する
4. Shotgun ツールキットの連携機能(*3)を使う
それぞれの違いについて図式化すると以下のようになりますが、連携方法によって特徴があります。
<連携方法による特徴>
1. ファイルアップローダーの機能として実装
◯ アプリケーション内に機能追加するだけで済むため実装がシンプル
× Shotgun との連携はアプリケーションの実装次第になる
2. Shotgun イベントデーモンとして実装
◯ Shotgun の情報更新に合わせた連携が可能
× Shotgun イベントデーモンを稼働させるサーバーが必要となる
3. Perforce サーバーのトリガー機能として実装
◯ Perforce の情報更新に合わせた連携が可能
× Perforce サーバーのトリガー機能の知識が必要になる
4. Shotgun ツールキットの連携機能(*3)を使用
◯ Shotgun Software から提供されている
× 機能が豊富過ぎて使い方を把握するのが難しい
今回の連携方法としては前回と同様にシンプルな「ファイルアップローダーに Perforce へのアップロード機能を実装」する方法をとります。
1.3. Perforce と Shotgun の連携内容について
Perforce と Shotgun で連携させる内容やファイルアップローダーの動作には具体的にどのようなことが含まれるでしょうか。大まかには以下のような流れが考えられます。
1. Perforce サーバーへファイルをアップロードする
a. アップロードするファイルを指定する
b. 更新内容のコメントを記入する(Changelist の作成)
c. サーバーにファイルをアップロードする(Submit の実行)
d. 更新番号が決まる(Changelist 番号の確定)
2. Shotgun へファイルをアップロードする
a. 更新番号と更新内容コメントを Description へ指定する
b. Perforce サーバー上のファイルパスを Web ページへのリンクに指定する
c. サーバーにファイルをアップロードする
Perforce サーバーにアップロードするためには更新ごとに変更したファイル名と更新内容を示すコメントが記入された Changelist を用意します。そして、Changelist の内容を Perforce サーバーにアップロードするために Submit を実行します。Submit が完了すると、Changelist に番号が付与されるので、その番号を元に更新されたファイルと更新内容を共有します。Changelist の情報を Shotgun へのアップロードの際に含めることで、どのファイルがどのような理由で更新されたかを詳細に把握できるのが、バージョン管理システムと Shotgun を連携させる最大のメリットです。
今回は上記の流れに必要となる機能を追加していくことにします。追加実装していく機能をまとめると、下記の三つになります。
● 更新するファイルの Changelist を用意して、Perforce サーバーへファイルをアップロードする
● Perforce サーバーへアップロードした内容を一括表示する
● Perforce サーバーにアップロードした Changelist の番号とコメントを Shotgun へ流し込みながら、ファイルをアップロードする
2. Perforce 検証環境の準備
2.1. Perforce サーバーの準備
まず、検証用の Perforce サーバーを準備する必要があります。Perforce サーバーの準備について詳細を説明するとそれだけで本コラムが終わってしまうので、概要に留めさせていただきますが、ご了承ください。Perforce サーバーの検証環境を用意するには大きく二つの方法が考えられます。
● Windows 版 Perforce サーバーを PC にインストールする
● Docker for Windows を利用してコンテナ上で Linux 版を動作させる
Windows 版 Perforce サーバーをインストールするには Perforce 社の Web サイトからダウンロードし(*4)、ドキュメントにしたがってインストールします。英語ですが、詳細なドキュメント(*5)が用意されているため、困ったときの参考資料として利用できます。また、日本で長らく Perforce 社製品の販売代理店をされている(株)東陽テクニカ様(*6)のサイトでは、日本語のマニュアルも参照できるので、必要に応じてご確認ください。
*4 Download Helix Core (P4D) Server: https://www.perforce.com/downloads/helix-core-p4d
*5 Helix Core Server Administrator Guide: https://www.perforce.com/manuals/p4sag/Content/P4SAG/Home-p4sag.html
*6 株式会社東陽テクニカ: https://www.toyo.co.jp/
Docker for Windows を利用する場合、まずは Docker 社(*7)のサイトからインストーラを取得してインストールします。Docker 環境で利用できる Perforce サーバーの定義ファイルはGitHub で検索するといくつか出てきますが、Perforce 社の方が用意しているデモ環境の定義(*8)が利用しやすいです。本コラムの検証環境としては、この定義ファイルを使用する前提で進めていきます。
*7 Docker 社: https://www.docker.com/
*8 GitHub p4paul/helix-docker: https://github.com/p4paul/helix-docker
GitHub から定義ファイルをダウンロードする際、git コマンドが利用できる方は以下のコマンドで任意の場所に取得してください。
git clone https://github.com/p4paul/helix-docker.git
git コマンドが利用できない場合は、GitHub のページから ZIP ファイルとして取得してください。Clone or download のボタンから Download ZIP のリンクで取得できます。
定義ファイルを取得できたら、下記の通り展開したフォルダ内へ移動し、docker-compose コマンドを実行します。コンテナのビルドが実行されて数十分程待つと、いつでも消せる検証用の Perforce サーバーが用意されます。
cd helix-docker/ docker-compose build docker-compose up
コンテナのビルドが完了すると複数のコンテナを起動が成功して、以下のような画面が表示されます。
この画面表示まで進むと Perforce サーバーと共に、Web アプリケーションの Helix Swarm(*9)も使える状態になっています。
*9 Helix Swarm: https://www.perforce.com/products/helix-swarm
2.2. Perforce クライアントの準備
Perforce では標準で P4V というクライアントが提供されています。Perforce 社のサイトからダウンロードしてインストールします(*10)。
Perforce ではワークスペースと呼ぶ単位でファイルの更新履歴を管理します。Perforce サーバーへ最初に接続する際にはサーバー名とユーザー名、パスワードを入力した後でワークスペースを新規作成します。はじめに P4V を起動すると Open Connection の画面が開くので、用意した検証環境の情報を入力します。
Server: tcp:localhost:4000 User: super
Server と User の情報を入力したら、Workspace 欄の右側にある New のボタンを押して、ワークスペースの新規作成画面に移ります。
ワークスペース設定として、Workspace name と Workspace root にそれぞれ以下のように入力して OK ボタンを押します。
Workspace name: sandbox Workspace root: C:\_sandbox
なお、このワークスペースの設定では C:\_sandbox というフォルダは出来ていません。今後の作業のために、このタイミングで Cドライブに _sandbox フォルダを作成してください。
ワークスペースの設定追加が完了すると、また Open Connection の画面に戻るので、OK ボタンを押すと、以下のようなメイン画面が表示され、Perforce サーバーへ接続は完了します。
P4V での接続が確認できたら、Perforce 検証環境のセットアップはこれで完了です。
*10 Download Helix Visual Client (P4V): https://www.perforce.com/downloads/helix-visual-client-p4v
2.3. P4Python のインストール
ファイルアップローダーから Perforce を利用できるように Python モジュールをインストールします。Perforce の Python モジュールとして P4Python が提供されているので、下記のコマンドで第一回と同様に仮想環境 venv_shotgun_scripting へモジュールを追加します。
cd venv_shotgun_scripting Scripts\activate.bat python -m pip install p4python
なお、P4Python モジュールのドキュメントは Perforce 社のサイトで公開されています(*11)。インストール手順で上手く行かないことがあればドキュメントを確認してください。
これでようやく Perforce に関連する環境設定は完了です。次はいよいよ実装に入ります。
*11 Helix Core P4Python Developer Guide: https://www.perforce.com/manuals/p4python/Content/P4Python/Home-p4python.html
3. ファイルアップローダーへの実装
3.1. ツールの構成
今回のツールの構成を下図に示します。
myuploader ├ cli.py ├ myuploader.bat │ ├ config │ └ config.json │ └ images ├ 001.png ├ 002.png . └ 100.png
ツールの構成は前回と同様でファイルの追加は特にありません。中身をそのまま書き換えていくことにしますので、前回の内容を残しておきたい場合はコピーして別途残しておいてください。また、今回はコードの長さを抑えるため、前回追加した Slack との連携の部分は省きます。Slack への通知機能を合わせる場合は、各自でコードを統合しましょう(ここまで読み進んで来た皆さんならば大丈夫です!)。
3.2. コーディング
まず、設定ファイルとして config.json を下記のように記述します。今回は Perforce サーバーへの接続情報を追記しました。なお、Perforce のパスワードは今回の検証環境では空になっています。
{ "shotgun": { "target_dir": "images", "url": "https://smiletechnologyunited.shotgunstudio.com", "script_name": "myuploader", "api_key": "fouetfj8uebo3bjflneghqorp", "project_id": 90 }, "perforce": { "port": "localhost:4000", "username": "super", "password": "", "workspace": "sandbox" } }
※この API トークンはダミーです。毎度のことですが、有効なトークンを公開しないようにご注意ください。
cli.py を下記のように編集します(いきなりですが全体像を示します)。
import json import os import shutil import sys from P4 import P4, P4Exception from shotgun_api3 import Shotgun class IdentityError(Exception): pass def base_dir(): """このファイルが置かれているフォルダのパスを返す :rtype: str """ return os.path.dirname(os.path.abspath(__file__)) def config_path(): """config.jsonファイルのパスを返す :rtype: str """ return os.path.join(base_dir(), "config", "config.json") def get_config(): """config.jsonの中身を取得して返す :rtype: dict """ with open(config_path(), "r") as fp: config = json.load(fp) return config def find_unique(shotgun, entity_type, filters, fields): """一意のエンティティを取得する 対象エンティティが複数存在したらIdentityErrorを送出する :type shotgun: shotgun_api3.Shotgun :type entity_type: str :type filters: list :type fields: list :rtype: dict """ _entities = shotgun.find(entity_type, filters, fields) if not _entities: return None elif len(_entities) == 1: entity = _entities[0] return entity else: raise IdentityError def main(): """メイン関数 :rtype: int """ config = get_config() # Shotgunの設定 shotgun_config = config["shotgun"] target_dir = shotgun_config["target_dir"] url = shotgun_config["url"] script_name = shotgun_config["script_name"] api_key = shotgun_config["api_key"] project_id = shotgun_config["project_id"] project = {"type": "Project", "id": project_id} # P4の設定 p4_config = config["perforce"] # P4インスタンスの取得 p4 = P4() p4.port = p4_config["port"] p4.user = p4_config["username"] p4.password = p4_config["password"] p4.client = p4_config["workspace"] try: p4.connect() p4.run_login() except P4Exception: return 1 # Shotgunインスタンスの取得 shotgun = Shotgun(url, script_name=script_name, api_key=api_key) # 対象のエンティティをバージョン、アップロード先のフィールドをsg_uploaded_movieとします entity_type = "Version" field_code = "sg_uploaded_movie" error_list = [] target_list = os.listdir(target_dir) # Perforceサーバーへのアップ開始 p4_info = p4.run("info")[0] workspace_root = p4_info["clientRoot"] image_path = workspace_root + "\\images" run_add = False if not os.path.isdir(image_path): # ワークスペース内にimagesフォルダが無いときには新規作成 os.mkdir(image_path) run_add = True else: # ワークスペース内にimagesフォルダが有るときにはチェックアウト # "..." でのファイル指定はP4の独自ルールでフォルダ配下の全ファイルを表す p4.run_edit(image_path + "\\...") # imagesフォルダの画像ファイルをワークスペース配下へコピー for image_file in target_list: shutil.copy2(".\\images\\" + image_file, image_path) # Perforceへの新規追加ファイルを登録(初回のみ) if run_add: added = p4.run_add(image_path + "\\...") # Addされたファイルを見てみましょう print(added) print("") # チェンジリストを作成 change = p4.run_change("-o")[0] change["Description"] = u"画像ファイル100個のアップロード" # チェンジリストを見てみましょう print(change) print("") # チェンジリストを反映してサブミットを実行 p4.input = change submitted = p4.run_submit("-i")[0] # サブミット結果を見てみましょう print(submitted) print("") changed_files = change["Files"] changelist_number = submitted["change"] p4.disconnect() # Perforceサーバーへのアップは完了 for _index, _file in enumerate(target_list): try: filters = [["project", "is", project], ["code", "is", _file]] fields = ["id"] version = find_unique(shotgun, entity_type, filters, fields) except IdentityError: error_list.append(_file) continue if not version: # ファイル名と同じ名前のバージョン名と、所属するプロジェクトの情報を持たせます entity_data = {"code": _file, "project": project} # バージョンエンティティを作成します version = shotgun.create(entity_type, entity_data) # versionにはどのようなデータが入っているでしょうか? print(version) # 作成したバージョンのidを取得します version_id = version["id"] file_path = os.path.join(target_dir, _file) # 作成したバージョンにファイルをアップロードします shotgun.upload( entity_type, version_id, file_path, field_name=field_code, display_name=_file ) # Assetの名前は、ファイル名から拡張子を除いたものにします name, ext = os.path.splitext(_file) asset = find_unique( shotgun, "Asset", [["project", "is", project], ["code", "is", name]], ["id"] ) # Descriptionを追加します description = "CL#{0}: {1}".format(changelist_number, change["Description"]) # ファイルリンクとしてCreative Briefを追加します creative_brief = { "content_type": "string", "link_type": "url", "name": changed_files[_index], "url": "http://localhost:5080/files" + changed_files[_index][1:] } if not asset: description = "Created. " + description asset_entity_data = {"code": name, "project": project} asset = shotgun.create("Asset", asset_entity_data) else: description = "Updated. " + description # 作成されたAssetの情報を確認します print(asset) # 新規作成時にはリンクを作成できないので、アップデートで作成します asset_id = asset["id"] link_data = { "sg_versions": [{"type": "Version", "id": version_id}], "sg_creative_brief": creative_brief, "description": description } shotgun.update("Asset", asset_id, link_data) print("") uploaded_list = sorted(list(set(target_list).difference(set(error_list)))) if uploaded_list: print("アップロードされたファイル: {0}".format(len(uploaded_list))) for _file_name in uploaded_list: print(_file_name) print("") if error_list: print("重複しているファイル: {0}".format(len(error_list))) for _error_message in error_list: print(_error_message) print("") return 0 if __name__ == "__main__": sys.exit(main())
前回からは、P4Python モジュールやファイルを扱う shutil のインポートを追加しています。(Slack 連携に関わる requests モジュールは外しています。)
それでは今回追記した箇所を順を追って詳しく見ていきましょう。
3.3. Perforce サーバーとの接続準備
79 行目より、Perforce サーバーの設定を config.json から読み込み、Perfoce サーバーへ接続する流れを行っています。接続時にエラーが発生するとプログラムは終了します。
# P4の設定 p4_config = config["perforce"] # P4インスタンスの取得 p4 = P4() p4.port = p4_config["port"] p4.user = p4_config["username"] p4.password = p4_config["password"] p4.client = p4_config["workspace"] try: p4.connect() p4.run_login() except P4Exception: return 1
以降はここで用意した変数 p4 を使って P4 モジュールを操作します。
3.4. アップロード対象をワークスペースへファイルコピー
105 行目より、ファイルアップローダーの images フォルダ以下にある画像ファイルをワークスペースへコピーして、Perforce の管理対象とする動作の箇所です。
# Perforceサーバーへのアップ開始 p4_info = p4.run("info")[0] workspace_root = p4_info["clientRoot"] image_path = workspace_root + "\\images" run_add = False if not os.path.isdir(image_path): # ワークスペース内にimagesフォルダが無いときには新規作成 os.mkdir(image_path) run_add = True else: # ワークスペース内にimagesフォルダが有るときにはチェックアウト # "..." でのファイル指定はP4の独自ルールでフォルダ配下の全ファイルを表す p4.run_edit(image_path + "\\...") # imagesフォルダの画像ファイルをワークスペース配下へコピー for image_file in target_list: shutil.copy2(".\\images\\" + image_file, image_path) # Perforceへの新規追加ファイルを登録(初回のみ) if run_add: added = p4.run_add(image_path + "\\...") # Addされたファイルを見てみましょう print(added) print("")
ファイルを Perforce にアップするには、まずワークスペースの設定情報を p4 info コマンドの実行と同様に取得します。設定情報からワークスペースのルートフォルダを取得して、画像のコピー先を特定します(105 ~ 107 行目)。
そして、特定したルートフォルダ配下に画像ファイルをコピーします(120 ~ 121 行目)。
初めてファイルを追加する際、新たに Perforce の管理対象として登録する操作が必要なので、 p4 add コマンドの実行と同様にファイルの新規登録を行います(125 行目)。
また、画像差し替えなど、2回目以降の操作ではワークスペースにあるファイルを変更対象とする操作、チェックアウトが必要なので p4 edit コマンドと同様にファイルをチェックアウトします。チェックアウトの対象はフォルダ以下にある画像ファイルを全て、という指定にしてあり、Perforce コマンド独自のファイル指定方法である "..." を利用しています(117行目)。
3.5. チェンジリストの作成とサブミットの実行
ファイルの操作が完了したら、更新単位となるチェンジリストの作成を行います。
# チェンジリストを作成 change = p4.run_change("-o")[0] change["Description"] = u"画像ファイル100個のアップロード" # チェンジリストを見てみましょう print(change) print("") # チェンジリストを反映してサブミットを実行 p4.input = change submitted = p4.run_submit("-i")[0] # サブミット結果を見てみましょう print(submitted) print("") changed_files = change["Files"] changelist_number = submitted["change"] p4.disconnect() # Perforceサーバーへのアップは完了
チェンジリストを用意するため、 p4 change コマンドと同様に実行して、コマンドの出力内容を辞書形式で受け取ります。受け取ったデータの内、Description にあたる箇所へ、今回の変更内容として「画像ファイル100個のアップロード」というコメントを記載します(132, 133 行目)。
チェンジリストの準備ができたら、 p4 submit コマンドと同様に実行して、Perforce サーバーへアップします。アップが成功するとチェンジリストの番号が確定するので、Shotgun へ適用する情報として控えておきます(140 ~ 148 行目)。
Perforce への一連の操作が完了したので、Perforce サーバーから切断します(149行目)。
3.6. Shotgun へのメタデータ追加
Shotgun との連携のためメタデータを追加します。今回は [アセット] (Assets) に含まれる [説明] (Description) のフィールドと、ファイルリンクとしての Creative Brief のフィールドへ情報を追記するため、それぞれ変数を用意します。
# Descriptionを追加します description = "CL#{0}: {1}".format(changelist_number, change["Description"]) # ファイルリンクとしてCreative Briefを追加します creative_brief = { "content_type": "string", "link_type": "url", "name": changed_files[_index], "url": "http://localhost:5080/files" + changed_files[_index][1:] }
description 変数は、チェンジリスト番号とコメントを含む str 型で用意します(194 行目)。
creative_brief 変数は、対象ファイルへのリンク先としてローカル環境で動作している Helix Swarm の URL となる文字列を持つ辞書型の変数として用意します(197 ~ 202 行目)。
if not asset: description = "Created. " + description asset_entity_data = {"code": name, "project": project} asset = shotgun.create("Asset", asset_entity_data) else: description = "Updated. " + description
description 変数は、新規追加か更新かが判別できるようにコメント前部にメッセージを追加します(205 行目, 209 行目)。
link_data = { "sg_versions": [{"type": "Version", "id": version_id}], "sg_creative_brief": creative_brief, "description": description }
Shotgun へ送るデータとして link_data 変数のキーに sg_creative_brief(*12) と description を追加して、用意していた creative_brief 変数、description 変数を値として持たせます(218, 219 行目)。
修正内容は以上です。
*12 sg_creative_brief フィールドがない場合は、実行前に作成します。
4. 実行
前回同様、myuploader.bat をダブルクリックで実行します。
それではやっていきましょう。
最初にチェンジリストの内容が表示され、Perforce へのサブミット結果が表示されます。
続いて Shotgun のバージョンとアセットのセットが作成されていきます。
アップロードが完了すると、コンソールに結果の詳細が表示されます。
エラーメッセージが表示されなければアップロード完了です。
Shotgun プロジェクトにアセットが作成され、[説明] (Description)(description フィールド)にコメント内容が記入され、Creative Brief(sg_creative_brief フィールド)には Perforce サーバーでのファイルパスのリンクが記入されていることが確認できます。
Perforce サーバー上にアップロードされたかも確認してみましょう。P4V を起動してサーバー側のツリーを確認してみましょう。ツリービューのタブにある「Depot」を選択すると、Perforce サーバー側にあるファイルが確認できます。001 ~ 100.png の 100枚の画像ファイルが正しくアップロードされていることが確認できます。
(注: ファイル名の後ろの番号はファイルごとのリビジョンを表しますが、検証中に何度も更新しているためリビジョン番号がかなり進んでいます)
Shotgun と Perforce 連携の確認として、Shotgun の[アセット] (Assets) 画面から Creative Brief に含めたリンクが正しく動作しているか確認してみましょう。Creative Brief のフィールドに含まれるパスのリンクをクリックしてみてください。
正しくリンクできていれば下記のように Helix Swarm 画面が表示されます。
実データとなるファイル単位での更新履歴を確認するときに、より詳細な情報を得ることができます。
5. 今回のまとめ
● Shotgun では成果物となる実の制作ファイル(画像や動画、3D モデルデータなど)を直接は扱いません。
● Shogun とバージョン管理システムの間で工夫することで更新情報やファイルリンクの連携が取れます。
● Perforce との連携には P4Python モジュールが活用できます。
● Perforce の検証環境を用意するには Docker の利用がお勧めですが、使用にあたっては覚えるべき内容が多く、やや敷居が高いです。
6. 付録
6.1. Shotgun 関連
● Python API
○ API Reference: https://developer.shotgunsoftware.com/python-api/reference.html
○ GitHub リポジトリ: https://github.com/shotgunsoftware/python-api
6.2. Perforce 関連
● Perforce: https://www.perforce.com/
○ Helix Core: https://www.perforce.com/products/helix-core
○ P4Python Developer Guid: https://www.perforce.com/manuals/p4python/Content/P4Python/Home-p4python.html
● helix-docker: https://github.com/p4paul/helix-docker
6.3. その他
● Docker: https://www.docker.com/
あとがき
コラム「Shotgunスクリプト入門」はこれで終了します。
ここまで、Shotgun スクリプトの活用と、他のアプリケーションと Shotgun との連携について、ファイルアップローダーを軸に紹介してきました。皆さんの業務での活用方法がイメージできたでしょうか。Shotgun は柔軟な拡張性を持っているので、スクリプトの力を使って便利にカスタマイズしていきましょう。
この連載をするにあたり、オートデスク株式会社の皆様には大変お世話になりました。また、執筆を含めサポート頂いた多くの方々へも感謝を申し上げます。そして、ここまで読んでいただいた読者の皆様へも感謝いたします。皆様の、Shotgun を活用した業務効率化への一助となれば幸いです。
さいごに弊社からのご案内
スマイルテクノロジーユナイテッド株式会社はDCCツールを活用している制作現場の支援となるツール開発や業務改善の提案を得意とする会社です。Mayaや3ds Maxを始めとする3DCGツールはもちろんのこと、Shotgun のような現場を支援するWebツール活用の改善にも力を入れています。
ツール開発や業務改善に課題を感じている現場の皆さん、ぜひ一度お気軽にご相談ください。
また、テクニカルアーティストや3DCGプログラマーは絶賛募集しています。Pythonを用いたMayaのツール開発やWebアプリを用いた業務改善に興味がある方はぜひ弊社までご連絡ください。お待ちしております。
(問い合わせ先はこちら)