TriggerPrefab 拖拽物体

时间:2023-09-19 20:16:08

模拟经营类游戏 有一个特点,就是 拖拽物体。常见的有《帝国》《红警》《部落战争》《凯撒大帝》等等

2d 拖拽 大部分都是 用 OnDrag 方法来 拖动物体,背包也是这么做。3d中拖拽方法很多,很多插件都 自带了一些demo。如 Grid Framework.unitypackage拖拽

TriggerPrefab 拖拽物体

如 TNet Tasharen Networking 2.0 拖拽

TriggerPrefab 拖拽物体

当然,我最喜欢的方式 ,还是  利用射线方式 自己写一个拖拽。

这些是网上朋友写的,我觉得还不错,分享一下。

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;
}
* */
}

接下来几章,我还是要补充一些 插件,为后面 继续 人工智能 铺垫下