Unity 使用Sprite绘制一条自定义图片的线

Unity 使用Sprite绘制一条自定义图片的线

前言

遇到一个需要绘制自定义形状的需求。那只能利用Sprite来绘制一条具有自定义图片的线,通过代码动态设置起点、终点以及线宽,实现灵活的线条效果。
Sprite画线

项目

场景布置

在Unity中创建一个空场景,随后创建一个空物体用于挂载脚本,并设置上Sprite Renderer组件。确保在项目中导入一张用于线条的Sprite图片,并将其分配给Sprite Renderer中的Sprite属性。
再分别设置起点、终点、线宽。
场景布置

代码编写

下面是核心的SpriteLine脚本的代码,该脚本使用ExecuteInEditMode属性,使其在编辑模式下也能生效。

using UnityEngine;

[ExecuteInEditMode]
public class SpriteLine : MonoBehaviour
{
    public SpriteRenderer lineSprite; // 需要在Inspector窗口中分配的Sprite
    public Vector3 startPoint;
    public Vector3 endPoint;
    public float lineWidth = 0.1f;

    private SpriteRenderer spriteRenderer;

    public Transform caster;
    public Transform target;

    /// <summary>
    /// 初始化
    /// </summary>
    public void Init(Transform caster, Transform target)
    {
        this.caster = caster;
        this.target = target;
    }

    void Start()
    {
        Init(caster, target);
        CreateSpriteRenderer();
        UpdatePositionAndRotation();
    }

    void Update()
    {
        if (caster != null)
        {
            startPoint = caster.position;
        }

        if (target != null)
        {
            endPoint = target.position;
        }
        // 在运行时更新位置和旋转,以确保线跟随起点和终点的位置变化
        UpdatePositionAndRotation();
    }

    void OnDrawGizmos()
    {
        //return;
        CreateSpriteRenderer();
        spriteRenderer.sprite = lineSprite.sprite;
        spriteRenderer.drawMode = SpriteDrawMode.Sliced;

        Gizmos.color = Color.white;
        Gizmos.DrawLine(startPoint, endPoint);
    }

    void CreateSpriteRenderer()
    {
        if (spriteRenderer == null)
        {
            spriteRenderer = GetComponent<SpriteRenderer>();
            if (spriteRenderer == null)
            {
                spriteRenderer = gameObject.AddComponent<SpriteRenderer>();
                spriteRenderer.hideFlags = HideFlags.HideInInspector | HideFlags.HideInHierarchy;
            }
        }
    }

    void UpdatePositionAndRotation()
    {
        // 设置线的中心位置为起点和终点的中点
        Vector3 centerPosition = (startPoint + endPoint) / 2f;
        transform.position = centerPosition;

        // 设置旋转角度
        Vector3 direction = endPoint - startPoint;
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);

        // 设置Sprite的大小
        spriteRenderer.size = new Vector2(direction.magnitude, lineWidth);
    }
}

总结

通过以上步骤,我们完成了Sprite绘制自定义图片线的基本设置。这个方法不仅方便,而且能够在运行时动态更新线的位置和旋转,使其能够跟随起点和终点的变化而变化。

运行效果

在运行时,你将看到自定义Sprite图片被绘制成一条连接起点和终点的线,并且该线的宽度和方向能够根据需要进行动态调整。

通过这种方式,我们可以轻松实现更加个性化和复杂的线条效果,为游戏场景的美观性和交互性提供更多可能性。希望本文对你在Unity中实现自定义图片线条的需求有所帮助。

感谢

ChatGPT

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值