zoukankan      html  css  js  c++  java
  • 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);//图标方向和摄像机方向一致
            }
    
        }
    
    }
  • 相关阅读:
    Jmeter属性和变量
    用trie树解决最大异或对问题(On)
    trie树
    kmp算法
    数学归纳法
    单调栈和单调队列
    区间合并
    离散化
    位运算
    双指针算法
  • 原文地址:https://www.cnblogs.com/Study088/p/7486062.html
Copyright © 2011-2022 走看看