2014年7月23日水曜日

【Unity、UniRx】マウス操作でオブジェクトをグリグリ回す


@Baiteen

ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。その3。

やりたいこと

ReactiveExtensionsを使ってマウス操作でオブジェクトをグリグリ回す 。
ホントは【Unity】タッチ操作でオブジェクトをグリグリ回すみたいにタッチでやりたかったんだけど、実機がないのでマウス操作にしました。コードはもちろん丸パクリ。
プロジェクトの構成は【Unity、UniRx】ダブルクリックを検知するのスクリプトを変えただけ。
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UniRx;

public class TestScript : ObservableMonoBehaviour {

  /// 回転速度
  public float Speed = 0.01f;

  ///  RXのサンプルがAwakeだったので、ここに書きました。 
  public override void Awake ()
  {
    //参考サイト:http://neue.cc/2010/07/28_269.html

    //マウスドラッグを監視。マウス位置を値として発行してもらう
    var dragObservable = OnMouseDragAsObservable().Select(_ => Input.mousePosition);
    //マウス位置付きマウスドラッグ
    dragObservable
    //次の値が発行されるまで待って差分を値として発行
    .Zip(
      dragObservable.Skip(1)
      , (p1,p2) => new {x = p2.x-p1.x, y = p2.y-p1.y}
    )
    //値が発行されたら回転処理
    .Subscribe(deltaPosition => {
      //移動量に応じて角度計算
      float xAngle = deltaPosition.y * Speed * 10;
      float yAngle = -deltaPosition.x * Speed * 10;
      float zAngle = 0;

      //回転
      this.transform.Rotate(xAngle, yAngle, zAngle, Space.World);
    });

    // If you use ObservableMonoBehaviour, must call base method ← サンプルにこう書いてますので、そのまま。
    base.Awake ();
  }
}

うに部屋から埋め込みタグを取得できるようになったのでちょっと埋め込んでみる。
Hosted by UnityRoom.com

しまった。
これだと、ドラッグやめても最後のマウスの位置覚えてて動きがおかしい。
マウスアップで一旦終わらせて、それを繰り返すように修正
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UniRx;

public class TestScript : ObservableMonoBehaviour {

  /// 回転速度
  public float Speed = 0.01f;

  ///  RXのサンプルがAwakeだったので、ここに書きました。 
  public override void Awake ()
  {
    //参考サイト:http://neue.cc/2010/07/28_269.html

    //マウスドラッグを監視。マウス位置を値として発行してもらう
    var dragObservable = OnMouseDragAsObservable().Select(_ => Input.mousePosition);
    //マウス位置付きマウスドラッグ
    dragObservable
    //次の値が発行されるまで待って差分を値として発行
    .Zip(
      dragObservable.Skip(1)
      , (p1,p2) => new {x = p2.x-p1.x, y = p2.y-p1.y}
    )
    //マウスアップで一旦監視終了
    .TakeUntil(OnMouseUpAsObservable())
    //このままだと1回しかぐりできないから、繰り返す
    .Repeat()
    //値が発行されたら回転処理
    .Subscribe(deltaPosition => {
      //移動量に応じて角度計算
      float xAngle = deltaPosition.y * Speed * 10;
      float yAngle = -deltaPosition.x * Speed * 10;
      float zAngle = 0;

      //回転
      this.transform.Rotate(xAngle, yAngle, zAngle, Space.World);
    });

    // If you use ObservableMonoBehaviour, must call base method ← サンプルにこう書いてますので、そのまま。
    base.Awake ();
  }
}

Hosted by UnityRoom.com

いい感じの動きになった。
うに部屋の使い方これであってんのかな?
動作サンプルは自動ツイートされると恥ずかしいな。新着ゲームにも出てくると恥ずかしいな。


スポンサーリンク

Related Posts Plugin for WordPress, Blogger...