GitHubのプライベートリポジトリにGitクライアントでhttpsでアクセスする際に設定すること(Unity Package Managerでプライベートリポジトリ内のパッケージを取得したい)

エンジニアの岡村です。

最近仕事でUnity Package Managerを本格的に採用しており、upm対応したライブラリをGitHub上にプライベートリポジトリとして作成し、複数プロジェクトから参照出来るようにしました。ところが、作ったパッケージをUnityから参照しようとしたところ、環境によっては該当のリポジトリはクローン出来るにも関わらずUnityからはアクセス出来ないといった現象が発生し、ちょっとした混乱がありました。

今回の記事は上記のトラブルの手順を社内ナレッジベースに纏めておいたものを基に、内容を整理したものになります。

前提環境

  • Windows10
  • Git for Windows インストール済み

※Gitがインストールされていないと、UnityPackageManagerがURLからパッケージを取得しようとした際にエラーが出ます。

やること

Unity Package Managerはgitリポジトリからのパッケージの読み込みに、OSにインストールされたGitクライアントを利用します。 そこで、以下の手順でGitクライアントがGitHubのプライベートリポジトリにアクセスできるように資格情報を設定してやります。

GitHubのAccessTokenの発行

GitHubアカウントにアクセスするためのPersonalAccessTokenを作成します。発行は以下のURLから出来ます。

https://github.com/settings/tokens

トークンの発行時に権限を指定する必要があるのですが、今回はプライベートリポジトリのコードにアクセスできるrepo権限が最低限必要です。

アクセストークンをGitに設定する

今の状態でプライベートリポジトリを参照するパッケージをUnityPackageManagerでインポートしようとすると、次のようなダイアログが出てきます。

Tokenのタブに切り替えて、先ほどGitHub上で作成したアクセストークンを貼り付けます。

貼り付けたらSign inボタンを押して下さい。認証がうまく行けば、そのままパッケージのダウンロードが行われます。

この手順が正常に完了した場合は設定は終わりです。おつかれさまでした!

(手動で)アクセストークンをGitに設定する

※ここまででパッケージの読み込みが正常に完了した場合は、以降の手順は不要です。

gitのバージョンが古い、Windows以外を使っている等、上の手法で上手くいかなかった場合はこちらの方法でうまく行くかもしれません。

資格情報をファイルにプレーンテキストで格納し、gitの設定で参照するようにします。

発行したトークンを格納したファイルを作成

%USERPFORILE%\.git-credentialsファイルを作ります。このファイルは後の手順でパスを指定するので、別の名前でも構いません(デフォルトはこの名前です)。

ファイルの中には以下の一行を記述します。既にファイルが存在する場合は改行して追記してください。

https://{User}:{Token}@github.com
元の文字列 置き換え内容
{User} GitHubのユーザー名(URLに使われる文字列)
{Token} 前の手順で取得したアクセストークン

https://hogehoge:xxxxxxxx@github.comのようにします。

Gitの設定変更

Gitのグローバルコンフィグに先程作ったファイルを参照するよう設定します。

※UnityPackageManagerのパッケージ読み込み時にリポジトリ単位のコンフィグは参照されないので、グローバル以上のスコープで設定する必要があります。

%USERPROFILE%\.gitconfigファイル内に以下の設定を追加します。

[credential]
    helper = store --file ~/.git-credentials

作業を終えてからUnityでプライベートリポジトリ内のパッケージを設定すると、正常にインストールできる様になっているはずです。

以上

以上の操作でgitでGitHubのプライベートリポジトリにhttpsでアクセスすることが出来るようになり、UnityPackageManagerでパッケージとして読み込むことも可能になります。

今回はは社内のgitのインストール設定やバージョン等に縛りがなかったため、GUIを使った設定では上手くいかない人が出てきました。その原因を全て特定することは出来ず、社内で問題が出たすべての人の環境で動作する方法の模索には少し苦労しました。

宣伝

今年のSynamonは、アドベントカレンダーを実施する予定です! 自分もいくつか記事を公開する予定なので、是非楽しみにしていてください!

qiita.com

また、弊社ではUnityエンジニアを募集しています。興味がある方は是非以下のページを覗いてみてください!

twitter.com

meety.net

herp.careers

Varjo XR-3を使ってハンドトラッキングを試してみる(MRTK編)

こんにちは!   Synamonでエンジニアをしている黒岩(@kro96_xr)です。
前回に引き続きVarjo XR-3でのハンドトラッキングについて試していきたいと思います。  

前回の記事はこちら   synamon.hatenablog.com

はじめに  

Varjo XR-3にUltraleap Geminiが搭載されていることは前回触れた通りです。

今回はMRTKを使用したハンドトラッキングについて試してみたいと思います。
MRTK for ultraleapについてはこちら > MRTK公式リファレンス.

環境  

今回の環境は以下の通りです。  

VarjoUnityXRPluginのインポートとプロジェクト設定の変更は前々回記事と同様なので割愛します。  

以降のカメラ設定についても前回記事を参考に適宜変更していただければと思います。

導入手順  

Ultraleap SDK導入まで(前回記事と同様)  

  • Varjo公式githubからVarjo XR-3 & VR-3 Ultraleap SDK for UnityをClone  
  • CloneしたフォルダからのAssets/Pluginsをコピーしプロジェクトに追加  
  • パススルー機能を使う場合はパススルーでのレンダリングを開始するように下記スクリプトを用意してシーンに追加しておく
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Varjo.XR;
 
 public class Sample : MonoBehaviour
 {
     private void Start()
     {
         VarjoRendering.SetOpaque(false);
         VarjoMixedReality.StartRender();
     }
 }

MRTK導入まで

  • Microsoft.MixedReality.Toolkit.Foundation をダウンロードしてのUnityPackageをインポート
  • 新規シーンを開いてLeap Motion Unity ModulesとMRTKを統合する
    • Mixed Reality > Toolkit > Utilities > Leap Motion > Integrate Leap Motion Unity Modulesを選択 f:id:krocks96:20211031172559p:plain
  • シーンに設定を追加する
    • Mixed Reality > Toolkit > Add to Scene and Configure f:id:krocks96:20211031172749p:plain
  • MixedRealityToolKitから"Copy & Customize"をクリックしプロファイルを作成する。名前は任意で決めてCloneを押す f:id:krocks96:20211031173023p:plain
  • Inputを選び、デフォルトプロファイルをCloneする f:id:krocks96:20211031173052p:plain
  • Input Data Providersが編集可能になるので、"Add Data Provider"をクリックし、TypeをMicrosoft.MixedReality.Toolkit.LeapMotion.Input > LeapMotionDeviceManagerを選択 f:id:krocks96:20211031173126p:plain
  • CloneをクリックしてデフォルトのLeapMotionSettingをクローンする f:id:krocks96:20211031173214p:plain
  • オフセットをVarjo公式が指定する値に変更する f:id:krocks96:20211031173246p:plain
  • StandardShaderをURP用に更新する f:id:krocks96:20211031173334p:plain
  • パススルーの設定
    • インスペクタでカメラをいじってもMRTKのプロファイルで上書きされてしまうのでMixedReality ToolkitのCameraから設定を変更する
      • プロファイルをクローンしてDisplay SettingsのClear FlagをColorに、Background Colorを(0,0,0,0)に設定する f:id:krocks96:20211031173444p:plain

上記設定でパススルーかつMRTKでのハンドトラッキングが可能となります。 f:id:krocks96:20211031173548p:plain

同様にしてSampleを動かすことも可能です。(社内共有用に撮影した動画のキャプチャのため画質はご容赦ください) f:id:krocks96:20211031173750p:plain

躓きポイント  

Varjo XR-3でパススルー機能を使うためにはカメラ設定を指定されたものにする必要があるのですが、MRTKの場合はMRTKのプロファイル側を変更する必要がありますのでご注意ください。
MRTKのプロファイル構成ガイドはこちら > MRTK プロファイル構成ガイド

おわりに  

以上でMRTKを使ったハンドトラッキングの設定は完了です。
一連の記事でXR-3向けのハンドトラッキングを含むコンテンツ開発に必要な設定が出来たかと思います。

Synamonでは今後も継続してXR-3を使ったコンテンツ開発を行なっていきます。
開発に興味がある方はぜひ下記の求人もご覧ください!

お知らせ  

Synamonは、Unity / C#エンジニア、テックリードを中心に新しい仲間を募集中です。
「XRが当たり前の世界をつくる」というミッションに共感したメンバーが、切磋琢磨しながら日々挑戦しています!
カジュアル面談も実施中なので、ご興味ある方、お気軽にご連絡ください。
カジュアル面談でご来社いただきXR-3を体験することなども可能ですよ!  

カジュアル面談はMeetyから▼   meety.net  

エントリーはこちら▼   herp.careers  

また、本テックブログやnote記事のお知らせは、Synamon公式Twitterでも発信もしています。
弊社の取り組みに興味を持っていただけたら、ぜひフォローお願いいたします!   twitter.com  

Varjo XR-3を使ってハンドトラッキングを試してみる(Ultraleap Plugin for Unity編)

こんにちは!
Synamonでエンジニアをしている黒岩(@kro96_xr)です。
前回「Varjo Unity XR SDKを使ってパススルーを試す」という記事を投稿させていただきましたが、今回はハンドトラッキングについて試していきたいと思います。

前回の記事はこちら
synamon.hatenablog.com

はじめに

この記事をご覧になる皆さんにとっては今更かもしれませんが、Varjo XR-3はUltraleap(旧Leapmotion)の第5世代ハンドトラッキングプラットフォーム(通称Gemini)を搭載しており、Ultraleapのリファレンスを参考にすることで比較的簡単にハンドトラッキングを実装することができます。
Geminiについてはこちら > Gemini: Fifth-generation hand tracking platform | Ultraleap

また、Microsoftが提供しているMixed Reality Tool Kit(MRTK)がUltraleapに対応しているため、空間操作や入力システムに関連する一連のコンポーネントを活用することもできます。
今回は前者のUltraleap Plugin for Unityを使用したハンドトラッキングを、次回の記事ではMRTKを使用したハンドトラッキングについて試してみたいと思います。

(追記)
この記事を書いている最中にGemini正式リリースのリリースがありました。トラッキング精度が向上したとのことなので楽しみですね!
www.moguravr.com

環境

今回の環境は以下の通りです。

  • Unity2020.3.19f
  • VarjoUnityXRPlugin 2.1.1
  • Varjo XR-3 & VR-3 Ultraleap SDK for Unity 3.0.0

VarjoUnityXRPluginのインポートとプロジェクト設定の変更は前回記事と同様なので割愛します。
以降のカメラ設定についても前回記事を参考に適宜変更していただければと思います。

導入手順

共通手順

  • Varjo公式githubからVarjo XR-3 & VR-3 Ultraleap SDK for UnityをClone
  • CloneしたフォルダからのAssets/Pluginsをコピーしプロジェクトに追加
  • パススルー機能を使う場合はパススルーでのレンダリングを開始するように下記スクリプトを用意してシーンに追加しておく
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Varjo.XR;
 
 public class Sample : MonoBehaviour
 {
     private void Start()
     {
         VarjoRendering.SetOpaque(false);
         VarjoMixedReality.StartRender();
     }
 }

Moduleに同梱されているサンプルを動かす場合

  • Assets > Plugin > LeapMotion > Core > Example内のシーンを開く
  • 各種シェーダーを使用しているレンダリングパイプラインに合わせて変更
    基本これだけでハンドトラッキング自体は動くはずです。

f:id:krocks96:20211027201707p:plain

手動でハンドトラッキングを追加する場合

  • MainCamereの下に空のオブジェクトを追加して、オフセットの値を設定
    f:id:krocks96:20211027204117p:plain
    f:id:krocks96:20211027204139p:plain
  • MainCameraに"Leap Service Provider"をアタッチしてオフセット用オブジェクトを指定
    f:id:krocks96:20211027204042p:plain
  • シーンに空のオブジェクトを追加して"HandTrackingManager"をアタッチ
  • 上記オブジェクトの下にAssets > Plugin > LeapMotion > Core > Preafabs > HandModelsNonHuman内のプレハブを追加
    f:id:krocks96:20211027204626p:plain
  • HandModelManagerのModel Poolに上記で追加したプレハブのオブジェクトを追加、IsEnabledをONにする
    f:id:krocks96:20211027204656p:plain

以上でハンドトラッキングが追加できるかと思います。

躓きポイント

Ultraleapが提供しているLeap Motion's Unity Modulesを使用すると"Leap Service not connected; attempting to reconnect"のワーニングが出てハンドトラッキングができませんでした。
XR-3で使用する場合はVarjoがgithubで公開しているModuleを使用するようにしてください。
ちなみにLeapMotionを使う際にVarjoが公開しているModuleを使うと同様のワーニングが出ました。
公式リファレンスに従わないとこういうところで躓くので気をつけましょう。(基本こんなことしないと思いますが…)

おわりに

以上でハンドトラッキングの設定は完了です。動かすだけであれば意外と簡単に出来ますね。
上記と同様の方法でInteractionのテストもしてみましたが、キューブに触ることもできました。 f:id:krocks96:20211027202024p:plain

ただ、細かいUI等を一から開発することを考慮するとMRTKを導入した方がスムーズに開発を進められそうです。
次回の記事ではMRTKの設定方法について書きたいと思いますので、そちらも読んでくださると嬉しいです!

お知らせ

Synamonは、Unity / C#エンジニア、テックリードを中心に新しい仲間を募集中です。
「XRが当たり前の世界をつくる」というミッションに共感したメンバーが、切磋琢磨しながら日々挑戦しています!カジュアル面談も実施中なので、ご興味ある方、お気軽にご連絡ください。
カジュアル面談でご来社いただきXR-3を体験することなども可能ですよ!

カジュアル面談はMeetyから▼
meety.net

エントリーはこちら▼
herp.careers

また、本テックブログやnote記事のお知らせは、Synamon公式Twitterでも発信もしています。
弊社の取り組みに興味を持っていただけたら、ぜひフォローお願いいたします!
twitter.com

GOTANDA VALLEY ENGINEER NIGHTでSynamonのリモートワーク事情について話してきました

こんにちは!
Synamonエンジニアリングマネージャーの佐藤(@unsoluble_sugar)です。

コロナ禍におけるエンジニアのリモートワークをテーマにしたイベント「五反田流エンジニアリモートワーク~GOTANDA VALLEY ENGINEER NIGHT #3~」のパネルディスカッションに登壇してきました。

▼イベント情報 gotanda-valley.connpass.com

本記事ではイベント内容の所感と合わせ、Synamonのリモートワーク事情について詳しくご紹介していきます。

オープニングセッション

freee取締役CTO横路さんによるオープニングセッションでは「リモートワーク下での面接・ミーティング・チームビルディングについて」お話しいただきました。

f:id:unsoluble_sugar:20211027150521p:plain

フルリモート環境で入社した社員さんが数ヶ月で離職されてしまったり、オンラインMTGで発言ハードルが上がってしまった、などの課題をピックアップ。

f:id:unsoluble_sugar:20211026170345p:plain

弊社でも悩んでいる問題や、それらに対する具体的な施策例のご紹介もありました。

  • 「やりすぎ1on1」で接点を増やしてみた
  • 声をかけやすい環境づくり
  • 会議室のオンラインミーティング環境を整備する
  • オンラインとオフラインのメンバーを混ぜない
  • 抽象的な議論は人数をもっと絞る or 対面

まだまだ課題が山積みの中、試行錯誤されている様子を赤裸々に話していただき、大変勉強になる内容でした。

f:id:unsoluble_sugar:20211026170553p:plain

パネルディスカッション

続いてパネルディスカッションでは、freee、セーフィー、ユニラボ、Synamonという、事業規模・フェーズの異なる各社のリモートワーク事情について意見交換をさせていただきました。

f:id:unsoluble_sugar:20211026170829p:plain

登壇者

  • freee株式会社 取締役CTO 横路 隆様
  • freee finance lab マネージャー 横田 健志様
  • セーフィー株式会社 プロダクト開発部 モバイルチームリーダー 池田 和志様
  • 株式会社ユニラボ システム部 部長 田中 雅和様
  • 株式会社Synamon エンジニアリングマネージャー 佐藤 巧実

ディスカッション内容

リモートワークのメリット/デメリットや、今後のリモートワーク体制、コロナ後に採用した人は活躍できているのか?など、ざっくばらんな各社の事情を共有。事業規模やフェーズが異なる中でも共感できるお話や「その施策面白いですね~!」といった、各社の特色・文化も垣間見えるディスカッションとなりました。

「鍋」をキーワードとしたコミュニケーション形成を行なっているユニラボさんや、Synamonの「お試し入社」を取り入れたエンジニア採用の手法など、リモートワーク下でも企業文化を維持しようと奮闘する様子に多くの共感が集まりました。やはり各社の事情を聞いてみると、対面コミュニケーションとのバランスを取ることの難しさを改めて実感します。

Synamonのお試し入社については、以下note記事でも触れています。 note.synamon.jp

パネルディスカッションのお話は、ユニラボ田中さんもレポート記事をアップされていますので、こちらも合わせてお読みください。

note.com

Synamonのリモートワーク事情

Synamonでは「対面でのコミュニケーションを重視している」という背景もあり、現在はフルリモートではなく、週に一度の出社日を設ける形となっています。

それ以外の日は、各チームやプロジェクト、作業状況に応じて柔軟に対応しています。

メンバー同士の関係構築やディスカッション、偶発的コミュニケーションの維持など、これらすべてをリモートツールで代替することはまだまだ難しい状況ですね。

コミュニケーションツール

弊社の社内コミュニケーションツールとしては、主に以下のようなものを使用しております。

  • Slack(チャット)
  • oVice(バーチャルオフィス、社内MTG)
  • Miro(オンラインホワイトボード)
  • Scrapbox(MTG議事録、ナレッジ共有)
  • GitBucket/GitHub(ソースコード管理)

自社プロダクトであるNEUTRANSも交えつつ、適材適所でツールを使い分けているのは、なかなかおもしろい点と言えるかも知れませんね。

リモートワークについてSynamonのエンジニアに聞いてみた

今回のイベント実施と合わせ、社内のエンジニアメンバーにリモートワークの所感についてアンケートを取ってみました。イベント当日は時間の都合上すべてをお話することはできなかったため、本記事で紹介してみたいと思います。

全7問のアンケートについて、箇条書きで回答と一言コメントを載せています。

Q1. リモートやってみて気付いたこと

  • ようやく世の中が追いついてくれた感
  • oViceは便利。ながら作業しながらある程度距離感は出せる
  • リモートワークが本当に適している人・組織は意外と少ない
  • リモートワークは作業をする時間、出社はコミュニケーションをとる時間と切り分けるのが仕事がしやすい。
  • リモートワークに向いている作業、向いていない作業があるので一概に「全てリモートワークで!」とすべきではないと感じました。
  • 他人の目がないのでリラックスできる気はする。会議はオンラインの方が楽な場合も多い。

リモートワークが向き不向きな人・組織・作業があるということは、皆さん実感されているようですね。
「会議はオンラインの方が楽な場合も多い」という話は、会議室の確保やプロジェクター準備など、リアルでは何かと手間がかかる部分が簡素化・不要となることが大きな要因かと思われます。

Q2. リモートワークのメリット

  • 移動時間ゼロ
  • 通勤時間の問題がなくなるので、朝から開発作業ができる
  • 出勤時の面倒がない
  • 家事がやりやすい、外出の準備の手間がなくなる
    • 出勤時間を出勤準備に充てられる
    • 自分に合せられるので、環境が整えば会社より快適になりやすい
    • 隣の席の声がマイクに入ったりしない
  • 隙間時間で家事ができる。寝転がって休憩できる。仕事と仕事以外の用事の時間調整がしやすい。(仕事夜に回して、日中病院に行くとか)
  • ワークライフバランスが調整しやすい
  • 画面共有をすることで、何について話しているかを共有しやすい
  • 人に話しかけられて集中が途切れるといったことがなくなった

通勤時間がなくなることで家事にあてられる時間が確保でき、ワークライフバランスが保ちやすくなったと感じるメンバーが多いようです。
ひとりで進められるタスクであれば、自宅のほうが集中して作業できるという方も居ますよね。

Q3. リモートワークのデメリット

  • 全く同じXR機器環境を必ずしも家で構築できるわけではないため、高価・特殊、物理スペースを要するなどの機器などを扱う場合はリモートでは厳しい。(そういう場合に限ってはオフィスでの作業は致し方ない気はしている)
  • 雑談ができない、PCやネット回線やヘッドフォンなど環境面を整える必要がある
  • ちょっとした雑談などが発生しにくい
  • 同僚との会話は少ない
  • 慢性的に運動不足になる
  • 意識しないと運動量が落ちる
  • 自制がしんどい
  • (最初からリモートでない限り)会社側もリモートワーク用に体制を整える必要がある
  • 仕事の開始、終了(特に終了)が区切りにくい
  • いるのかいないのかわかりづらい、話しかけづらい
  • 細かい仕様などはFaceToFaceの方が調整しやすい
  • 音声が途切れる等の機材トラブルが発生すると面倒

デメリットについては意外と多くの意見が出てきました。弊社で取り扱っている事業特有の開発機器に絡んだ問題や、リモートワーク環境の整備、運動不足、仕事の切り替えコントロールがしづらいなど、人によって課題を感じる部分が異なるようです。

雑談のしにくさについては、きっかけが掴みづらいという話がネットでもよく見かける意見です。1on1や雑談タイムを設けるなどの施策が考えられますが、リモートだとミーティング時間の増加により作業時間が圧迫されてしまう…といった悩みも出てきます。

バランスのとり方が非常に難しい問題ですね。リモートでも雑談がうまくいく施策があれば、ぜひとも情報共有いただきたいです。

Q4. 生産性はあがりましたか?

f:id:unsoluble_sugar:20211026175342p:plain

リモート適正のあるメンバーが多いためか、生産性は変わらない、上がったという意見が目立ちました。

Q5. 健康面での変化はありましたか?

  • 体を動かす習慣をより意識しないと筋力が落ちたりなど不調になりがち
  • 運動しなくなった
  • 太陽光を浴びないので眠気が覚めにくい、歩かないので意識的に運動しないと運動量がゼロになる
  • 太った
  • 通勤しなくなり太りました…

筋力低下、太った、睡眠への影響など、健康面の変化については、個人が最も実感しやすい問題と言えるかもしれません。通勤がなくなったことで「自ら健康に気を使わなければ…!」という意識が芽生えた方も多いのではないでしょうか。

弊社でも筋トレやダイエットに勤しむメンバーの様子が見受けられます。

note.com

リングフィットアドベンチャーやFitXRといった、ゲームと運動を絡めたコンテンツが人気になったのも、リモートワーク増加の影響ですね。

Q6. 副業やってますか?

f:id:unsoluble_sugar:20211026173848p:plain

Synamonのエンジニアは皆さん副業やっていないそうです。

ほんとぉ…?

Q7. リモートワーク、本音だとどれくらいしたい?

f:id:unsoluble_sugar:20211026173839p:plain

一部フルリモート派が居るものの、リモートと出社の併用が良いというメンバーが多数派のようです。生産性が「変わらない」「上がった」という意見も目立ちましたので、通勤時間や作業環境のバランスを考慮した結果と言えるかもしれません。

ちなみにfreeeさんも、現在はハイブリッド出社にチャレンジしているとのこと。 f:id:unsoluble_sugar:20211026174727p:plain

リモートワークと物理出社、それぞれの良さを活かすというのは大事ですね。

これまで紹介してきたメリット/デメリットを振り返ると、チームや組織によって適した働き方があることがわかりますね。リモートワークの設計については、メンバー各自の意見を受け止めつつ、仮説検証を繰り返し模索していく必要があることを再認識しました。

私もエンジニアリングマネージャーとして、リモートワーク下でのチームビルディングの難しさは日々実感しております。今回のイベントで得られた知見やその他の事例も見ていきながら、自分たちに合ったスタイルを確立していければと思います。

お知らせ

本テックブログやnote記事のお知らせは、Synamon公式Twitterでも発信もしています。
弊社の取り組みに興味を持っていただけましたら、ぜひフォローお願いします!
twitter.com

「現場の生の声をもっと聞きたい!」という方は、カジュアル面談などもご活用ください。 meety.net

Unity2021.2で使えるC#9の機能

エンジニアの小松です。ついに正式リリースされたUnity2021.2.0でのC#9サポートについて調査しました。

Unity2021.2からC#9.0の一部機能が使えるようになります。
サポートされている機能の一覧はリリースノートの「Scripting: Updated C# language version to 9.0 for compilation and IDE's」にあります。

これらの機能について簡単に紹介します。

パターンマッチングの強化

C#7の頃からどんどん改良され続けているパターンマッチングがさらに便利になりました。

特にUnityではis not nullを使えるようになるのが大きいです。GameObjectを単純に==や!=でnullと比較すると問題がありますが、is nullとis not nullを使えば回避できます。

以下にサンプルコードを載せます。

Component c;

// ...

// Unityで==や!=を使うと思わぬ挙動をするので is null か is not nullを使う
if (c is null)
{
    // cがnullのとき
}

if (c is not null)
{
    // cがnullでないとき
}

また、and/orと範囲を組み合わせて範囲指定できるのも知っていると便利です。

int GetValue()
{
    int v = 0;
    // ...
    return v;
}

// if (GetValue() < 0 || GetValue() >= 100)とするとGetValueが2回呼ばれるが
// 次の書き方だと1回しか呼ばれない
if (GetValue() is < 0 or >= 100)
{
    // GetValue()が0未満 or 100以上のとき
}

if (GetValue() is >= 10 and <= 20)
{
    // GetValue()が10以上 and 20以下のとき
}

パターンマッチングは他にも色々とできますが省略します。
やりすぎるとコードが読みづらくなるので簡単に読める範囲で有効活用できるといいと思います。

target-typed new

オブジェクトをnewするときに、型が推測できる場所ならnewの後ろの型名を省略できるようになりました。

Dictionary<string, List<int>> field = new() {
    { "item1", new() { 1, 2, 3 } },
    // C#8までは { "item1", new List<int>() { 1, 2, 3 } },
};

特にフィールドではvarが使えないので便利です。

public class Foo : MonoBehaviour
{
    private Dictionary<string, int> dic = new();
    // C#8までは private Dictionary<string, int> dic = new Dictionary<string, int>();
}

ちなみに"target-typed"というのは「代入される先の型」くらいの意味です。
「private Dictionary dic = new();」ではDictionaryに入る値をnewしているのだからDictionaryをnewしたいのだろう、とコンパイラが推測してくれます。

target-typed条件演算子

3項演算子の型推測が賢くなりました。あまり意識して使うことは無さそうです。

bool shouldBeList = true;
// ...
IEnumerable<int> enumerable = shouldBeList ? new List<int>() { 0, 1 } : new int[] { 0, 1 };
// C#8まではコンパイルエラー。(IEnumerable<int>)new List<int>()のように明示的にキャストが必要だった。

ラムダ式での引数の破棄

ラムダ式で使わない引数を破棄(discard)できるようになりました。
使わない引数を_にすると、その引数は無視するという意味になります。

System.Func<int, int, int> func = (_, _) => 0;
// C#8まではコンパイルエラー。

イベントやコールバックで一部の引数しか使わないことはよくあるので便利そうです。

静的匿名関数

ラムダ式が外の変数を使わないことをstaticで明示できるようになりました。

// 渡されたaとbを足して返すのデリゲート
// 外の状態に依存しないのでstaticを付けられる
Func<int, int, int> add = static (a, b) => a + b;

int captured = 10;

// capturedとaを足して返すデリゲート
// 外のcaptured変数を使っているのでstaticは付けられない
Func<int, int> add2 = a => a + captured;

staticが付いていれば変数キャプチャが発生しないことがひと目でわかるので付けられる場所には付けておくのがいいと思います。

ローカル関数の属性

ローカル関数に属性が付けられるようになりました。
Unity2021.2からnull許容関連の属性も使えるのでたまに必要になるかもしれません。

拡張メソッドによるGetEnumerator

拡張メソッドとして定義したGetEnumeratorがforeachで使われるようになりました。
あまり使うことはないと思います。

関数ポインタ

staticメソッドをデリゲートではなく関数ポインタを介して呼び出せるようになりました。
それによってパフォーマンスが向上します。

staticメソッド限定かつunsafeコンテキストでしか使えない、と制限が厳しいです。
本当にパフォーマンスが重要な箇所では使ってもいいかもしれません。

新しいpartialメソッド

メソッドにpartialを付けるとメソッドの宣言と定義を分散できます。
このメソッドには色々な制限があったのですが、それらが色々と変更になりました。

主にコード生成で使われる機能です。
UnityではまだSourceGeneratorに対応していないので使う機会はほとんど無いと思います。

未サポートの機能について

Unity2021.2のドキュメントでは以下の機能が未サポートとなっています。

  • init専用セッター
  • 共変戻り値
  • ModuleInitializer
  • Extensible calling conventions for unmanaged function pointers

このうちinit専用セッターについてはクラスを1つ定義しておくと使えるようになります。これを使うなら自己責任ということになると思います。

以下の打ち消し線の記述はドキュメント更新前の古い情報です。
現在はRecord型やNative size integersに関しても問題なく使えます。C#8の非同期Disposeや非同期using、interfaceのデフォルト実装などの機能も使えるようになりました。

これ以外のC#9の機能はUnity2021.2では未サポートとされています。

以下の機能はドキュメント通りにコンパイルエラーが発生します。

  • init専用セッター
  • 共変戻り値
  • SkipLocalsInit
  • ModuleInitializer

このうちinit専用セッターについてはクラスを1つ定義しておくと使えるようになります。これを使うなら自己責任ということになると思います。

一方で、以下の機能は手元で試す限り問題なく動いているように見えました。

  • Records
  • Native sized integers
  • 非同期ストリーム(C#8)
  • 非同期Disposeと非同期using(C#8)
  • interfaceのデフォルト実装​(C#8)
  • IndicesとRanges(C#8)

レコード型や非同期ストリーム、非同期DiposeなどはUnityでも使いそうなので困ります。
公式には未サポートというリスクを承知で使うか使わないか判断することになると思います。

とは言いましたが正式サポートされている範囲だけだと使える機能が小粒すぎます。未サポートであることも目立たないページにこっそり書いてあるだけです。書けば動いてしまうので当たり前にrecordや非同期ストリームも使われていくことになる気がします。みんなで知見を積み上げていきましょう。

ライブラリのアップデート

Unity2021.2ではC#が8になっただけでなく、ライブラリも.NET Standard2.1または.NET Framework4.8に更新されています。これによってSpanやMemory、ValueTask、IValueTaskSourceなどの機能が追加のdllなしで使えるようになりました。

今回はC#9の紹介なので説明しませんがまたどこかでライブラリの更新についても紹介できればと思います。

UnityのInputSystemからQuest2のデバイスの取り扱い方を考える

はじめに

エンジニアの松原です。最近社内ではXRのハイスペックデバイスを使ったビジネス展開について営業や開発活動が活発になっております。以前に紹介された記事のように、Varjo XR-3には様々な可能性があり、社内では日々様々なエンジニアがこのデバイスに新たなユースケースの開拓にチャレンジしています。

Varjo XR-3以外にも、様々なデバイスを用いたビジネス検討は毎週のようにディスカッションされており、VRのみならず、AR/MR方面での技術検証やビジネス活用についての取り組みも活発化しています。

 

さて、これらのデバイスを用いてアプリケーションを作る際には、デバイスを動作させるためのソフトウェアライブラリであったり、サポートアプリケーション(SteamVRやOculus、上記のVarjo XR-3では別途Varjo Baseなどのアプリ)などが必要です。

ソフトウェアライブラリについては、VRの各プラットフォームで言えば統合パッケージであるOculus IntegrationSteamVR Pluginがイメージしやすく、2019年以前からUnityを使ってVRアプリケーションを制作したことがある方であれば、どちらかは使われたことがあると思います。

最近は各プラットフォームでOpenXR対応が進んでおり、統合パッケージを入れなくてもUnity公式が提供するXR Plugin ManagementをPackageManager経由でインストールし、セットアップすることでHMDとVRコントローラーの機能が利用できるようになっています。(ただし、パススルーやハンドトラッキングなどは2021年10月現在ではまだ対応に至っていない印象です。)

過去のOpenXRの動向などは以下の記事をお読みいただけるとイメージしやすいです。


一方、UnityではInputSystemという新しい外部入力デバイスを扱うライブラリが登場してしばらく経ちましたが、このInputSystemはただマウスやキーボード、ゲームパッドの入力操作の置き換わりというわけではなく、VRデバイスも扱えるように設計されており、前のシステムから根本的に異なっているようです。

本記事はそこに注目し、InputSystemを通してのVRデバイスの取り扱いについて触れ、手を動かす部分ではOculus Quest2を使って検証してみたいと思います。

 

VRデバイスとInputSystemとの関係について

前述のXR Plugin ManagementはXRデバイスとUnityの低レイヤーAPIとの橋渡しを行うためのライブラリとして存在しているため、実際にUnity上で使えるようにするにはコントローラーとして処理を実装する必要があります。
ある程度便利に組み込まれた状態で扱いたい場合はXR Interaction Toolkitのような、コントローラーとGUI間の処理を扱いやすく実装しているパッケージを導入して使うことが多いと思います。(XR Interaction Toolkitそのものの説明は今回割愛させていただきます。)

XR Interaction Toolkitのコードを追っていくと、Action-based~関連のクラスの実装にInputSystemの機能を使っており、HMDやVRコントローラーの特定デバイス向けの低レイヤーAPIを意識しないように設計されています。

XR Interaction Toolkitは今後Action-based(InputSystemのInputActionMap)の仕組みを利用することを掲げているので、InputSystemの理解を深めることは今後必要になってきそうです。

 

InputSystemからOculus Quest2のHMDの情報を取り出してみる

ここからは実際にInputSystemの機能を利用して、直接Quest2のHMDのデバイス検出やポジショントラッキングを行ったことについて書いています。

本記事で利用したUnityの環境などは以下の通りです。

  • Unity 2021.1.20f1
  • PackageManagerに追加したもの
    • XR Plugin Management 4.1.0
    • Oculus XR Plugin 1.10.0
    • Input System 1.1.1
  • Project SettingsのXR Plugin-ManagementでOculusを有効化

f:id:fb8r5jymw6fd:20211023174802p:plain

 

以下のコードが書かれたスクリプトを追加し、適当なGameObjectにこのスクリプトを追加します。

using UnityEngine;
using UnityEngine.InputSystem;

public class InputSystemDeviceDetector : MonoBehaviour
{
private void Awake()
{
InputSystem.onDeviceChange += OnDeviceChange;
}

private void OnApplicationQuit()
{
InputSystem.onDeviceChange -= OnDeviceChange;
}

private void OnDeviceChange(InputDevice inputDevice, InputDeviceChange inputDeviceChange)
{
switch (inputDeviceChange)
{
case InputDeviceChange.Added:
OnDeviceAdded(inputDevice);
break;
case InputDeviceChange.Removed:
OnDeviceRemoved(inputDevice);
break;
}
}

private void OnDeviceAdded(InputDevice inputDevice)
{
Debug.Log($"Device Added: {inputDevice.displayName}");
}

private void OnDeviceRemoved(InputDevice inputDevice)
{
Debug.Log($"Device Removed: {inputDevice.displayName}");
}
}

 

スクリプトを追加後、OculusQuest2をOculusLinkでPCに接続した状態で実行します。

実行時にいくつかログが返ってきます。Oculus Quest2となっているものがQuest2のHMDデバイスに相当します。Controllerとつくものは左右のコントローラになります。

f:id:fb8r5jymw6fd:20211023133924p:plain

 

さらにOnDeviceAdded()のメソッドに以下のように1行追加し、再度実行してみます。

...
private void
OnDeviceAdded(InputDevice inputDevice)
{
Debug.Log($"Device Added: {inputDevice.displayName}");
Debug.Log(inputDevice.description.ToJson()); // <== 追加する箇所
}
...

 

実行するとJson形式でいくつかログが返ってきます。

f:id:fb8r5jymw6fd:20211023142242p:plain

このJsonにはデバイスの概要が含まれており、capabilitiesの箇所にはデバイスの詳細が入っています。さらにcapabilitiesをJsonとして整理したものは以下の図になります。全部で300行ぐらいあるので、以降の内容は省略します。

f:id:fb8r5jymw6fd:20211023144047p:plain

 

HMD(デバイス名の上ではOculus Quest2)として認識されているデバイスのcapabilitiesの中身になります。characteristicsはInputDeviceCharacteristicsの値と一致しています(HeadMounted = 1, TrackedDevice = 32)

さらにinputFeaturesに含まれている各項目の一部はCommonUsagesと一致しており、デバイスの入力の機能で何が利用できるか記述されています。

この中にCenterEyePositionとCenterEyeRotationが含まれているので、ほぼHMDとして認識しているのは間違いないかと思います。

 

余談ですが、非VRデバイスの場合、capabilitiesが空文字になっていたり、以下のように上記のものとは別の構造になっています。(下の画像はPS4のコントローラを接続したいに取得したcapabilitiesになります)

f:id:fb8r5jymw6fd:20211023152006p:plain

 

Oculus Quest2のHMDデバイス検出時にヘッドトラッキングを行う処理を追加する

HMDデバイスを認識できるようになったので、デバイス検出時にヘッドトラッキングできるようにします。

以下のスクリプトを新しく追加します。

using UnityEngine;
using UnityEngine.InputSystem;
using CallbackContext = UnityEngine.InputSystem.InputAction.CallbackContext;

public class HMDController : MonoBehaviour
{
private readonly InputAction positionAction = new InputAction(binding: "<XRHMD>/centereyeposition");
private readonly InputAction rotationAction = new InputAction(binding: "<XRHMD>/centereyerotation");

public void Activate()
{
positionAction.Enable();
rotationAction.Enable();
positionAction.performed += OnPositionUpdate;
rotationAction.performed += OnRotationUpdate;
}

public void Deactivate()
{
positionAction.Disable();
rotationAction.Disable();
positionAction.performed -= OnPositionUpdate;
rotationAction.performed -= OnRotationUpdate;
}

private void OnPositionUpdate(CallbackContext context)
{
transform.position = context.action.ReadValue<Vector3>();
}

private void OnRotationUpdate(CallbackContext context)
{
transform.rotation = context.action.ReadValue<Quaternion>();
}
}

 

このスクリプトをカメラのコンポーネントを持っているGameObjectに追加します。(Main Cameraなどが良さそうです)

f:id:fb8r5jymw6fd:20211023172423p:plain

 

また、InputSystemDeviceDetector.csの中身も少し書き換えます。先ほどのスクリプトを参照できるよう、SerializeFieldアトリビュートを付けたローカル変数をコードの最初の方に書き加えます。

using UnityEngine;
using UnityEngine.InputSystem;

public class InputSystemDeviceDetector : MonoBehaviour
{
[SerializeField] // <== 追加する箇所
private HMDController hmdController; //

private void Awake()
...

 

OnDeviceAdded()やOnDeviceRemoved()のメソッドの中身を書き換え、ContainsControl()メソッドを追加します。

...
private void OnDeviceAdded(InputDevice inputDevice)
{
Debug.Log($"Device Added: {inputDevice.displayName}");
if (ContainsControl(inputDevice, "centereyeposition") && // <== 追加する箇所
ContainsControl(inputDevice, "centereyerotation")) //
{ //
hmdController.Activate(); //
} //
}

private void OnDeviceRemoved(InputDevice inputDevice)
{
Debug.Log($"Device Removed: {inputDevice.displayName}");
if (ContainsControl(inputDevice, "centereyeposition") && // <== 追加する箇所
ContainsControl(inputDevice, "centereyerotation")) //
{ //
hmdController.Deactivate(); //
} //
}

private bool ContainsControl(InputDevice device, string controlName) // <== 追加する箇所
{ //
return device.TryGetChildControl(controlName) != null; //
} //
}

 

書き換え終わったらHMDController.csのスクリプトを追加しているGameObjectをInspectorからアタッチします。

f:id:fb8r5jymw6fd:20211023173910p:plain

 

あとは適当にシーンを整えて実行するとヘッドトラッキングが行えるようになっていると思います。

f:id:fb8r5jymw6fd:20211023174138p:plain

 

なぜこのように実装できるのか

細かいコードの解説までは省きますが、Oculus XR Plugin(1.10.0)ではInputSystemのLayoutsの設計に従ってデバイスを利用できるように作られているようです。分かりやすく言うと、Oculusのデバイスはプラグインの設計によりゲームコントローラ等と同様にInputSystemから直接扱えるようになっています。

さらに、InputSystemを使った各入力の取得についてになりますが、認識したデバイスは複数のInputControlの集まりとしてみなされており、それぞれはボタンやジョイスティックなどの部品単位で定義されており、InputControlPathという概念で識別できるようになっています。

例えば、Quest2のCenterEyePositionのInputControlPathは以下のようになっています。

/OculusQuest2/centereyeposition

CenterEyePositionはVector3型の値を持つので、さらに下に3つのパスを持ちます。

/OculusQuest2/centereyeposition/x

/OculusQuest2/centereyeposition/y

/OculusQuest2/centereyeposition/z

Quaternion型の値を持つCenterEyeRotationはxyzに加え、wのパスを持つようです。

/OculusQuest2/centereyerotation/x

/OculusQuest2/centereyerotation/y

/OculusQuest2/centereyerotation/z

/OculusQuest2/centereyerotation/w

これらのパスの概念はOpen Sound Controlのアドレスがイメージに近いかもしれません。

認識したデバイスが有効化されている場合、デバイスは指定されたパスに対して値を送り続けるようです。読み取り側はこの情報を利用し、InputActionのbindingに取得したい入力部品のパスを指定します。そしてEnable()を呼び出すことにより、指定したパスの値変更の監視を行い、センサーやジョイスティックの値を取得します。

このように、InputSystemではデバイスを個々の部品に分けて定義することができ、VR機器でもInputSystemの仕組みに則ることでゲームコントローラーと同じように扱うことができるようになっています。

VRデバイスがInputSystemで扱えるようになった理由

ここからは憶測になりますが、Unityが当初掲げていたXRプラグインフレームワークの内部設計を整理している最中に、非VRデバイスとの入力を共通化する設計が追加されたのかもしれません。

その共通化のためにInputSystemが候補に挙がり、VRデバイスもInputSystemを経由して利用できるように変更があったのではないかと考えています。

以下は2021年10月現在のOculus XR PluginとInputSystemベースのシステムのフレームワーク間のイメージになります。

f:id:fb8r5jymw6fd:20211023185134p:plain

Unity XR Tech Stackの図からだいぶ離れてきているイメージがあるので、情報のアップデートを期待したいところです。 

最後に

2021年10月現在のUnityを使ったVR/XR関連の開発はかなり流動的で、以前のVRアプリの開発手法とはだいぶ変わってきています。その時点での流行り廃りもありますので、定期的に知識のアップデートは今後も必要になってきそうです。

PMBOK 7th 勉強会 第3回【Section3: プロジェクトマネジメント原則】前半

エンジニアの岡村です。PMBOK 7thの勉強会も第三章に突入しました。

今回読む3章は、前後半に分かれているPMBOK 7thの、前半の最終章です。その規模は前2章と比べて倍はあるため、今回は前後編に分け、前編をお届けします。

  • The Standard for Project Management
    • Introduction
    • System for Value Delivery
    • Project Management Principles <- 今回やるところ
  • A Guide to the Project Management Body of Knowledge
    • Project Performance Domains
    • Tailoring
    • Models, Methods, and Artifacts

PMBOKとは

PMBOK(Project Management Body of Knowledge)とは、PMI(Project Management Institute)が出版している、プロジェクトマネジメントに関するノウハウや手法を体系化してまとめた本です。

1996年の初版出版以来、4年に1度くらいの頻度で改訂が繰り返されており、2021年8月に第7版(英語)が出版されました。

Section3: プロジェクトマネジメント原則

PMBOKのSection3では、プロジェクトマネジメントにおける12の原則を一つづつ定義しています。それらは4つの価値観に基づいて作られています。

  • Responsbility(責任)
  • Respect(尊敬)
  • Fairness(公正)
  • Honesty(誠実)

以下に12の原則を簡単に紹介していきます。これらの原則は、プロジェクトに関わる色々な立場の人々の行動の指針となることを目的としています。

1/12 勤勉さ、敬意、思いやりをもって務める

社内外のガイドラインを遵守し、誠実さ、配慮、信頼性をもって責任ある行動を取ることが求められます。また、プロジェクトの財務的、社会的、環境的な影響に対して責任を持つ必要があります。

この章ではStewardshipについて説明しています、Stewardshipは、「管理」や「責任」といった訳が当てられることが多いようです。

また、Stewardshipには組織内におけるものと、組織外におけるものの二種類があります。

組織内においてはビジョン、ミッション、バリューに沿って活動する事といった組織全体で大事な事もあれば、指導的立場においての説明責任や権限の適切な運用に対する責任も含まれています。

そして、組織外においてはステークホルダーとの関係を始めとし、自然環境や社会コミュニティ、地域や産業に対する影響に対する責任についても言及されています。

2/12 プロジェクトチームの協力的な環境を作る

プロジェクトチームには様々なスキルや知識、経験を持った人がいます。そして、協力的に共同作業を行うプロジェクトチームは、個人で作業するよりも効果的、効率的に目的を達成することが出来ます。

協力的なチーム環境を作るには、チームの行動規範について予め合意を取っておく事、適切な組織構造を作って継続的に調整する事(これには定例会議の他、役割や責任も含まれます)、WBSやバックログといった形でプロセスを可視化する事が必要です。

プロジェクトチームには様々な事情のメンバーが参加し、多様性が上がるほど纏め上げることは困難になりますが、協力的な環境が出来ることで、情報や個人の知識の自由な交換が促進されます。これにより、メンバー全員がプロジェクトの成果を出す事に集中できる上に、メンバー自身の成長を促進することが出来るようになります。

3/12 ステークホルダーと効果的に連携する

ステークホルダーはプロジェクトの成功と顧客満足に必要な範囲で積極的に巻き込みましょう。

この章ではステークホルダーについて説明しています。ステークホルダーは、ポートフォリオ、プログラム、プロジェクトの意思決定、活動、成果に影響を与える、もしくは影響を受ける可能性がある個人、グループ、組織と紹介されています。

ステークホルダープロジェクトの様々な側面に影響を与えますが、それだけではなく、スコープや要求事項、スケジュール、コスト、チーム、計画、支援、文化、目標、リスク、品質、成功の定義と評価に関与します。

ステークホルダーと積極的にエンゲージメントを行う(関りを持つ)ことが重要です。エンゲージメントには、考えを認識し、他の視点を吸収し、共同で問題解決策を考える事が含まれるほか、頻繁な双方向のコミュニケーションによる強固な関係の構築と維持が含まれます。これには対人スキルが必要となります。

また、プロジェクトに対して好意的でないステークホルダーが居る事もありますが、そのステークホルダーが持つ関心や懸念、権利を理解することで、交渉やサポートによって懸念に対処することができ、結果としてプロジェクトの成功率を引き上げます。

4/12 価値に注力する

ビジネスの目的や意図する利益・価値に対するプロジェクトの整合性を継続的に評価し、必要に応じて調整しましょう。

この章では価値について説明しています。価値とは顧客・エンドユーザー視点における成果を含み、プロジェクトの究極の成功指標であり、推進力となります。価値は金銭的なものを含みますが、それだけではなく、社会的な利益や顧客が感じた利益、プログラムの一部である場合はプログラムに対する貢献が含まれることもあります。

また、価値は主観的なものです。同一の概念でも人や組織によってその価値は変わります。すべてのプロジェクトには様々なステークホルダーが存在し、それぞれの価値も異なります。その為、顧客視点を優先しつつも、ステークホルダー毎に異なる価値を考慮し、全体でのバランスを取る必要があります。

より高い価値を実現する為には、成果物だけではなくその目的に焦点を移す必要があります。例えば成果物がソフトウェアだとして、そこにソフトウェアの使い方のトレーニングやコーチングという別の成果物がセットになることにより、価値を引き上げることが出来ます。このように、プロジェクトチームやステークホルダーは、成果物と、それが持つ目的の両方を理解する必要があります。

5/12 システムの相互作用を認識し、評価し、対応する

プロジェクトを円滑に進めるためには、プロジェクトの内外の状況を認識し、評価し、対応する必要があります。

一般的にシステムとは、相互に依存しあう構成要素の集合体であり、全体として統一された存在として機能するものです。プロジェクトはシステムの特徴を持っています。プロジェクトチームは、プロジェクトを細かな部品からなるシステムとして捉え、全体像を認識する必要があると述べています。

システム思考を進めることで、プロジェクトを取り巻く不確実性やリスクに素早く対応することができ、危機を事前に回避することができます。

ここではシステム思考という言葉が出てきています。システム思考は体系化されており、以下のように専門の本も出版されています。

6/12 リーダーシップを発揮する

プロジェクトには効果的なリーダーシップが求められます。一般的な業務は役割や責任が明確にされていますが、プロジェクトには普段交流のない複数の組織や部門が関わってくることがよくあります。さらに、プロジェクトでは通常の業務よりも大きなリスクとリターンが伴うことがあります。その結果として、プロジェクトに影響を与えようとするマネージャー等ステークホルダーの数が増え、混乱や対立が生じることも少なくありません。その規模にかかわらず円滑に進んでいるプロジェクトでは、一般的なプロジェクトよりも多くの人が頻繁にリーダーシップを発揮しています。

リーダーシップとは、プロジェクト内外の人々に望ましい結果をもたらす為の態度、才能、正確、行動などを指します。これは特定の役割に限定されず、プロジェクトに携わる誰もが発揮することが出来、チームのパフォーマンスを高め、成果を出すことができます。多くの人がプロジェクトに影響を与えようとすると、ふつう対立や混乱が生じますが、パフォーマンスの高いプロジェクトでは、それぞれが補完的にリーダーシップを発揮しています。

リーダーシップは権限と混同してはいけません。権限を利用して人に影響を与えたり、動機づけたり、指示したりすることは出来ます。しかし、共通の目標に向けてグループを動機付け、人々の結束を促し、個人としてではなく、プロジェクトチームとして成功を収めるにはリーダーシップが必要不可欠です。


残り6の原則は後編に回します!

振り返り

3章に入ってから物量が増えてきたのもあって、一段落ずつ皆で読んでいては中々進まなくなってきました。そこで、3章中盤からは内容を事前に読みつつ、見出し毎に担当を割り振って前もって要約してもらい、勉強会では気になった点を話し合う形に変更しました。結果として各メンバーの負担が少し増えるものの、集まった時の話し合いがより深い理解に繋がったと思います。

次回予定

次回はSection3の後半をお届けします!