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); // 面向左

}

}

}

相关推荐
修炼前端秘籍的小帅4 天前
Stitch——Google热门的免费AI UI设计工具
前端·人工智能·ui
王码码20354 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos
爱搞虚幻的阿恺4 天前
Niagara粒子系统-超炫酷的闪电特效(加餐 纸牌螺旋上升效果)
游戏·游戏引擎
_Li.4 天前
Simulink - 6DOF (Euler Angles)
人工智能·算法·机器学习·游戏引擎·cocos2d
weixin_424294674 天前
Unity 调用Steamworks API 的 SteamUserStats.RequestCurrentStats()报错
unity·游戏引擎·steamwork
HoFunGames4 天前
Unity小地图,Easy Minimap System MT-GPS插件
unity·游戏引擎
2501_921930835 天前
Flutter for OpenHarmony:第三方库实战 chewie 视频播放器UI组件详解
flutter·ui
wy3258643645 天前
Unity 新输入系统InputSystem(基本操作)
unity·c#·游戏引擎
WarPigs5 天前
着色器multi_compile笔记
unity·着色器
梵得儿SHI5 天前
Vue3 生态工具实战宝典:UI 组件库 + 表单验证全解析(Element Plus/Ant Design Vue/VeeValidate)
前端·vue.js·ui·elementplus·vue性能优化·antdesignvue·表单验证方案