RectTransform中localPosition与anchoredPosition的区别

1. Inspector面板中Transform的位置信息显示的是localPosition

2. Inspector面板中RectTransform的位置信息显示的是anchoredPosition3D

  • 2.1 localPosition表示的是子物体的pivot相对于父物体的pivot的坐标
  • 2.2 anchoredPosition3D表示的是子物体的pivot相对于anchor的坐标,当anchor不是一个点时表示前3个元素(left,top,z)
  • 2.3 当子物体的anchor与父物体的pivot坐标重合时anchoredPosition3DlocalPosition相等

3. 实例验证(这里为了学习编辑器拓展,采用了编辑器拓展的方式)

  • 3.1 新建两个Image用于测试,相对位置布置如图:
    新建父物体与子物体
    白色父物体pivot蓝色子物体anchor与pivot
    面板显示
  • 3.2 在Editor目录下新建编辑器拓展脚本
using UnityEditor;
using UnityEngine;
public class CanvasUpdate // 脚本不需要做成组件,所以不需要继承MonoBehaviour
{
    private static Transform m_Tran = GameObject.Find("ImageBlue").transform;
    private static void DebugPos()
    {
        RectTransform rect = m_Tran.GetComponent<RectTransform>();
        //Debug.Log(rect.parent.localPosition);
        Debug.Log(rect.localPosition);
        Debug.Log(rect.anchoredPosition3D);
    }
    [MenuItem("CanvasUpdate/Do it! %&z")] // %代表ctrl #代表shift &代表alt
    private static void UpdateCanvas() // 必须是static
    {
        //Canvas.ForceUpdateCanvases(); // 强制刷新所有Canvas的内容
        Debug.Log("UpdateCanvas");
        DebugPos();
    }
}

编辑器拓展

  • 3.3 调整父子物体anchor与pivot的位置,然后ctrl+alt+z(不用运行游戏)即可实时打印出localPositionanchoredPosition3D。以下为按图3.1布置两物体时的打印结果:
    打印结果

注意:三维物体在Canvas之外创建,Inspector面板中是Transform,在Canvas下创建则Inspector面板中是RectTransform!

结论:Inspector面板中Transform的坐标显示的是localPosition,RectTransform的坐标显示的是anchoredPosition3D,只是当父物体的pivot与子物体的anchor巧合重合时二者的值相等!(以上例子将Unity坐标轴模式从Center改为Pivot比较容易看出)

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Unity实现鼠标滑轮放大缩小图片,可以通过以下步骤实现: 1. 创建一个Image对象,并将其添加到Canvas。 2. 给Image对象添加一个Rect Transform组件,用于控制图片的位置和大小。 3. 给Image对象添加一个Event Trigger组件,并添加两个事件:OnScroll和OnDrag。 4. 在OnScroll事件,使用鼠标滑轮的delta值来缩放图片的大小。可以使用RectTransform组件的localScale属性来实现缩放。 5. 在OnDrag事件,使用鼠标的delta值来移动图片的位置。可以使用RectTransform组件的anchoredPosition属性来实现移动。 下面是一个示例代码: ``` using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class ImageController : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IDragHandler, IScrollHandler { public Image image; public float zoomSpeed = 0.1f; public float moveSpeed = 1.0f; private bool isDragging = false; private Vector2 dragStartPosition; public void OnPointerEnter(PointerEventData eventData) { // 鼠标进入图片区域时,允许滑动和缩放图片 image.rectTransform.pivot = new Vector2(0.5f, 0.5f); image.rectTransform.localScale = Vector3.one; image.rectTransform.localPosition = Vector3.zero; } public void OnPointerExit(PointerEventData eventData) { // 鼠标离开图片区域时,还原图片位置和大小 image.rectTransform.pivot = new Vector2(0f, 1f); image.rectTransform.localScale = Vector3.one; image.rectTransform.localPosition = Vector3.zero; } public void OnDrag(PointerEventData eventData) { // 鼠标左键按住拖动时,移动图片位置 if (Input.GetMouseButton(0)) { if (!isDragging) { isDragging = true; dragStartPosition = eventData.position; } else { Vector2 delta = eventData.position - dragStartPosition; image.rectTransform.anchoredPosition += delta * moveSpeed; dragStartPosition = eventData.position; } } else { isDragging = false; } } public void OnScroll(PointerEventData eventData) { // 使用鼠标滚轮缩放图片大小 float scale = 1.0f + eventData.scrollDelta.y * zoomSpeed; image.rectTransform.localScale *= scale; } } ``` 将这个脚本组件添加到Image对象上,然后将Image对象的Image组件和RectTransform组件赋值给对应的变量,即可实现鼠标滑轮放大缩小图片,鼠标左键按住滑动拖动图片的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿斯提尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值