【问题标题】:Create a curve to show where an object will be projected in Unity创建一条曲线以显示对象在 Unity 中的投影位置
【发布时间】:2020-04-04 22:22:44
【问题描述】:

我在下面有一些代码,可以将对象沿曲线投影到给定位置,并且效果很好。

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

public class Move : MonoBehaviour {

    public GameObject platform;
    public Vector3 targetPos;
    public float speed = 10;
    public float arcHeight = 1;

    Vector3 startPos;

    GameObject line;


    // Use this for initialization
    void Start () {
        startPos = transform.position;
        targetPos = platform.transform.position;
        targetPos.x -= 0.7f;
        targetPos.y += 1.5f;
    }

    // Update is called once per frame
    void Update () {
       movePlayer();
    }


    void movePlayer()
    {
        // Compute the next position, with arc added in
        float x0 = startPos.x;
        float x1 = targetPos.x;
        float dist = x1 - x0;
        float nextX = Mathf.MoveTowards(transform.position.x, x1, speed * Time.deltaTime);
        float baseY = Mathf.Lerp(startPos.y, targetPos.y, (nextX - x0) / dist);
        float arc = arcHeight * (nextX - x0) * (nextX - x1) / (-0.25f * dist * dist);
        Vector3 nextPos = new Vector3(nextX, baseY + arc, transform.position.z);


        transform.position = nextPos;

        // Do something when we reach the target
        if (nextPos == targetPos) Arrived();
    }

    void Arrived()
    {
        Destroy(gameObject);
    }

}

我现在希望能够添加一条可见的曲线来显示对象的路径。我看过一些使用 LineRenderer 的示例,但我不确定如何将其合并到我移动对象的方式中。任何有关如何做到这一点的帮助将不胜感激。

【问题讨论】:

    标签: c# unity3d curve


    【解决方案1】:

    我编辑了您的代码,让 LineRenderer 创建路径。这个想法是您预先生成对象的坐标,使用位置作为下一个位置的输入。 (所以不仅仅取决于你的对象的变换)。

    一定要在检查器中设置Material,否则你只会看到一条粉红色的线。我希望这是你的想法。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Move : MonoBehaviour
    {
    
        public GameObject platform;
        public Vector3 targetPos;
        public float speed = 10;
        public float arcHeight = 1;
    
        Vector3 startPos;
    
        GameObject line;
    
        /// <summary>
        /// Our linerenderer
        /// </summary>
        private LineRenderer lineRenderer;
    
        /// <summary>
        /// Line material.
        /// </summary>
        [SerializeField]
        private Material lineMaterial;
    
        // Use this for initialization
        private void Start()
        {
            startPos = transform.position;
            targetPos = platform.transform.position;
            targetPos.x -= 0.7f;
            targetPos.y += 1.5f;
    
            // Add a linerenderer.
            lineRenderer = gameObject.AddComponent<LineRenderer>();
    
            if (lineMaterial == null)
            {
                Debug.LogError("No LineMaterial specified!");
            }
    
            // If you do not want to use worldspace, set this to false:
            lineRenderer.useWorldSpace = true;
    
            // Set preferred texture mode for texture.
            lineRenderer.textureMode = LineTextureMode.RepeatPerSegment;
    
            // Shadows, or not?
            //lineRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            //lineRenderer.receiveShadows = false;
    
            // Finally, set the material that you want to assign.
            // Remember: If you use default shader, it needs to be set to "Transparent" to get your texture's alpha working.
            lineRenderer.sharedMaterial = lineMaterial;
    
    
        }
    
        // Update is called once per frame
        private void Update()
        {
            movePlayer();
        }
    
        private void movePlayer()
        {
            // Compute the next position, with arc added in
            Vector3 nextPos = newPosition(transform.position, speed * Time.deltaTime);
            transform.position = nextPos;
    
            // Calculate upcoming positions.
            Vector3[] points = generateUpcomingPositions(nextPos);
            CreateLine(points);
    
    
            // Do something when we reach the target
            if (nextPos == targetPos) Arrived();
        }
    
        private Vector3 newPosition(Vector3 currentPosition, float delta)
        {
            float x0 = startPos.x;
            float x1 = targetPos.x;
            float dist = x1 - x0;
            float nextX = Mathf.MoveTowards(currentPosition.x, x1, delta);
            float baseY = Mathf.Lerp(startPos.y, targetPos.y, (nextX - x0) / dist);
            float arc = arcHeight * (nextX - x0) * (nextX - x1) / (-0.25f * dist * dist);
            Vector3 nextPos = new Vector3(nextX, baseY + arc, currentPosition.z);
    
            return nextPos;
        }
    
        private Vector3[] generateUpcomingPositions(Vector3 currentPosition)
        {
            int steps = 10;
            float delta = (1.0f / ((steps - 1))) * 2.0f;// Double delta.
            List<Vector3> points = new List<Vector3>();
    
            Vector3 newPos = currentPosition;
            for (int i = 0; i < steps; i++)
            {
                // Use newPos as input for location.
                newPos = newPosition(newPos, delta * i);
    
                points.Add(newPos);
            }
    
            return points.ToArray();
        }
    
    
        private void Arrived()
        {
            Destroy(gameObject);
        }
    
        /// <summary>
        /// Create a line with a given name, width and points.
        /// </summary>
        /// <param name="points"></param>
        private void CreateLine(Vector3[] points)
        {
    
            // Set the positions.
            lineRenderer.positionCount = points.Length;
            lineRenderer.SetPositions(points);
    
        }
    }
    
    

    【讨论】:

    • 非常感谢您的回答。曲线绘制在对象的稍右侧。你知道为什么会这样吗?
    • 可能是由于您自己添加的 targetPos 偏移量?我只是用一个立方体去球体测试它,没有它它看起来完全居中。 ``` targetPos.x -= 0.7f;目标位置.y += 1.5f; ```
    • 原来我的精灵是如何设计的错误。最后一件事。曲线真的是像素化和模糊的。有没有办法让它平滑?我尝试增加步骤,但什么也没做
    • 这是我要做的一个简单改进:使用粒子图像并将其与配置为“淡化”的材质一起使用。我为你创建了一个快速的粒子纹理link。为此纹理打开 Alpha(!)将其用作漫反射纹理。将线渲染器 textureMode 设置为“stretch”。结果是这样的:link。玩弄“发射”和其他粒子纹理(例如,试试 Google 图片)
    • 我已将您发送的图像添加到我的资产文件夹中,并创建了新材质并将渲染模式设置为淡出。但是我不确定如何将图像链接到材料。链接图片有很多不同的设置
    猜你喜欢
    • 2013-12-24
    • 2016-09-18
    • 1970-01-01
    • 2014-05-23
    • 2017-04-10
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多