首页 > Unity3D专栏 > 【Unity3D】箭头随鼠标拖拽改变
2017
10-23

【Unity3D】箭头随鼠标拖拽改变

描述:以炉石传说为例子,鼠标拖拽图片出现箭头,随着鼠标拖拽的距离方向,箭头改变相应的属性1.搭建UI,用了四张Image,其中一个是箭头图片, 如下图
这里Arrow的Width和Height为图片原来大小,scale设为了0.2,0.2,,进行九宫格切割,将Arrow的Image中的Image Type设为Sliced,,保证箭头不变形;Pivot.y设为0,保证箭头只向正方向变化
2.在Arrow上添加脚本,Arrow.cs;  分别在三张Image上添加同一个脚本ImageBg.cs。
Arrow.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Arrow : MonoBehaviour {
 
    public static Arrow Instance;
 
    RectTransform rt;  
    Vector3 angleV3;   
 
    private void Awake()       //用了三张图片,所以加了单例
    {
        Instance = this;
        gameObject.SetActive(false);      //Arrow初始状态设为false
        rt = GetComponent<RectTransform>();
        angleV3 = new Vector3(0, 0, 0);  //初始位置
    }
 
        //拖拽开始时的方法
    public void StartDrag(Vector3 imageBgPosition)    //传入Image的位置
    {
        gameObject.SetActive(true);     Arrow状态设为true
        transform.position = imageBgPosition;   
    }
         
        //拖拽时的方法
    public void OnDraging(float distance, float angle)  
    {
        rt.sizeDelta = new Vector2(rt.sizeDelta.x, distance / rt.localScale.y);  //改变Arrow的大小
        angleV3.z = angle - 90f;
        transform.localRotation = Quaternion.Euler(angleV3);  ////改变Arrow的方向
    }
 
        //结束拖拽时方法
    public void EndDrag()
    {
        gameObject.SetActive(false);   //Arrow状态设为false
        rt.sizeDelta = new Vector2(rt.sizeDelta.x, 0);  
        transform.localRotation = Quaternion.identity;
    }
 
}

ImageBg.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class ImageBg : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public GameObject arrow;
 
 
        //对应状态Arrow中方法的调用,出入对应参数
         
    public void OnBeginDrag(PointerEventData eventData)
    {
        Vector3 pos = transform.position;
        Arrow.Instance.StartDrag(pos);   //
    }
 
    public void OnDrag(PointerEventData eventData)
    {
        float distance = Vector2.Distance(transform.position, Input.mousePosition);
 
        Vector2 v2 = (Input.mousePosition - transform.position).normalized;
        float angle = Mathf.Atan2(v2.y, v2.x) * Mathf.Rad2Deg;
        Arrow.Instance.OnDraging(distance, angle);
    }
 
    public void OnEndDrag(PointerEventData eventData)
    {
        Arrow.Instance.EndDrag();
    }
}

3.实现如下:

【Unity3D】箭头随鼠标拖拽改变 - 第1张  | Unity3D虚拟世界

(本文转自锐剑



虚拟世界提醒您:如果您觉得本文不错,快快将这篇文章分享出去吧 ,感谢您的支持和关注,谢谢!
最后编辑:
作者:虚拟世界
专注互联网技术及资讯 技术研究中心|有相关Unity3D问题或者作事宜请联系我哦!
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝或者微信直接向我捐款,在此非常感谢您对虚拟世界的捐赠。

留下一个回复

你的email不会被公开。