unity3d 如何在Unity中将对象示例化到路径上

polkgigr  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(157)

我最近刚接触到c#,我需要一些帮助。
实际上,我有两个脚本,一个用于生成对象,一个用于沿着路径移动对象。我需要一种方法来合并这两种机制,以便当一个新对象被示例化时,它自动加入路径并跟随它。
路径是使用iTween. ![The objects the scripts are attached to] (https://i.stack.imgur.com/QPQn2.png)创建的
我尝试过将变量m_PlayerObj更改为立方体预制件,并尝试过将Path脚本添加到示例化脚本,但似乎没有任何效果。
附加的脚本不包括我所做的这些尝试,因为我想让代码非常清楚。
Spawner脚本

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

public class SpawnerScript : MonoBehaviour
{
    public GameObject cubeprefab;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
             Instantiate(cubeprefab, transform.position, Quaternion.identity);

        }
    }
}

路径脚本

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

public class Path : MonoBehaviour
{
    public GameObject m_PlayerObj;
    public Transform[] positionPoint;
    [Range(0, 1)]
    public float value;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(iTween.PathLength(positionPoint));
    }
    float tempTime;
    // Update is called once per frame
    void Update()
    {
        if (value < 1)
        {
            value += Time.deltaTime / 10;
        }
        iTween.PutOnPath(m_PlayerObj, positionPoint, value);
    }

    private void OnDrawGizmos()
    {
    iTween.DrawPath(positionPoint,Color.green);
    }
}

如上所述,任何帮助都将非常感谢,因为我真的被困在这个概念,因为我是新的统一,我真的看不到一个方法来解决它//如何修复它。

r7s23pms

r7s23pms1#

Path脚本中存储一个对象集合,而不是只存储播放器对象,这样路径就可以跟踪多个对象。

//public GameObject m_PlayerObj;    // Get rid of this
    public List<GameObject> followers;  // Add this

然后,在Update循环中,您可以循环遍历所有这些元素。

void Update()
    {
        for (var i = 0; i < followers.Length; ++i)
        {
            if (value < 1)
            {
                value += Time.deltaTime / 10;
            }
            iTween.PutOnPath(m_PlayerObj, positionPoint, value);
        }
    }

当然,现在,你需要确保在你繁殖Path游戏对象时将你的立方体示例传递给它,这样路径就知道立方体跟随者。这意味着你的繁殖者也需要知道路径。

public class SpawnerScript : MonoBehaviour
{
    public GameObject cubeprefab;
    public Path path;   // Need to populate this in the Editor, or fetch it during Awake()

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            var cubeInst = Instantiate(cubeprefab, transform.position, Quaternion.identity);
            path.followers.Add(cubeInst);
        }
    }
}

现在一个新的问题是,每个对象在路径上的位置都是相同的,因为路径只存储一个value--更好的术语可能是progress。所以,如果它们都是相同的,比如立方体,你将无法分辨,因为它们会重叠。
因此,您必须决定要执行什么操作。均匀地将它们间隔开?您可以通过一些数学运算来实现。或者让它们从头开始并分别跟踪它们的进度?然后,您需要存储每个进程的进度。更好的方法可能是在多维数据集对象上执行此操作,这意味着您需要向多维数据集预制件添加一个新脚本:

public class PathFollower : MonoBehaviour
{
    [Range(0, 1)]
    public float pathProgress;
}

而且,您需要开始通过此脚本引用prefab,而不仅仅是GameObject
第一个
最后,您需要确保为每个路径跟随者使用单独的进度,而不是像旧的路径脚本那样使用单个进度值:

for (var i = 0; i < followers.Count; ++i)
        {
            if (followers[i].pathProgress < 1)
            {
                followers[i].pathProgress += Time.deltaTime / 10;
            }
            iTween.PutOnPath(followers[i].gameObject, positionPoint, followers[i].pathProgress);
        }

把所有这些放在一起(当然是单独的文件,带有它们自己的include!):

public class SpawnerScript : MonoBehaviour
{
    public PathFollower pathFollower;
    public Path path;   // Need to populate this in the Editor, or fetch it during Awake()

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            var followerInst = Instantiate(pathFollower, transform.position, Quaternion.identity);
            path.followers.Add(followerInst);
        }
    }
}

public class Path : MonoBehaviour
{
    //public GameObject m_PlayerObj;    // Get rid of this
    public List<PathFollower> followers;  // Add this
    public Transform[] positionPoint;
    //[Range(0, 1)]
    //public float value;  // Don't need this anymore either

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(iTween.PathLength(positionPoint));
    }

    // Update is called once per frame
    void Update()
    {
        for (var i = 0; i < followers.Count; ++i)
        {
            if (followers[i].pathProgress < 1)
            {
                followers[i].pathProgress += Time.deltaTime / 10;
            }
            iTween.PutOnPath(followers[i].gameObject, positionPoint, followers[i].pathProgress);
        }
    }

    private void OnDrawGizmos()
    {
        iTween.DrawPath(positionPoint,Color.green);
    }
}

public class PathFollower : MonoBehaviour
{
    [Range(0, 1)]
    public float pathProgress;
}

相关问题