unity2d实现鼠标拖动图片轮播的具体操作和完整代码
时间: 2024-06-11 19:10:50 浏览: 116
具体操作:
1. 创建一个空的GameObject,命名为ImageSlider。
2. 在ImageSlider下创建一个Image对象,命名为Slider。
3. 为Slider添加一个RectTransform组件,并设置宽度和高度为屏幕宽度。
4. 为Slider添加一个Image组件,并为其设置一张默认图片。
5. 在ImageSlider下创建一个空的GameObject,命名为Content。
6. 为Content添加一个RectTransform组件,并设置宽度和高度为Slider的两倍。
7. 在Content下创建多个Image对象,每个Image代表一张轮播图片。
8. 为每个Image添加一个RectTransform组件,并设置宽度和高度为Slider的宽度和高度。
9. 将所有Image对象放置在Content内,且每个Image的x坐标为Slider的宽度的倍数。
10. 为ImageSlider添加一个脚本SliderController,并在该脚本中实现鼠标拖动图片轮播的逻辑。
完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SliderController : MonoBehaviour
{
public Transform contentTransform; // Content的Transform组件
public float dragSpeed = 1; // 拖动速度
private Vector3 contentStartPosition; // Content的起始位置
private float contentWidth; // Content的宽度
private int currentIndex = 0; // 当前图片的索引
private bool isDragging = false; // 是否正在拖动
private List<Vector3> imagePositions = new List<Vector3>(); // 所有Image的位置
void Start()
{
contentStartPosition = contentTransform.position;
contentWidth = contentTransform.GetComponent<RectTransform>().rect.width;
for (int i = 0; i < contentTransform.childCount; i++)
{
imagePositions.Add(contentTransform.GetChild(i).position);
}
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
isDragging = true;
}
if (Input.GetMouseButtonUp(0))
{
isDragging = false;
float dragDistance = contentTransform.position.x - contentStartPosition.x;
if (Mathf.Abs(dragDistance) > contentWidth / 4f)
{
if (dragDistance > 0 && currentIndex > 0)
{
currentIndex--;
}
else if (dragDistance < 0 && currentIndex < contentTransform.childCount - 1)
{
currentIndex++;
}
}
StartCoroutine(MoveToImage(currentIndex));
}
if (isDragging)
{
float deltaX = Input.GetAxis("Mouse X") * dragSpeed;
contentTransform.position += new Vector3(deltaX, 0, 0);
}
}
IEnumerator MoveToImage(int index)
{
float t = 0;
Vector3 startPosition = contentTransform.position;
Vector3 endPosition = imagePositions[index] - new Vector3(contentWidth / 2f, 0, 0);
while (t < 1)
{
t += Time.deltaTime * 5f;
contentTransform.position = Vector3.Lerp(startPosition, endPosition, t);
yield return null;
}
}
}
阅读全文