投げる

ドラッグ処理

 今回は投げる処理を作っていきます。
function OnGUI(){
  var e : Event = Event.current;
  if (e.type == EventType.MouseDown){
    //ドラッグ開始
  }else if (e.type == EventType.MouseDrag){
    //ドラッグ中
  }else if (e.type == EventType.MouseUp){
    //投げた時
  }
}
 大雑把ですが上がおおまかな流れになります。
 

OnGUI()

 Update() は使えません。
 エラーが出ます。
 試しに e のログを出してみると Null となっているので、何らかの操作をしなければ利用不可能のようです。
 あとはイベントタイプに応じて処理の分岐をしてあげればよいと思います。

クリック位置を三次元座標に変換する


 画面の大きさに関わらず同じ結果を得る必要があるので、スクリーン座標をゲーム内部座標へ変換してあげます。
  var ray : Ray = Camera.main.ScreenPointToRay(e.mousePosition);
 Ray というのは1つの座標と方向ベクトル(単位ベクトル)をもつ構造体です。
 上の命令で、Camera > Clipping Planes > Near 面(右の赤線が示す四角)上の座標とカメラが向いている方向を取得できます。
var startPos : Vector3;
var endPos : Vector3;
...
function OnGUI(){
  var e : Event = Event.current;
  var ray : Ray = Camera.main.ScreenPointToRay(e.mousePosition);
  if (e.type == EventType.MouseDown){
    startPos = ray.origin;
    endPos = ray.origin;
  }else if (e.type == EventType.MouseDrag){
    endPos = ray.origin;
  }else if...
...
}
 ここまでの内容を利用してドラッグの開始位置と終了位置を求めることができます。

力を加える前に

 力を加える対象となるボールを取得しておきます。
var ball : GameObject;
function Start(){
  ball = GameObject.Find("Ball");
}
 Ball という名前を持つゲームオブジェクトを探して格納しています。
function Update(){
  if (ball.transform.position.y < -2){
    Application.LoadLevel("Sample");
  }
}
 ついでに前回作ったリセット処理を加えておきます。

力を加えます

  }else if (e.type == EventType.MouseUp){
    ball.rigidbody.AddForce(Vector3.Scale((endPos - startPos), Vector3(1, -1, 1)) * 50);
  }
 基準となるベクトルは終了位置から開始位置を引いたものです。
 Y座標が反対になっているので (1, -1, 1) ベクトルをかけて反転させています。
 最後にかけてある数字はパワーの増幅です。ないとパワーが弱すぎて動きません。
 ゴルフクラブを作りショットに変化を与えるのは、この2つの数値が影響していると思います。

止まるまで触ってはいけません

 このままですとボールが浮いている間も力を加えることが出来てしまいます。
 そういうゲームもありますが、今回は静止するまで力を加えることが出来ないようにします。
  }else if (e.type == EventType.MouseUp){
    if (ball.rigidbody.IsSleeping()){
      ball.rigidbody.AddForce(Vector3.Scale((endPos - startPos), Vector3(1, -1, 1)) * 50);
    }
  }
 力を加える処理をオブジェクトが停止した状況でのみ許可しています。
 ここまででゲームになっていますが、ドラッグ量を目視できるようにしてプレイヤーに優しい環境を構築したいと思います。