NavmeshAgent玩家在山上移动时不平行于山坡 [英] NavmeshAgent player not parallel to slope of hill when moving over hill
问题描述
NavmeshAgent玩家在山丘上移动时不能与山坡平行.在平面上,它运行平稳.
NavmeshAgent player not parallel to slope of hill when moving over hill. On plane surface its going smoothly.
在navMesh和播放器的 Image 属性下方 https://ibb.co/fijmoV
Below Image properties of navMesh and player https://ibb.co/fijmoV
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class SampleAgentScript : MonoBehaviour {
public Transform target ;
NavMeshAgent agent;
// private static bool start1=false , start2=false, start3;
// Use this for initialization
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
//if white button click moves to targer-1
agent.SetDestination(target.position);
}
}
推荐答案
我不确定NavmeshAgent
是否适合您.这看起来像您应该手动执行的操作.
I am not sure if NavmeshAgent
is supposed to do that for you. This looks like something you're supposed to do manually.
您可以通过向下进行射线投射并获得击穿点的法线来校正角色的旋转以匹配坡度.在获得了命中点的法线之后,您可以使用该法向命中点计算新的旋转.有很多方法可以执行此计算,但是使用Quaternion.FromToRotation
并使用Quaternion.Lerp
限制旋转似乎效果最好.
You can correct the rotation of the character to match the slope by performing a raycast downwards and obtaining the normal of the hit point. After obtaining the normal of the hit point, you can then calculate the new rotation with that normal hit point. There are many ways to do that calculation but using Quaternion.FromToRotation
and lerping the rotation with Quaternion.Lerp
seems to work best.
最后,请确保仅对您视为山丘"或地面"的对象进行光线投射.您可以通过在小山"或地面"对象所在的图层上按位操作来执行此操作.下面的示例假定您认为山丘"或地面"的对象在名为山丘"的图层上.
Finally, make sure to the raycast is only done to Objects you considered as a "Hill" or "Ground". You can do this with the bitwise operation on the layer the "Hill" or "Ground" objects are placed on. The example below assumes that the Objects you consider as "Hill" or "Ground" are on a layer called "Hill".
//Reference of the moving GameObject that will be corrected
public GameObject movingObject;
//Offset postion from where the raycast is cast from
public Vector3 originOffset;
public float maxRayDist = 100f;
//The speed to apply the corrected slope angle
public float slopeRotChangeSpeed = 10f;
void Update()
{
//Get the object's position
Transform objTrans = movingObject.transform;
Vector3 origin = objTrans.position;
//Only register raycast consided as Hill(Can be any layer name)
int hillLayerIndex = LayerMask.NameToLayer("Hill");
//Calculate layermask to Raycast to.
int layerMask = (1 << hillLayerIndex);
RaycastHit slopeHit;
//Perform raycast from the object's position downwards
if (Physics.Raycast(origin + originOffset, Vector3.down, out slopeHit, maxRayDist, layerMask))
{
//Drawline to show the hit point
Debug.DrawLine(origin + originOffset, slopeHit.point, Color.red);
//Get slope angle from the raycast hit normal then calcuate new pos of the object
Quaternion newRot = Quaternion.FromToRotation(objTrans.up, slopeHit.normal)
* objTrans.rotation;
//Apply the rotation
objTrans.rotation = Quaternion.Lerp(objTrans.rotation, newRot,
Time.deltaTime * slopeRotChangeSpeed);
}
}
这篇关于NavmeshAgent玩家在山上移动时不平行于山坡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!