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

}

}

}

相关推荐
SmalBox14 小时前
【光照】Unity中的[经验模型]
unity·渲染
萘柰奈15 小时前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
Yasin Chen16 小时前
Unity UI坐标说明
ui·unity
应用市场17 小时前
无人机姿态控制系统详解与实现
游戏引擎·cocos2d
陈言必行21 小时前
Unity 性能优化 之 编辑器创建资源优化( 工作流 | 场景 | 预制体)
unity·编辑器·游戏引擎
1uther1 天前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
死也不注释1 天前
【Unity UGUI 交互组件——Slider(7)】
unity·游戏引擎·交互
程序猿多布1 天前
XLua教程之热补丁技术
unity·c#·lua·xlua
眠りたいです1 天前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体
SmalBox2 天前
【光照】Unity中的[光照模型]概念辨析
unity·渲染