我正在构建一个由玩家移动的3D迷宫。我正在采取一个"迷宫"当玩家移动迷宫时,接近并且通过迷宫操纵小球。当球员移动球当前正在球的方向上休息时,会出现问题。球穿过墙壁,停在下一个可用的墙上。
迷宫使用网格对撞机和刚体,球是球体对撞机。
我大幅提高了物理帧速率无济于事。考虑到迷宫的复杂性和潜在的大量迷宫组合,我真的不想将简单的碰撞器连接到每个墙壁上。任何提示,技巧,建议,评论等都将不胜感激。
持续轮换的球剧:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ballGravity : MonoBehaviour {
public Rigidbody m_Rigidbody;
public Vector3 m_EulerAngleVelocity;
// Use this for initialization
void Start () {
m_EulerAngleVelocity = new Vector3 (0, 100, 0);
m_Rigidbody = GetComponent<Rigidbody>();
}
// Update is called once per frame
void FixedUpdate () {
Quaternion deltaRotation = Quaternion.Euler (m_EulerAngleVelocity * Time.deltaTime);
m_Rigidbody.MoveRotation (m_Rigidbody.rotation * deltaRotation);
}
}
迷宫旋转脚本:
using UnityEngine;
using System.Collections;
public class rotObj : MonoBehaviour
{
private float baseAngle = 0.0f;
float rotSpeed = 10;
void OnMouseDown(){
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) *Mathf.Rad2Deg;
}
void OnMouseDrag(){
//float rotY = Input.GetAxis("Vertical")*rotSpeed*Mathf.Deg2Rad;
//gm.transform.Rotate(Vector3.right, rotY);
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
float ang = Mathf.Atan2(pos.y, pos.x) *Mathf.Rad2Deg - baseAngle;
transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
}
}
答案 0 :(得分:2)
要获得一致的物理状态,最好在FixedUpdate中移动碰撞器 - 如果您在管道的OnMouseXX阶段移动碰撞器(请考虑咨询https://docs.unity3d.com/Manual/ExecutionOrder.html),您可能会在下次调用FixedUpdate时错过更改。即你的球根据你旋转迷宫之前的状态移动你的场景状态,并且有一些不幸的时间可能会错过碰撞。 如果您已尝试使用更严格的时间步长,请考虑对OnMouseDrag更改进行排队,例如将生成的旋转存储在变量中,并将其应用于FixedUpdate,因此仅在下一次物理计算时应用它。
你也可以考虑在旋转迷宫的同时移动你的球,快速将网状对撞机移动到一个小得多的刚体上是一个肯定的麻烦来源。你能移动相机吗?