unity中让物体移动到鼠标点击地面任一点的位置(单击移动和双击暂停移动)并生成图标

using UnityEngine;

using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ManualRoam
{
    private static ManualRoam mouse_this;
    public static ManualRoam Instance()
    {
        if (mouse_this == null)
        {
            mouse_this = new ManualRoam();
        }
        return mouse_this;
    }


    private Vector3 targetVector3;
    public float movespeed = 1.5f;
    private bool IsOver = true;
    public GameObject player;
    public Camera firstCamera;
    float sensitivityX = 1f;
    //控制视野缩放的速率
    private float sensitivetyMouseWheel = 10f;
    private float maximum = 130;
    private float minmum = 50;
    //定义控制人物
    private float rotateSpeed = 45f;
    private float playerMoveSpeed = 2.5f;
    //鼠标双击的参数
    private float delay = 0.5f;
    private float _firstClickTime = 0;
    private bool _oneClick = false;      //点击了第一下
    public  bool IsMove;
    //UI防止穿透定义
    private GraphicRaycaster graphicRaycaster;
    private EventSystem eventSystem;

    float YDistance = 1.823f;
    public ScreenView_1Main screenView_1Main;
    public void Awake(GameObject _player, GameObject cam,ScreenView_1Main _this)
    {
        //YDistance = y;
        //Debug.LogError("YDistance = " + YDistance);
        //第一人称赋值
        player = _player;
        firstCamera = cam.GetComponent<Camera>();
        targetVector3 = _player.transform.position;
        screenView_1Main = _this;
        //发现组件
        graphicRaycaster = GameObject.Find("CanvasUI").GetComponent<GraphicRaycaster>();
        eventSystem = GameObject.Find("EventSystem").GetComponent<EventSystem>();
        //player = GameObject.Find("Player");
        //firstCamera = player.transform.Find("playerCamera").GetComponent<Camera>();
        allmouseIcon=new List<GameObject>();
    }

    private RaycastHit hitInfo;
    public void Update()
    {
        if (CheckGuiRaycastObjects())
            return;
        screenView_1Main.my_mouseController.SetRoamPoint (player.transform.position);

        //当player的距离和箭头的距离小于0.5的时候,销毁掉箭头
        foreach (var kk in allmouseIcon) 
        {
            if (kk != null) 
            {
                if (Vector3.Distance(kk.transform.position, new Vector3 (player.transform.position.x, 0.1f, player.transform.position.z)) < 0.5f)
                {
                    GameObject.Destroy (kk);
                }
            }
        }  
        if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
        {

            if (_oneClick && Time.time - _firstClickTime < delay)
            {
                //双击
                _oneClick = false;
                IsMove = false;//移动暂停
            }
            else
            {
                //Debug.LogError("here");
                _oneClick = true;
                IsMove = true;//开始移动
                _firstClickTime = Time.time;
                //1. 获取鼠标点击位置
                //创建射线;从摄像机发射一条经过鼠标当前位置的射线
                Ray ray = firstCamera.ScreenPointToRay(Input.mousePosition);
                //发射射线
                hitInfo = new RaycastHit();
                if (Physics.Raycast(ray, out hitInfo))
                {
                    //Debug.LogError("hitInfo.collider.tag = " + hitInfo.collider.name);
                    //Debug.LogError("hitInfo.collider.name = " + hitInfo.collider.name);
                    //获取碰撞点的位置
                    if (hitInfo.collider.tag == "Ground")
                    {
                        //Debug.LogError(hitInfo.collider.name);
                        targetVector3 = hitInfo.point;

                        //Debug.LogError("hitInfo.point = " + hitInfo.point);
                        //Debug.LogError("距离为:" + Vector3.Distance(player.transform.position, hitInfo.point));
                        targetVector3.y = targetVector3.y + 1.5f; ;
                        //朝向点击位置
                        player.transform.LookAt(targetVector3);

                    
                        GameObject.Destroy(mouseIcon);
                        foreach (var kk in allmouseIcon) 
                        {
                            GameObject.Destroy (kk);    
                        }  
                        allmouseIcon.Clear();
                        CreateMousePoint(hitInfo.point);

                    

                        IsOver = false;
                    }

                }
                Debug.DrawLine(ray.origin, hitInfo.point, Color.red);//画出射线
            }
        }
        if (IsMove == true)
        {

            // Debug.Log("m_Play" + m_Play);
            //2. 让角色移动到目标位置

            MoveTo(targetVector3);
           
        }


        player.GetComponent<Rigidbody>().velocity = Vector3.zero;

        if (Input.GetMouseButton(1))
        {
            if (player == null)
                return;
            //视角移动
            player.transform.Rotate(0, -Input.GetAxis("Mouse X") * sensitivityX, 0);
        }
    }
    //UI射线无响应
    bool CheckGuiRaycastObjects()
    {
        PointerEventData eventData = new PointerEventData(eventSystem);
        eventData.pressPosition = Input.mousePosition;
        eventData.position = Input.mousePosition;

        List<RaycastResult> list = new List<RaycastResult>();
        graphicRaycaster.GetComponent<GraphicRaycaster>().Raycast(eventData, list);
        //Debug.LogError("list.Count = " + list.Count);
        return list.Count > 0;
    }
    public void FixedUpdate()
    {
        //手动控制移动
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        //朝一个方向移动   new Vector3(h, 0, v) * playerMoveSpeed * Time.deltaTime是个向量
        player.transform.Translate(new Vector3(0, 0, v) * playerMoveSpeed * Time.deltaTime);
        player.transform.Rotate(new Vector3(0, h, 0) * rotateSpeed * Time.deltaTime);
    }
    //让角色移动到目标位置
    private void MoveTo(Vector3 tar)
    {
        if (!IsOver)
        {
            Vector3 offSet = tar - player.transform.position;

            player.transform.position += offSet.normalized * movespeed * Time.deltaTime;

            if (Vector3.Distance(tar, player.transform.position) < 0.5f)
            {
                IsOver = true;
                player.transform.position = tar;

            }
        }
    }
    //创建鼠标点击点的图标及移动动画
    private GameObject mouseIcon;
    public List<GameObject> allmouseIcon;
    private void CreateMousePoint(Vector3 pos)
    {
        Vector3 disnum;
        Vector3 tempOrigin = new Vector3 (player.transform.position.x, 0.1f, player.transform.position.z);
        screenView_1Main.myEquipSearch.isshoudongfollow = false;
        if (Vector3.Distance (tempOrigin, pos)>=12) 
        {
            for (int i = 0; i < Vector3.Distance (tempOrigin, pos)/12; i++) {
                mouseIcon = Resources.Load<GameObject>("ui/direction/Arrow");
                mouseIcon = GameObject.Instantiate(mouseIcon);
                allmouseIcon.Add (mouseIcon);
            }
            //Debug.Log (allmouseIcon.Count);
        }
        else
        {
            mouseIcon = Resources.Load<GameObject>("ui/direction/Arrow");
            mouseIcon = GameObject.Instantiate(mouseIcon);
            allmouseIcon.Add(mouseIcon); 
        }
       
        disnum = (pos- tempOrigin).normalized*Vector3.Distance (tempOrigin, pos)/allmouseIcon.Count;
        for (int i = allmouseIcon.Count; i > 0; i--)
        {
            int temp = i;
            allmouseIcon[temp-1].transform.position = tempOrigin + disnum * i;
            allmouseIcon[temp-1].transform.localEulerAngles = new Vector3(mouseIcon.transform.localEulerAngles.x, player.transform.localEulerAngles.y, mouseIcon.transform.localEulerAngles.z);//图标方向和摄像机方向一致
        }

    }

}
原文地址:https://www.cnblogs.com/Study088/p/7486062.html