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

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

  • 相关阅读:
    记解决一次“HTTP Error 400. The request URL is invalid”的错误
    微信退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道“或”The request was aborted: Could not create SSL/TLS secure channel“的错误
    aps.net国际化本地资源 .resources”正确嵌入或链接到程序集
    远程链接 aws Windows Server 2016 Base Nano
    linux odbc框架
    linux webservice
    linux 共享内存管理
    linux 广播寻址
    linux curse库
    linux log框架设计
  • 原文地址:https://www.cnblogs.com/big-zhou/p/4155810.html
Copyright © 2020-2023  润新知