この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の記事です。
今回の内容
テーマパークと言えばマスコットキャラが不可欠かと思います。そのため今回マスコットキャラ「ハンバーグマ」を作成しました。
ただ、現在のままではマスコットキャラクターなのにゲスト側を向いてくれていない愛想の悪い状態になってます。
そのため、今回はこちらのキャラクターを常に自分の方向を向くようにしていきたいと思います。
今回は学ぶ技術は以下となります。
・オブジェクトを自分の方向を向かせる方法
Unity概要
Unityは特に複雑な設定はありません。
ただし、Room内のユーザーそれぞれの方向を向くようにしたいため、同期するSubItemでなく同期しない子オブジェクトとして作成します。
コードの作成
オブジェクトの回転はQuaternionを使用して設定します。Quaternionの使い方については以下のページを御覧ください。
・Quaternion
今回はLookRotationという関数を使います。
LookRotationはオブジェクトを指定の方向に向かせる関数であり、第1引数にオブジェクトの正面となるのベクトル、第2引数に上となるベクトルを指定します。
以下のようなイメージです。
今回はY軸の回転のみ考えればよいため、上となるベクトルはY方向に真上のベクトルで作成します。
正面のベクトルですが、こちらはキャラクターとアバターの位置(Y座標は無視)から計算する必要があります。
以下のようなイメージ(上からの俯瞰図)です。おそらくみなさん昔やったベクトルの引き算です。
コードは以下のようになります。
function updateAll()
--キャラクター・アバター情報の取得
local chara = vci.assets.GetTransform("SD_hamburgmer")
local avatar = vci.studio.GetLocalAvatar()
-- 最初の読み込み時はGetPosition()が取れないのでチェックして弾いている
if avatar and avatar.GetPosition() then
local direction = avatar.GetPosition() - chara.GetPosition()
--キャラクターの向く向きを計算
local up = Vector3.__new(direction.x,0,direction.z)
local forward = Vector3.up
local lookAt = Quaternion.LookRotation(up,forward)
--キャラクターの向きを設定
chara.SetRotation(lookAt)
end
end
実際に動かすと以下のようになります。
ちょべりパークにマスコットキャラがやってきました!٩( 'ω' )و pic.twitter.com/YESw9XSoiU
— #らいと(きょろ、ちょべりば→ぐ) (@lightjug) December 27, 2020
終わりに
いかがでしたでしょうか?
今回はZ軸方向は無視しましたが、アバターの身長に合わせて首の角度も変えることも出来ると思います。
また、待機用のアニメーションなどを設定するとより自然な状態に見えるのではないかと思います。、
次回の内容は未定です。