TriggerPrefab 拖拽物体
模拟经营类游戏 有一个特点,就是 拖拽物体。常见的有《帝国》《红警》《部落战争》《凯撒大帝》等等
2d 拖拽 大部分都是 用 OnDrag 方法来 拖动物体,背包也是这么做。3d中拖拽方法很多,很多插件都 自带了一些demo。如 Grid Framework.unitypackage拖拽
如 TNet Tasharen Networking 2.0 拖拽
当然,我最喜欢的方式 ,还是 利用射线方式 自己写一个拖拽。
这些是网上朋友写的,我觉得还不错,分享一下。
using UnityEngine;
using System.Collections; public class TriggerPrefab : MonoBehaviour {
private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标
private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标
private Transform _trans;// 目标物体的空间变换组件
private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
private Vector3 _vec3Offset;// 偏移 public Material defaultMaterial;
public Material redMaterial; //声明从鼠标发出一条射线clickRay
Ray clickRay; //声明clickRay与游戏物体的碰撞
RaycastHit clickPoint; //声明clickRay与地面的碰撞
RaycastHit posPoint;
//设置地面层,我的地面层是第8层,所以是8。不会设置层的话请看下边的Tips。
LayerMask mask = << ; void Awake() { _trans = transform; }
void Start()
{
} void Update()
{
clickRay = Camera.main.ScreenPointToRay(Input.mousePosition);
} Vector3 oldPosition;
void OnMouseDown()
{
// 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标
_vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
// 计算目标物体与鼠标物体在世界空间中的偏移量
_vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
_vec3Offset.y = ;
//如果射线与物体相碰,则调用OnMouseDrag()
oldPosition = _trans.position;
if (Physics.Raycast(clickRay, out clickPoint))
{
OnMouseDrag();
}
} void OnMouseUp()
{
if (TriggerBool)
{
transform.position = oldPosition;
} }
void OnMouseDrag()
{
//取射线与地面相碰的坐标,赋给mouseMove,再把mouseMove的x坐标和z坐标赋给物体,y坐标不变(因为是贴在地面上移动)
Physics.Raycast(clickRay, out posPoint, Mathf.Infinity, mask.value);
Vector3 mouseMove = posPoint.point; Vector3 move = (new Vector3(mouseMove.x, transform.position.y, mouseMove.z)) + _vec3Offset; Vector3 newMove = new Vector3();
newMove.y = move.y; transform.position = move;
return;
}
bool TriggerBool;
void OnTriggerEnter(Collider other)
{
TriggerBool = true;
TintRed(TriggerBool);
} void OnTriggerExit(Collider other)
{
TriggerBool = false;
TintRed(TriggerBool);
} void TintRed(bool red)
{
if (red)
{
renderer.material = redMaterial;
}
else
{
renderer.material = defaultMaterial;
}
}
/******
*
void OnMouseDrag()
{
//取射线与地面相碰的坐标,赋给mouseMove,再把mouseMove的x坐标和z坐标赋给物体,y坐标不变(因为是贴在地面上移动)
Physics.Raycast (clickRay ,out posPoint,Mathf.Infinity,mask.value);
Vector3 mouseMove=posPoint.point;
//令角色朝向行走方向
transform.LookAt(new Vector3 (mouseMove.x, transform.position.y, mouseMove.z));
transform.position = (new Vector3 (mouseMove.x, transform.position.y, mouseMove.z));
//播放行走动画,引号里改成你自己的动画名称
animation.CrossFade("walk");
return;
} void OnMouseUp()
{
//鼠标松开时回到待机悬停动画,引号里改成你自己的动画名称
animation.CrossFade ("idle");
return;
}
* */
}
接下来几章,我还是要补充一些 插件,为后面 继续 人工智能 铺垫下
TriggerPrefab 拖拽物体的更多相关文章
- 【狼】unity 鼠标拖拽物体实现任意角度自旋转
主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长 ...
- JS—实现拖拽
JS中的拖拽示例: 1)实现拖拽思路:当鼠标按下和拖拽过程中,鼠标与拖拽物体之间的相对距离保持不变 2)实现拖拽遇到的问题: 问题1:当鼠标按下移动过快时,离开了拖拽的物体时 ...
- javascript小实例,PC网页里的拖拽
几年前,我参与设计开发一个房产网的项目,我负责前端工作,由于项目经理要求比较高,参考了很多房产类网站比较优秀的功能,想把别人比较优秀的设计和想法集合到一起,那时的设计稿和功能实现,简直就是改了又改,今 ...
- javascript小实例,PC网页里的拖拽(转)
这是现在的效果,可能改了一些,原来的效果是,里面的这张图是可以上下左右拖动的,然后房子上面的显示的楼栋号,也跟着图片一起移动,当时js能力还不行,未能实现项目经理的要求,不过后来项目经理又把这个效果推 ...
- HTML5 drag & drop 拖拽与拖放简介
DataTransfer 对象:退拽对象用来传递的媒介,使用一般为Event.dataTransfer. draggable 属性:就是标签元素要设置draggable=true,否则不会有效果,例如 ...
- [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag
背包效果-使用NGUI实现物品的拖拽效果Drag 效果实现如图 对象层级关系图 PacketCell - Right 对象作为单元格背景 PacketContainer 对象作为单元格容器 Packe ...
- js拖拽效果详细讲解
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- javascript小实例,移动端页面中的拖拽
上文说到,想将移动端的拖拽说一说,那现在趁有时间,就将这个福利文带来了,哈哈! 在我还不知道怎么做移动端的手势操作的时候,我觉得这TM实在是太难了,这是多么高深的学问啊,手势操作耶,上滑下滑左滑右滑的 ...
- cookie结合js 实现记住的拖拽
哈喽!!!我胡汉三又回来啦!!!有木有记挂挪啊!咱们今天说一个 cookie结合JS的小案例哦! 话不多说直接上代码: <!DOCTYPE html> <html> <h ...
随机推荐
- TypeError: document.getELementById is not a function
这个错误困扰了我好几个小时,在网上也百度了好久类似的问题但都没有结果,反反复复看了好多遍,才发现,原来是document.getELementById 里面的Element的字母 l 我写成了大写的L ...
- 安装asterisk
在centos6.5上: yum -y install lynx mysql-server mysql mysql-devel php php-mysql php-mbstring tftp-serv ...
- oracle 11g高级 安装图解(摘自网络)
使用的高级安装 启动OUI后出现“选择安装方式”窗口,我们选择:高级安装 步骤3:出现“选择安装类型”窗口,选择我们需要安装的版本.我们在此肯定是选择企业版. 至于产品语言不用选择,它会根据当前系统的 ...
- UI线程
Application.Current.Dispatcher.Invoke(new Action(() =>))
- a标签中使用img后的高度多了几个像素
a元素下有一个匿名文本,这个文本外有一个匿名行级盒子,它有的默认vertical-align是baseline的,而且往往因为上文line-height的影响,使它有个line-height,从而使其 ...
- Eclipse没有提示了,按Alt+/ 也无代码提示
1.菜单window->Preferences->Java->Editor->Content Assist->Enable auto activation 选项要打上勾 ...
- composer安装自己的包
composer的出现,使得PHPer可以像Java一样更加方便的管理代码.在composer没有出现之前,人们大多使用pear.pecl管理依赖,但是局限性很多,也很少有人用(接触的大多phper基 ...
- 完美版cookie设置/得到/删除2016/423
function setCookie(key, value, t) { var oDate = new Date(); oDate.setDate( oDate.getDate() + t ); do ...
- TD8.0迁移到QC9.2,自动迁移失败,手动迁移
源机器A:TD8.0+SQLServer2000目标机器B:QC9.2+SQLServer2000 一:自动迁移,1.在A在A上安装QC迁移工具,然后在B中点击TOOLS>>Migrati ...
- Struts2原理图