Unity3D中实现箭头指向目标点的效果(shader)

系列文章目录

Unity工具



前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。


提示:以下是本篇文章正文内容,下面案例可供参考

一、效果如下

Unity箭头指向目标点视频

二、制作步骤

2-1、制作shader

首先先生成shader文件
在这里插入图片描述

2-2、shader代码

Shader "Custom/ZhiXiangJianTou"
{
   Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _ScrollYSpeed("Y Scroll Speed", Range(-20, 20)) = 2
    }
        SubShader
        {
            Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
            LOD 100
            //双面渲染
            Cull Off
            //Alpha混合
            Blend SrcAlpha OneMinusSrcAlpha

            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                struct appdata
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                };

                struct v2f
                {
                    float2 uv : TEXCOORD0;
                    float4 vertex : SV_POSITION;
                };

                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed _ScrollYSpeed;

                v2f vert(appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    fixed2 uv = i.uv;
                    uv.y += _ScrollYSpeed * _Time;
                    fixed4 col = tex2D(_MainTex, uv);
                    return col;
                }
                ENDCG
            }
        }
}

2-3、制作材质球

在这里插入图片描述
在这里插入图片描述
所需要的贴图
请添加图片描述

2-4、新建Quad

新建一个Quad的对象,给他换上刚刚的材质球
在这里插入图片描述
做成预制体一会用

2-5、制作预制体

1.拖到Project自己创的文件夹下面
在这里插入图片描述
2.如箭头就是刚刚生层的预制体,留着一会用

2-6 、实现代码

预制体一拖,路径点一拖,运行即可看到效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ZhiXiangJianTou : MonoBehaviour
{
    public MeshRenderer meshRenderer;//箭头3D对象Quad 预制体
    public List<Transform> points = new List<Transform>();//路径点
    private List<MeshRenderer> lines = new List<MeshRenderer>();//显示的路径

    public float xscale = 1f;//缩放比例
    public float yscale = 1f;

    void Start()
    {
        //箭头宽度缩放值
        xscale = meshRenderer.transform.localScale.x;
        //箭头长度缩放值
        yscale = meshRenderer.transform.localScale.y;
    }

    //画路径
    public void DrawPath()
    {
        if (points == null || points.Count <= 1)
            return;
        for (int i = 0; i < points.Count - 1; i++)
        {
            DrawLine(points[i].position, points[i + 1].position, i);
        }
    }

    //画路径 参数为路径点数组
    public void DrawPath(Vector3[] points)
    {
        if (points == null || points.Length <= 1)
            return;
        for (int i = 0; i < points.Length - 1; i++)
        {
            DrawLine(points[i], points[i + 1], i);
        }
    }

    //隐藏路径
    public void HidePath()
    {
        for (int i = 0; i < lines.Count; i++)
            lines[i].gameObject.SetActive(false);
    }

    //画路径
    private void DrawLine(Vector3 start, Vector3 end, int index)
    {
        Debug.Log(transform.gameObject.name);
        MeshRenderer mr;
        if (index >= lines.Count)
        {
            mr = Instantiate(meshRenderer);
            lines.Add(mr);
        }
        else
        {
            mr = lines[index];
        }

        var tran = mr.transform;
        var length = Vector3.Distance(start, end);
        tran.localScale = new Vector3(xscale, length, 1);
        tran.position = (start + end) / 2;
        //指向end
        tran.LookAt(end);
        //旋转偏移
        tran.Rotate(90, 0, 0);
        mr.material.mainTextureScale = new Vector2(1, length * yscale);
        mr.gameObject.SetActive(true);
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(20, 40, 80, 20), "显示路径"))
        {
            DrawPath();
        }
        if (GUI.Button(new Rect(20, 80, 80, 20), "隐藏路径"))
        {
            HidePath();
        }
    }
}

2-7、设置Quad到脚本

在这里插入图片描述

2-8、路径设置如下

在这里插入图片描述

三、说明

这个是已经计算过根据距离算shader的间隔,不论两个点的间隔多远,shader的渲染间隔是一样的,所以不用担心每个点的间隔不一样了,毫无影响,代码直接用就好了

四、运行程序

Unity箭头指向目标点视频


总结

你的点赞就是对博主的支持,有问题记得留言:
不定时更新Unity开发技巧,觉得有用记得一键三连哦。

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
您可以通过QGraphicsItemAnimation类来实现箭头指向动画效果。具体实现步骤如下: 1. 创建箭头图形项,并将其添加到场景。 2. 创建QGraphicsItemAnimation对象,并将箭头图形项设置为其目标项。 3. 创建QPropertyAnimation对象,并将其设置为QGraphicsItemAnimation的动画属性。 4. 设置QPropertyAnimation对象的起始值和结束值,以实现箭头指向动画效果。 5. 将QPropertyAnimation对象添加到QGraphicsItemAnimation对象。 6. 启动QGraphicsItemAnimation对象的动画。 以下是一个简单的示例代码,可以实现箭头指向动画效果: ```python from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class ArrowItem(QGraphicsPathItem): def __init__(self, parent=None): super().__init__(parent) self.setFlag(QGraphicsItem.ItemIsMovable) path = QPainterPath() path.moveTo(0, 0) path.lineTo(30, 0) path.lineTo(25, -5) path.moveTo(30, 0) path.lineTo(25, 5) self.setPath(path) class ArrowAnimation(QGraphicsItemAnimation): def __init__(self, arrowItem, parent=None): super().__init__(parent) self.setItem(arrowItem) self.anim = QPropertyAnimation(self, b"rotation") self.anim.setEasingCurve(QEasingCurve.OutQuad) self.anim.setDuration(1000) def setStartAngle(self, angle): self.anim.setStartValue(angle) def setEndAngle(self, angle): self.anim.setEndValue(angle) def start(self): self.anim.start() if __name__ == "__main__": app = QApplication([]) view = QGraphicsView() scene = QGraphicsScene() arrow = ArrowItem() scene.addItem(arrow) arrowAnim = ArrowAnimation(arrow) arrowAnim.setStartAngle(0) arrowAnim.setEndAngle(90) arrowAnim.start() view.setScene(scene) view.show() app.exec_() ``` 在这个示例,我们创建了一个ArrowItem类来表示箭头图形项,它继承自QGraphicsPathItem类。我们还创建了一个ArrowAnimation类来表示箭头指向动画效果,它继承自QGraphicsItemAnimation类。在ArrowAnimation类,我们创建了一个QPropertyAnimation对象来控制箭头旋转角度的动画效果。我们还实现了setStartAngle()和setEndAngle()方法,用于设置动画的起始角度和结束角度。最后,我们在主函数创建了箭头图形项和箭头指向动画对象,并添加到场景。调用start()方法启动动画效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心疼你的一切

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

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

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

打赏作者

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

抵扣说明:

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

余额充值