0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

16日目:気球から学ぶとグループID

Last updated at Posted at 2020-12-21

この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の16日目の記事です。

今回の内容

今回は以下のようなボタンで上下できる気球を作成したいと思います。
UP用のボタンを押すと上に加速し、DOWN用のボタンを押すと下に加速します。押した分だけどんどん速度が上がります。
balloon_2.gif

今回は学ぶ技術は以下となります。
 ・JOINT
 ・グループID

※今回作成したコードではマルチで正しく動きません。次回の記事でマルチ対応版に修正予定です

気球とボタンを一緒に動かす方法

今回はボタンで気球の上下移動を制御したいため、ボタンが気球と一緒についてくる必要があります。
一緒に動かしたいものに機能がない場合は気球の子オブジェクトにしてしまえば一緒に動きます。

しかし、今回のケースではボタンを子オブジェクトにすると、UPボタンを押してもDOWNボタンを押してもグリップしたときにonUseに入ってくる名前が気球の名前になってしまい、どのボタンが押したか見分けることができません。
そのため、ボタンは気球の子オブジェクトではなく独立したSubItemとして作成する必要があります。

上記のように「独立したSubItemを一緒に動かしたい」というときに役立つのがJOINTの機能です。詳細は以下の公式ページを参照ください。
 ・Joint (UnityComponent)
私は主になにかにボタンを付けたいときなどによく使用しています。

UnityでのJOINTの設定

今回は相対位置を固定して動かしたいためFixedJointを使用します。
まずは今までと同様の手順で気球とUP用のボタン、DOWN用のボタンを作っていきます。
image.png

ここままでは一緒に動いてくれないためJOINTの設定をします。
2つのボタンオブジェクトを選択し、InspectorのaddComponentから「FixedJoint」を追加します。
するとFixedJointの項目が追加されますので、一番上のConnectedBody(どのオブジェクトに合わせて動かすかの設定)に気球のSubitemをD&Dします。
そのほかの設定もありますが、とりあえず一緒に動かすだけならいじる必要はありません。

設定後は以下のようになります。
image.png

グループIDの設定

Jointの設定は以上ですが、現在の状態では他の人がボタンを押したときに気球が動きません。
ボタン自体は掴んだ際に所有権が移りますが、気球はつかめず所有権が移らないためです。
上記を解決するためにはグループIDという機能を使います。詳細は以下の公式ページを御覧ください。
 ・ 所有権とイベント関数の関係
簡単に言うと複数のSubItemを常に同じ人が所有権を持っているようにする機能です。

グループIDの設定はSubitemの部分にあります。
今回は気球と2つのボタンにグループIDの1を設定しました。
image.png

コードの作成

JOINTとグループID自体はスクリプトは必要ありませんが、
ボタンを押して上下のスピードを変える部分とスピードに応じて気球の位置を変える部分の2つ処理がありますのでそれを書いていきます。
(今回の内容と関係ない処理は省略しています。)

まずはボタンによってスピードを変える部分です。
こちらは特に新しい内容もないので簡単だと思います。

--気球の速度。+だと上に、-だと下に進む。
local BalloonSpeed = 0

function onUse(use)
  if use == "Button_Balloon_Up" then
    BalloonSpeed = BalloonSpeed + 1
  end
  if use == "Button_Balloon_Down" then
    BalloonSpeed = BalloonSpeed - 1
  end
end

次にスピードに応じて気球の位置を変える部分です。
地面を突き抜けないように、座標が0以下になった場合に修正する処理も入れています。

function updateAll()
  local balloon = vci.assets.GetTransform("HotAirBalloon")
  --バルーンの所有権を持っていたら
  if balloon.IsMine then
    --移動先の座標を算出する。0.01の部分は調整用の係数で、実際の動きを見ながら適切な値を設定。
    local nextPos = balloon.GetPosition()+Vector3.up*BalloonSpeed*0.01
    
    --移動先の座標が地中(y<0)なら地上で停止させるにする。(地中に埋まらないようにする処理)
    if nextPos.y < 0 then
      nextPos.y = 0
      BalloonSpeed = 0
    end

    balloon.SetPosition(nextPos)
  end
end

以上で作成完了です。

終わりに

いかがでしたでしょうか?
今回の方法ではスピードの情報を各自が持っているため、複数人でボタンを触るとスピードが維持されない状態となってしまいます。
次回のSTATEを使って上記の解決をしていこうと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?