模拟经营类游戏 有一个特点,就是 拖拽物体。常见的有《帝国》《红警》《部落战争》《凯撒大帝》等等
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 = 1 << 8; 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 = 0; //如果射线与物体相碰,则调用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; } * */ }
接下来几章,我还是要补充一些 插件,为后面 继续 人工智能 铺垫下