我尝试使用 Unity3D 创建动画,其中我有一个通过将高度图转换为地形创建的世界。 我使用 python 程序计算该球体的路线,然后传输 x 和 y 值。我还想指出,在 Unity 中,我的地形平面是 x,z 平面,因此 python 程序中的 x,y 值实际上是 x,z 值。 我现在尝试沿着我创建的路点(基本上是 x,y 元组)移动一个球体,穿越所述地形。
我使用的功能是
MoveTowards
。这是到目前为止我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class WaypointMover : MonoBehaviour
{
[SerializeField]
private float _WaypointDistance = 0.01f; //DISTANCE REQUIRED TO MOVE TO NEXT WAYPOINT
[SerializeField]
private float _MovementSpeed = 6f; //TRAVEL SPEED
private List<Vector2> _Waypoints; //COLLECTION OF WAYPOINTS
private int _CurrentWaypointIndex; //TRACKS WAYPOINT INDEX
private Vector2 _CurrentWaypoint; //TRACKS CURRENT WAYPOINT TO MOVE TO
void Start()
{
_Waypoints = new List<Vector2>();
_CurrentWaypointIndex = 0; //Initial Waypoint Index
_CurrentWaypoint = _Waypoints[_CurrentWaypointIndex]; //Initial Waypoint
transform.position = new Vector3(_CurrentWaypoint.x, Terrain.activeTerrain.SampleHeight(new Vector3(_CurrentWaypoint.x, 0, _CurrentWaypoint.y)), _CurrentWaypoint.y); //Moving Sphere to start location
_CurrentWaypointIndex++;
}
// Update is called once per frame
void Update()
{
if (Vector2.Distance(_CurrentWaypoint, new Vector2(transform.position.x, transform.position.z)) < _WaypointDistance)
{
_CurrentWaypointIndex++;
if (_CurrentWaypointIndex < 0)
_CurrentWaypointIndex = 0;
_CurrentWaypoint = _Waypoints[_CurrentWaypointIndex % _Waypoints.Count];
}
else
{
transform.position = Vector3.MoveTowards(transform.position, new Vector3(_CurrentWaypoint.x, Terrain.activeTerrain.SampleHeight(transform.position) + 2f, _CurrentWaypoint.y), _MovementSpeed * Time.deltaTime);
}
transform.LookAt(_Waypoints[_CurrentWaypointIndex]);
}
}
注意:我删除了从 python 导入数据的部分代码以及与我的问题无关的所有其他内容。
我现在面临的问题是球体经常会夹入地形,即使我正在做
Terrain.activeTerrain.SampleHeight(transform.position) + 2f
,这应该将我的球体精确地移动到地形上。最后的 2 是我试图解决这个问题的偏移量,但球体仍然不断被剪切。
我还尝试在我的球体上添加一个刚体,但无论我如何减少球体的质量,在传送到其起始位置后我都不会移动。
理想情况下,我想让球体“粘”在地面上。如有任何帮助,我们将不胜感激。
我还添加了一些显示球体在地形内部并漂浮在其上方的图片。
我认为问题出在
Vector3.MoveTowards
函数上。
当函数移动球体时,它是否也会考虑地形,或者是否会忽略地形而只是移动物品,就好像没有任何障碍一样?我相当肯定是后者。在这种情况下,您可能需要重新考虑您的移动方法。
如果您的目标位置需要穿过地形,则刚体不允许这样做,从而使其看起来被卡住。
也许编写一个模仿
Vector3.MoveTowards
但可以使用刚体及其物理元素的函数。这不是一个复杂的功能,你只需让玩家面向目标位置,然后让它直线移动即可。我建议使用力量而不是持续移动,因为玩家无法通过不断增加其“x”或“y”轴位置来通过山状地形。增加力量会更加现实和优化。
仅供参考,将“+2”硬编码到该位置并不理想,请尝试以下操作:
position.y + Player.transform.scale.y / 2
希望我有帮助(;