読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

CharacterControllerを使ってクリックした位置まで物体を移動させる

Cube(地面用)とCube(動かす用)の2個を配置して動かすほうのCubeにCharacterControllerを追加します。

んで、コードも追加して以下のように書くと動いた。

using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
{
    /// <summary>
    /// 目的地
    /// </summary>
    private Vector3 goal;
    /// <summary>
    /// キャッシュ用
    /// </summary>
    private CharacterController controller;

    // Use this for initialization
    void Start()
    {
        // とりあえずのゴールは現在地
        this.goal = transform.position;
        // CharacterControllerをキャッシュしとく
        this.controller = this.GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // 移動速度
        Vector3 velocity = Vector3.zero;
        if (this.controller.isGrounded)
        {
            // 地面についてたら
            if (Input.GetButtonDown("Fire1"))
            {
                // 現在のマウスの位置から地面にRayを飛ばしてゴールの場所を特定する
                var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit info;
                if (Physics.Raycast(ray, out info))
                {
                    this.goal = info.point;
                }
                else
                {
                    // ぶつからなかったら何もしない
                    return;
                }
            }

            if (Vector3.Distance(goal, transform.position) < 0.5f)
            {
                // ゴールと今の場所が近かったら何もしない
                return;
            }

            // ゴールと現在地の差分を正規化して
            var direction = (this.goal - transform.position).normalized;
            // 速度をかけて
            velocity = direction * 5.0f;

            // 一応ジャンプも考慮して
            if (Input.GetButton("Jump"))
            {
                velocity.y = 60.0f;
            }
            else
            {
                velocity.y = 0;
            }

        }

        // 重力を加味して
        velocity.y -= 20.0f;

        // 移動
        this.controller.Move(velocity * Time.deltaTime);

        // 物体を目的地のほうに向ける
        transform.LookAt(this.goal);
    }
}

くっそ苦労したなぁ…。Unity弱者は辛い。