Unity 单侧拉伸物体

博客给出了一段Unity代码,用于重置模型的中心点位置,实现单侧拉伸。代码中通过选中对象获取边界框信息,创建新对象并设置其位置,将原对象设为子对象。还提到相比手动拖动空物体,使用该工具在处理多个对象时更方便。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

using UnityEngine;
using System.Collections;
using UnityEditor;

public class StretchSingle
{
    /// <summary>
    /// 重置模型的中心点位置
    /// </summary>
    [MenuItem("Tool/ResetCenterPosition")]
    public static void ResetCenterPosition()
    {
        //选中的对象
        Transform transform = Selection.activeTransform;
        Bounds bounds = transform.GetComponent<Collider>().bounds;

        GameObject newObj = new GameObject();
        newObj.name = transform.name;
        //  bounds.min = bounds.center - bounds.extents
        //    extents:边界框的范围。这总是Bounds大小的一半。
        //  center :边界框的中心。    
        newObj.transform.position = bounds.min;

        transform.SetParent(newObj.transform);

    }

}
也有方法直接建个空物体拖动到对象的底侧实现单侧拉伸的,但是多个对象时一个个拖太麻烦了,直接用工具添加方便很多~不足之处欢迎补充

### 实现 Unity 中模型的单轴拉伸 为了实现在 Unity 中模型沿单一轴线进行拉伸的效果,可以采用变换矩阵来改变对象的位置和比例。当直接修改 `Transform.localScale` 属性时,默认情况下会围绕物体中心点均匀放大缩小,这并不是所需的结果。 一种解决方案是通过脚本编程方式先移动目标对象使其一侧靠近原点位置,再执行缩放操作最后恢复原来的位置偏移量[^1]: ```csharp using UnityEngine; public class OneWayScaler : MonoBehaviour { public Vector3 scaleDirection; // 定义想要拉伸的方向 void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 当按下空格键触发拉伸动作 Transform t = transform; // 记录原始位置并临时设置新位置以便于只在一个方向上扩展 Vector3 originalPosition = t.localPosition; float halfHeightOffset = t.localScale.y * 0.5f; t.localPosition -= new Vector3(0, halfHeightOffset, 0); // 执行实际的比例变化 t.localScale += Time.deltaTime * scaleDirection; // 将位置重置回初始状态加上由于高度增加而产生的额外位移 t.localPosition = originalPosition + new Vector3(0, Time.deltaTime * scaleDirection.y * 0.5f, 0); } } } ``` 另一种方法则是创建一个新的父级 GameObject 来承载待变形的对象,并仅对该子物体应用局部坐标系下的尺度更改[^2]。这种方法的好处在于它不会影响其他组件的行为逻辑,同时也更容易管理复杂的场景结构。 对于更复杂的情况,比如希望模拟某种材质逐渐延展的过程,则可能需要用到网格渲染器(Mesh Renderer)配合自定义着色器或纹理映射技术来达到视觉上的渐变效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值