unity中 UI物体跟随鼠标移动,根据鼠标滑动方向改变物体方向在X轴。 移动端同样实现

using UnityEngine;

public class FollowMouseHorizontal : MonoBehaviour

{

private RectTransform rectTransform;

private Vector2 lastPosition;

public float speed = 5.0f;

void Start()

{

rectTransform = GetComponent<RectTransform>();

lastPosition = rectTransform.anchoredPosition;

}

void Update()

{

#if UNITY_EDITOR || UNITY_STANDALONE

HandleMouseInput();

#elif UNITY_IOS || UNITY_ANDROID

HandleTouchInput();

#endif

}

void HandleMouseInput()

{

Vector2 currentMousePosition = Input.mousePosition;

Debug.Log(Input.mousePosition);

MoveTowards(new Vector2(currentMousePosition.x, rectTransform.position.y));

}

void HandleTouchInput()

{

if (Input.touchCount > 0)

{

Touch touch = Input.GetTouch(0);

Vector2 currentTouchPosition = touch.position;

MoveTowards(new Vector2(currentTouchPosition.x, rectTransform.position.y));

}

}

void MoveTowards(Vector2 targetPosition)

{

Vector2 direction = targetPosition - (Vector2)rectTransform.position;

// 平滑移动

rectTransform.position = Vector2.Lerp(rectTransform.position, targetPosition, Time.deltaTime * speed);

// 改变UI物体的左右方向

if (direction.x > 0)

{

rectTransform.localScale = new Vector3(1, 1, 1); // 面向右

}

else if (direction.x < 0)

{

rectTransform.localScale = new Vector3(-1, 1, 1); // 面向左

}

}

}

Canvas 的 Render Mode 是Screen Space - Camera:

using UnityEngine;

public class FollowMouseHorizontalCmaera : MonoBehaviour

{

private RectTransform rectTransform;

public Camera uiCamera;

public float speed = 5.0f;

void Start()

{

rectTransform = GetComponent<RectTransform>();

}

void Update()

{

#if UNITY_EDITOR || UNITY_STANDALONE

HandleMouseInput();

#elif UNITY_IOS || UNITY_ANDROID

HandleTouchInput();

#endif

}

void HandleMouseInput()

{

Vector3 currentMousePosition = Input.mousePosition;

currentMousePosition.z = uiCamera.nearClipPlane; // 设置 z 值为相机的近剪切面

Vector3 worldMousePosition = uiCamera.ScreenToWorldPoint(currentMousePosition);

MoveTowards(new Vector2(worldMousePosition.x, rectTransform.position.y));

}

void HandleTouchInput()

{

if (Input.touchCount > 0)

{

Touch touch = Input.GetTouch(0);

Vector3 currentTouchPosition = touch.position;

currentTouchPosition.z = uiCamera.nearClipPlane; // 设置 z 值为相机的近剪切面

Vector3 worldTouchPosition = uiCamera.ScreenToWorldPoint(currentTouchPosition);

MoveTowards(new Vector2(worldTouchPosition.x, rectTransform.position.y));

}

}

void MoveTowards(Vector2 targetPosition)

{

Vector2 direction = targetPosition - (Vector2)rectTransform.position;

// 平滑移动

rectTransform.position = Vector2.Lerp(rectTransform.position, targetPosition, Time.deltaTime * speed);

// 改变UI物体的左右方向

if (direction.x > 0)

{

rectTransform.localScale = new Vector3(1, 1, 1); // 面向右

}

else if (direction.x < 0)

{

rectTransform.localScale = new Vector3(-1, 1, 1); // 面向左

}

}

}

相关推荐
Avalon7123 小时前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎
风酥糖5 小时前
Godot游戏练习01-第33节-新增会爆炸的敌人
游戏·游戏引擎·godot
ellis19705 小时前
Unity UI性能优化一之插件【Unity UI Optimization Tool】
unity·性能优化
qq_454245036 小时前
从 UI 操作到环境交互:一种通用元命令自动化协议的设计与意义
人工智能·ui·自动化·交互
格林威6 小时前
工业视觉检测:提供可视化UI调试工具的实现方式是什么?
开发语言·人工智能·数码相机·ui·计算机视觉·视觉检测·工业相机
ZC跨境爬虫7 小时前
跟着 MDN 学 HTML day_8:(高级文本语义标签+适配核心功底)
前端·css·笔记·ui·html
Zik----7 小时前
Unity基础学习笔记(B站视频课整理)
unity·vr
郑寿昌17 小时前
UE5与UE6在Lumen和Nanite的差异解析
游戏引擎·图形渲染·着色器
橙子1991101619 小时前
UI 绘制相关
ui
Math_teacher_fan20 小时前
Flutter 跨平台开发实战:鸿蒙与音乐律动艺术(六)、Lissajous 利萨茹曲线:频率耦合的轨迹艺术
flutter·ui·数学建模·华为·harmonyos·鸿蒙系统