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 = ;
private float minmum = ;
//定义控制人物
private float rotateSpeed = 45f;
private float playerMoveSpeed = 2.5f;
//鼠标双击的参数
private float delay = 0.5f;
private float _firstClickTime = ;
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() && !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())
{
if (player == null)
return;
//视角移动
player.transform.Rotate(, -Input.GetAxis("Mouse X") * sensitivityX, );
}
}
//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 > ;
}
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(, , v) * playerMoveSpeed * Time.deltaTime);
player.transform.Rotate(new Vector3(, h, ) * 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)>=)
{
for (int i = ; i < Vector3.Distance (tempOrigin, pos)/; 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 > ; i--)
{
int temp = i;
allmouseIcon[temp-].transform.position = tempOrigin + disnum * i;
allmouseIcon[temp-].transform.localEulerAngles = new Vector3(mouseIcon.transform.localEulerAngles.x, player.transform.localEulerAngles.y, mouseIcon.transform.localEulerAngles.z);//图标方向和摄像机方向一致
} } }
unity中让物体移动到鼠标点击地面任一点的位置(单击移动和双击暂停移动)并生成图标的更多相关文章
- unity中让摄像机移动到鼠标点击的位置和鼠标控制平移视角
private Vector3 targetVector3; private float movespeed=0.5f; private bool IsOver = true; private Gam ...
- 在unity中用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放
在场景中添加一个Plan,Camera,Directional Light,Cube.添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上). 1 ...
- unity中实现物体在一定角度范围内来回旋转
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : ...
- html5中canvas的使用 获取鼠标点击页面上某点的RGB
1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...
- 关于Unity中NGUI图片精灵响应鼠标的方法
我在Unity里做NGUI的时候发现一个问题. 在Unity2D场景当中,一个精灵图片只要加上了Box Collider或者Box Collider2D,就可以相应OnMouseEnter和OnMou ...
- Unity中Instantiate物体失效问题
才开始学Unity,开始总是这样用Instantiate函数: GameObject temp = (GameObject)Instantiate(bulletSource, transform.po ...
- Unity中获取物体的子物体
如果想获取一级子节点 foreach (Transform child in this.transform) { Debug.Log(child.name); } 如果想获取所有子节点 foreach ...
- Unity中使物体自动寻路的方法
在做一个FPS游戏时,需要敌方自动找到玩家方位并向玩家移动,在查找资料(并走了不少坑)后,我试了三个方法,经测试,这三个方法都能实现自动寻路功能. 方法一:使用Mathf.Lerp()方法 代码很简单 ...
- Unity中激活子物体
void GetChildrenAndSetActive() { Transform[] imageTargetObjects = GetComponentsInChildren<Transfo ...
随机推荐
- angular7 + d3 显示svg
汇总一些之前没有注意到的问题 总体思路: app只是显示svg为主,接收后端推送的数据改变,显示变化后的svg. 因此,只用d3的数据绑定更新组件里<svg></svg>节点. ...
- Python中数据类型
一.整数 Python可以处理任意大小的整数,当然包括负整数,在Python程序中,整数的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 计算机由于使用二进制,所以,有时候用 ...
- C++的虚函数
1 多态产生的背景 希望同一个方法在派生类和基类中的行为是不同的,换句话来说,方法的行为取决于调用该方法的对象. 2 解决多态的两种方法 1)在派生类中重新定义基类的方法 2)使用虚方法 3 虚 ...
- Python pymysql 增删改查封装
关于pymysql 的增删改查,简单做个封装,方便后面使用直接拿来调用即可. 其中 增删改 的处理其实是一致的,本可以使用统一的方法,但是为了明显区分,这里分开来写了. 直接看代码就即可,如下: # ...
- Asp.net core 学习笔记 (Excel 读写)
EPPlus 已经支持 .net core 了 https://www.nuget.org/packages/EPPlus https://github.com/JanKallman/EPPlus 写 ...
- 恶意代码分析-使用apataDNS+inetsim模拟网络环境
准备工作 虚拟机安装: Win7 Ubuntu apateDNS 密码:wplo inetsim 密码:ghla 客户端Win7需要做的工作 安装apateDNS 服务器端Ubuntu需要做的工作 下 ...
- LeetCode--020--括号匹配(java版)
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...
- file 文件处理
python文件处理 #写文件 >>> f=open("test.log","w") #"w"写入模式 >>& ...
- 廖雪峰网站:学习python函数—函数参数(三)
1.*args # 位置参数,计算x2的函数 def power(x): return x * x p = power(5) print(p) # 把power(x)修改为power(x, n),用来 ...
- Android(二)——frida安装教程
pc端下载:pip install frida 之后就是在手机端或者模拟器下载对应版本的server 在手机或者模拟器上查看cpu版本型号,就根据这个来下载server system/build.pr ...