【问题标题】:Make player follow a waypoint path but still be able to control player movement让玩家跟随一个航路点路径,但仍然能够控制玩家的移动
【发布时间】:2021-05-06 12:47:49
【问题描述】:

我正在开发一款赛车游戏,其中我有一个带有路点的预定义路径,我想要实现的是,我希望我的玩家遵循路径的一般方向,但仍然完全控制我的玩家。如,它一直沿着路径前进,但我应该能够左右移动它以避开障碍物。

这是我现在使用的一段代码。

#region Following the path
     if (PathGenerator.instance.wayPoints.Count > 0)
     {
         Transform currentNode = PathGenerator.instance.wayPoints[currentNodeCount];

         transform.position = Vector3.MoveTowards(transform.position, currentNode.position, forwardSpeed * Time.deltaTime);
         transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(currentNode.position - transform.position), 1 * Time.deltaTime);

         float distance = Vector3.Distance(transform.position, currentNode.position);
         if(distance < 1f)
         {
             if(currentNodeCount < PathGenerator.instance.wayPoints.Count - 1)
             currentNodeCount++;
         }
     }
     #endregion

但这里的问题是玩家会直接进入航路点,即使我左右移动它也是如此。它只会回到航路点的中心。 观看 gif:-

你可以看到它是如何回到中心跟随航路点的,我无法像这样控制玩家。我想要的只是玩家跟随电路路径本身,但我想控制它的 X 轴以避免障碍。

有人可以在这里指导我并帮助我解决我的问题吗?任何帮助或想法将不胜感激。

谢谢。

【问题讨论】:

  • 保持球员位置和限制前进,球员只能左右移动。并按照您的路径向前移动路径,类似于无尽的跑步游戏。
  • 对不起,我不明白。能详细点吗?

标签: c# unity3d artificial-intelligence


【解决方案1】:

以下可能不是解决此问题的最佳方法,但会帮助您走得更远

您可以如下设置播放器

带有脚本和角色(胶囊)作为孩子的玩家对象 请检查下图

player_heirarchy

然后使用以下代码,您将被允许移动角色侧面,保持主要对象跟随航路点。 稍后您可以为最大侧向移动添加一些限制。

void Update()
{
    //made a similar situation from your code
    if (waypoints.Length > 0)
    {
        Transform currentNode = waypoints[currentNodeCount].transform;

        transform.position = Vector3.MoveTowards(transform.position, currentNode.position, 10f * Time.deltaTime);
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(currentNode.position - transform.position), 1 * Time.deltaTime);

        float distance = Vector3.Distance(transform.position, currentNode.position);
        if (distance < 1f)
        {
            if (currentNodeCount < waypoints.Length - 1)
                currentNodeCount++;
        }
    }

    // side movement to child object, in m case it is Player Object's second child
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.GetChild(1).Translate(Vector3.left * 5f * Time.deltaTime);
    }
    else if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.GetChild(1).Translate(Vector3.right * 5f * Time.deltaTime);
    }
}

同时附加输出视频 Follow_waypoint_along_with_manual_side_movement

附: : 这是我的第一个回答,如果没有正确的回答,请原谅。

【讨论】:

  • 嗨,Hiren,非常感谢您在此答案中的详细信息和努力。这正是我一直在寻找的效果,并且解决方案比我想象的要容易,我现在觉得很愚蠢。为什么我没想到? :p 非常感谢您的帮助并帮助我解决了这个问题。你太棒了!
  • 为了能够限制横向移动而不是 Translate 做例如var pos = transform.localPosition; pos.x += 5f * Time.deltaTime; pos.x = Mathf.Clamp(pos.x, minX, maxX); transform.localPosition = pos;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多