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

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

原文地址:https://www.cnblogs.com/big-zhou/p/4155810.html