zoukankan      html  css  js  c++  java
  • 【自走棋】曲线箭头

    <1>效果:

    <2>思路:

    使用贝塞尔曲线和LineRender

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO.Compression;
    
    public class CurveTest : MonoBehaviour
    {
    
        public float height = 4;
        [SerializeField]
        private Vector3 P0;
        [SerializeField]
        private Vector3 P1;
        [SerializeField]
        private Vector3 P2 = Vector3.zero;
        [SerializeField]
        private LineRenderer lineRenderer;
    
        private float useTime = 0;
        private float interval = 0;
        private int pointNum = 0;
        private List<Vector3> lst = new List<Vector3>();
    
        private GameObject start;
        private GameObject end;
    
        private void reset()
        {
            useTime = 0;
            float val = (P2 - P0).magnitude;
            pointNum = Mathf.FloorToInt(val)+1;
            interval = 1.0f / pointNum;
            lst.Clear();
            Vector3 p = (P0 + P2) * 0.5f;
            P1 = p + Vector3.up* pointNum/2;
        }
    
        private void showLine()
        {
            //从0开始 num+1
            Vector3 pos0 = getPosByTime(useTime);
            lst.Add(pos0);
            for (int i = 1; i <= pointNum; i++)
            {
                useTime += interval;
                Vector3 pos = getPosByTime(useTime);
                lst.Add(pos);
            }
            //策略:根据P0-P2的距离 计算应该有多少个间隔
            lineRenderer.SetVertexCount(lst.Count);
            for (int i = 0; i < lst.Count; i++)
            {
                lineRenderer.SetPosition(i, lst[i]);
            }
            lineRenderer.material.SetTextureScale("_MainTex", new Vector2(  (int)(lst.Count * 0.9), 1));
            setStartEnd();
        }
    
        private void setStartEnd()
        {
            if (start == null) start = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            start.transform.localScale = Vector3.one * 0.3f;
            if (end == null) end = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            end.transform.localScale = Vector3.one * 0.3f;
            start.transform.position = P0;
            end.transform.position = P2;
        }
    
        /// <summary>
        /// 通过时间点获取时间
        /// </summary>
        /// <param name="useTime"></param>
        /// <returns></returns>
        private Vector3 getPosByTime(float useTime)
        {
            return (1 - useTime) * (1 - useTime) * P0 + 2 * useTime * (1 - useTime) * P1 + useTime * useTime * P2;
        }
    
        void OnGUI()
        {
            if (GUILayout.Button("重置", GUILayout.Width(100), GUILayout.Height(100)))
            {
                reset();
                showLine();
            }
        }
    
    }
    

      

  • 相关阅读:
    kubernetes 节点数据彻底清理脚本
    多es 集群数据迁移方案
    .Net Framework各版本微软技术支持及到期日期
    etcd raft 处理流程图系列3-wal的读写
    etcd raft 处理流程图系列2-transport
    etcd raft 处理流程图系列1-raftexample
    一种分布式预写日志系统
    自适应软件缓存管理
    require/import路径中的叹号是什么?
    理解原型链
  • 原文地址:https://www.cnblogs.com/cocotang/p/10825417.html
Copyright © 2011-2022 走看看