Unity3d 实现物体拖拽+图片覆盖填充现实

 

    首先,想要实现拖拽效果,要了解Unity3d自带有拖拽接口 IBeginDragHandler,IDragHandler,IEndDragHandler,三个接口分别为开始拖拽,正在拖拽 和结束拖拽

    本文带大街实现两个效果,一个是拖拽跟随鼠标,另一个是实现图片跟随覆盖填充显示效果,话不多说直接上图

 

实现这个效果其实很简单,但是需要稍微简单的计算一下

Unity3d图片的显示方式里面提供了一种显示方式Filled填充方式

选中之后可以进行360度填充,水平或者竖直填充.这里选用水平填充,并且Fill Origin 填充初始位置为右边

然后直接上代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;


public class DrageshowPicture : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler {


    //开始位置
    public Vector3 startPosition;
    //位置差,用来保证和鼠标的位置差
    Vector3 deltaPosiiton;
    //需要填充现实的图片
    public Image BGimage;
    //开始拖拽
    public void OnBeginDrag(PointerEventData eventData)
    {
        startPosition = eventData.position;
        deltaPosiiton = transform.position - (Vector3)eventData.position;
    }
    //拖拽中


    public void OnDrag(PointerEventData eventData)
    {
        Vector3 change = (Vector3) eventData.position + deltaPosiiton;
        Vector3 v3 = Vector3.zero;
        v3.x = change.x;
        v3.y = transform.position.y;
        v3.z = transform.position.z;
        //求得填充图片的宽度之后,求得边缘再屏幕上的位置,用来固定拖拽按钮不超过
        float xmin = BGimage.transform.position.x - BGimage.GetComponent<RectTransform>().sizeDelta.x / 2;
        float xmax = BGimage.transform.position.x + BGimage.GetComponent<RectTransform>().sizeDelta.x / 2;
        Debug.Log(xmin);
        if (v3.x< xmin)
        {
            v3.x = xmin;
        }
        else if (v3.x > xmax)
        {
            v3.x = xmax;
        }


        
        transform.position = v3;
        //根据按钮盒屏幕边缘的距离,求得百分比,给填充值
        BGimage.fillAmount = (xmax - v3.x) / (xmax - xmin);
    }
    //结束拖拽
    public void OnEndDrag(PointerEventData eventData)
    {
    }


}

综上所述,效果就实现了

 

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Unity的物理引擎来实现3D物体拖拽效果。下面是一个简单的示例代码,可以帮助你开始实现这个功能: ```csharp using UnityEngine; public class DragAndDrop : MonoBehaviour { private bool isDragging = false; private Rigidbody rb; private void Start() { rb = GetComponent<Rigidbody>(); } private void OnMouseDown() { isDragging = true; rb.isKinematic = true; } private void OnMouseUp() { isDragging = false; rb.isKinematic = false; } private void Update() { if (isDragging) { // 将物体位置设置为鼠标位置 Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); transform.position = new Vector3(mousePosition.x, mousePosition.y, transform.position.z); } } } ``` 在这个示例中,我们使用了`OnMouseDown`和`OnMouseUp`方法来启用和禁用拖拽功能。当鼠标按下时,`isDragging`变量被设置为`true`,并且物体的刚体组件的`isKinematic`属性被设置为`true`,这样可以防止物体受到物理引擎的影响。当鼠标松开时,`isDragging`变量被设置为`false`,并且物体的刚体组件的`isKinematic`属性被设置为`false`,这样物体就可以再次受到物理引擎的控制。 在`Update`方法中,我们检测`isDragging`变量是否为`true`,如果是,就将物体的位置设置为鼠标位置。这里使用了`Camera.main.ScreenToWorldPoint`方法将鼠标位置从屏幕坐标转换为世界坐标。 你可以将这个脚本添加到你想要实现拖拽功能的3D物体上,然后运行游戏,就可以通过鼠标拖拽来移动物体了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值