我正在使用Charactercontroller组件来移动角色。 我要实现的目的是使角色在我用鼠标单击时消失。为此,我要旋转单击的位置,然后前进到光线与我的地形相撞的位置。 角色确实移动并到达我想要的位置。 问题是,例如,当进入坡道时,角色一直在空中行走并且不会掉落(据我所能理解的重力问题,尽管当我测试将角色放到编辑器中时将其放下时,重力问题仍然存在。 )它应该在应该停止的时候停在上面,并开始非常快地旋转。 这是我的动作脚本
private float gravity = 1f;
Animator anim;
CharacterController charController;
private float mvtSpeed = 3f;
private float distanceToPoint;
Vector3 playerMvt;
bool canMove = false;
CollisionFlags collisionFlags;
Ray ray;
RaycastHit hit;
Vector3 PlayerTarget;
float height;
private void Awake()
{
anim = GetComponent<Animator>();
charController = GetComponent<CharacterController>();
}
void MoveThePlayer()
{
if (Input.GetMouseButton(0))
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
if (hit.collider is TerrainCollider)
{
if (Vector3.Distance(transform.position, hit.point) >= 0.5f)
{
canMove = true;
anim.SetFloat("Walk", 1.0f);
PlayerTarget = hit.point;
}
}//terrain collider
}//raycast
}//mouse Down
if (canMove)
{
Vector3 targetTemp = new Vector3(PlayerTarget.x, transform.position.y, PlayerTarget.z);
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetTemp - transform.position), 15.0f * Time.deltaTime);
playerMvt = transform.forward * mvtSpeed * Time.deltaTime;
if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
{
anim.SetFloat("Walk", 0f);
playerMvt.Set(0f, 0f, 0f);
}
}//canMove
}
private void Update()
{
MoveThePlayer();
charController.Move(playerMvt);
if (!charController.isGrounded)
{
playerMvt.y -= gravity * Time.deltaTime;
}
}
答案 0 :(得分:2)
几件事。
canMove
永远不会重置为false
,应该在这里重置
if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
{
anim.SetFloat("Walk", 0f);
playerMvt.Set(0f, 0f, 0f);
}
此代码目前不影响其位置:
if (!charController.isGrounded)
{
playerMvt.y -= gravity * Time.deltaTime;
}
在移动播放器后,您将重力应用于playerMvt.y
,下一帧将在此处重新分配playerMvt
:
playerMvt = transform.forward * mvtSpeed * Time.deltaTime;
因此将其更改为此
private void Update()
{
MoveThePlayer();
if (!charController.isGrounded)
{
playerMvt.y -= gravity * Time.deltaTime;
}
charController.Move(playerMvt);
}