かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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弱者は辛い。