提问人:Arnaud Girard 提问时间:11/8/2023 最后编辑:JanSArnaud Girard 更新时间:11/8/2023 访问量:42
箱子在地面上和向前移动时旋转
Box spins when on ground and going forward
问:
我正在尝试创建一个可以跳跃、前进/后退和向右/向左移动的移动盒子。 但是当这个盒子接触或用对撞机接触某物时,它开始旋转并且不允许我移动它/不是很多,所以它开始绕圈(小圈子)。
盒子有 3 个组件:
1 - 未设置为触发
的盒子碰撞器 2 - 不使用重力的刚体(我在脚本中这样做)
3 - 我的脚本移动播放器
这是我的自定义脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(Collider))]
public class PlayerMovement : MonoBehaviour {
public float moveSpeed = 9f;
public float airMoveSpeed = 0.6f;
public float jumpSpeed = 8f;
public float gravity = 20f;
public float groundDrag = 6f;
public float airDrag = 4f;
public Camera playerCamera;
public float sensitivity = 2f;
public float lookXLimit = 45f;
public GroundCheck groundCheck;
Vector3 moveDirection = Vector3.zero;
Rigidbody rb;
float rotationX = 0;
bool isGrounded;
[HideInInspector]
public bool canMove = true;
void Start()
{
rb = gameObject.GetComponent<Rigidbody>();
isGrounded = false;
// Lock cursor
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void Update()
{
CheckGround();
MovePlayer();
Gun();
ControlDrag();
}
void CheckGround() {
isGrounded = groundCheck.isGrounded;
}
void MovePlayer() {
// Recalculate move direction based on axes
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
float curSpeedX = canMove ? moveSpeed * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? moveSpeed * Input.GetAxis("Horizontal") : 0;
moveDirection = (forward * curSpeedX) + (right * curSpeedY);
// moveDirection.y -= gravity * 1000;
if (Input.GetButton("Jump") && canMove && isGrounded)
{
rb.AddForce(transform.up * jumpSpeed, ForceMode.Impulse);
}
// Move the player
if(isGrounded) {
// transform.position += moveDirection;
rb.AddForce(moveDirection * Time.deltaTime, ForceMode.Acceleration);
} else {
// transform.position += moveDirection;
rb.AddForce(moveDirection * Time.deltaTime * airMoveSpeed, ForceMode.Acceleration);
}
// Player and Camera rotation
if (canMove)
{
rotationX += -Input.GetAxis("Mouse Y") * sensitivity;
rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * sensitivity, 0);
}
}
void ControlDrag() {
if(isGrounded) rb.drag = groundDrag;
else rb.drag = airDrag;
}
}
答:
0赞
JanS
11/8/2023
#1
首先,尝试将所有与物理相关的东西放入 .这是Unity进行所有物理计算的地方。这很可能不是这里的原因,但通常建议这样做。FixedUpdate()
碰撞是“正面”发生还是没有全脸接触?可能只是部分碰撞会给您的球员运动带来扭矩,而在您发布的代码中,我没有看到任何控制角运动的部件。
如果是这种情况,那么您也可以尝试冻结围绕 y 轴的旋转,就像您已经对其他两个轴所做的那样。
另一种选择是通过脚本控制立方体的朝向。
评论
0赞
Arnaud Girard
11/8/2023
所以我可以控制玩家面对的位置。在addforce之后的最后一部分,我基本上只是根据鼠标轴旋转播放器,但我尝试将其删除,它没有改变任何东西
上一个:骑乘平台 Phaser3
评论