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中让物体移动到鼠标点击地面任一点的位置(单击移动和双击暂停移动)并生成图标的更多相关文章

  1. unity中让摄像机移动到鼠标点击的位置和鼠标控制平移视角

    private Vector3 targetVector3; private float movespeed=0.5f; private bool IsOver = true; private Gam ...

  2. 在unity中用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放

    在场景中添加一个Plan,Camera,Directional Light,Cube.添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上). 1 ...

  3. unity中实现物体在一定角度范围内来回旋转

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : ...

  4. html5中canvas的使用 获取鼠标点击页面上某点的RGB

    1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...

  5. 关于Unity中NGUI图片精灵响应鼠标的方法

    我在Unity里做NGUI的时候发现一个问题. 在Unity2D场景当中,一个精灵图片只要加上了Box Collider或者Box Collider2D,就可以相应OnMouseEnter和OnMou ...

  6. Unity中Instantiate物体失效问题

    才开始学Unity,开始总是这样用Instantiate函数: GameObject temp = (GameObject)Instantiate(bulletSource, transform.po ...

  7. Unity中获取物体的子物体

    如果想获取一级子节点 foreach (Transform child in this.transform) { Debug.Log(child.name); } 如果想获取所有子节点 foreach ...

  8. Unity中使物体自动寻路的方法

    在做一个FPS游戏时,需要敌方自动找到玩家方位并向玩家移动,在查找资料(并走了不少坑)后,我试了三个方法,经测试,这三个方法都能实现自动寻路功能. 方法一:使用Mathf.Lerp()方法 代码很简单 ...

  9. Unity中激活子物体

    void GetChildrenAndSetActive() { Transform[] imageTargetObjects = GetComponentsInChildren<Transfo ...

随机推荐

  1. django数据库的增、删、改、查

    1.增加 第一种:save 通过创建模型类对象,执行对象的save()方法保存到数据库中. 第二种:create 2.修改 3.查询 get 查询单一结果,如果不存在会抛出模型类.DoesNotExi ...

  2. Linux下计划任务以及crontab权限问题

    在Linux工作环境下,我们有时可能会需要在未来某个时间执行某个命令或脚本,但是我们又不可能定个闹钟,然后到点了再去执行吧,这多麻烦.还好我们的Linux系统这么强大,提供了任务计划这个功能,我们就不 ...

  3. 第 8 章 容器网络 - 060 - 在 Docker 中使用 flannel

    在 Docker 中使用 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd/system/docker.service.d/10-machine.conf 设置 ...

  4. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  5. boke例子: freermarker:在使用ajax传递json数据的时候多出冒号

    boke例子: freermarker:在使用ajax传递json数据的时候多出冒号 json数据是用JSON.stringify()格式化的数据,然后用ajax传递,发现数据多出一个冒号:, 后来度 ...

  6. 记 linux 下面初次使用的convert 工具完成拼长图功能

    今天,遇到了一个需要把大量图片合并到一个长图的功能.本来找了各种图片处理界顶顶大佬.. “PS(手动一张张 的加).光影魔术手(批处理功能没有看到拼图功能).美图秀秀(可以有个拼图,限制30张,而且需 ...

  7. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  8. FileZilla 客户端连接 FlieZilla 服务器 连接成功读取目录列表却失败的解决办法

    解决过程: 第一步: 第二步:

  9. DVWA-CSRF

    Low等级   image 抓包   image 正常跳转   image   image 在这里我们把密码改为qwer   image   image   image   image   image ...

  10. js 处理 cookie的存储与删除

    <script> //JS操作cookies方法! //写cookies function setCookie(c_name, value, expiredays){ var exdate ...