我刚刚从今天早上5.0.0将Unity更新到版本5.2.1,我遇到了一些问题。在Unity将游戏翻译为新版本后,我测试了游戏。一切都很好,除了当我在游戏中射击子弹时,它们会粘在墙壁上而不是从它们上弹跳,但只能在某些角度和距离。这就像子弹太快了,它跳过撞击对撞机并卡在对撞机里面。这会有点意义,但奇怪的是我在游戏中有慢速运动的C#脚本。每当我打开慢动作然后再将其关闭时,子弹贴的问题就会消失。我似乎无法弄清楚导致问题的原因在我更新软件之前肯定不存在。任何人都可以帮我解决这个问题吗?谢谢。我将发布下面的子弹脚本和慢动作脚本。顺便说一下,子弹在玩家脚本中实例化。
子弹脚本:
using UnityEngine;
using System.Collections;
public class Bullet : MonoBehaviour {
public float bulletSpeed;
public float bulletOpacity;
public bool fadeOut;
Animator anim;
Rigidbody2D rigidbod;
SpriteRenderer spriterend;
public GameObject player;
public float aimRotation;
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
rigidbod = GetComponent<Rigidbody2D> ();
spriterend = GetComponent<SpriteRenderer> ();
rigidbod.velocity = transform.right * bulletSpeed;
rigidbod.gravityScale = 0;
bulletOpacity = 1;
}
// Update is called once per frame
void Update () {
Destroy (gameObject, 3f);
spriterend.color = new Color (1f, 1f, 1f, bulletOpacity);
if (fadeOut == true)
bulletOpacity -= 0.03f;
if (bulletOpacity <= 0)
Destroy (gameObject);
aimRotation = player.GetComponent<Player> ().aimRotation;
}
void OnTriggerEnter2D (Collider2D bulletHit) {
/*if (bulletHit.gameObject.layer == LayerMask.NameToLayer ("vulnerableLayer")) {
}*/
rigidbod.gravityScale = 1;
rigidbod.drag = 1;
fadeOut = true;
}
}
慢动作脚本:
using UnityEngine;
using System.Collections;
public class SlowMotion : MonoBehaviour {
public float currentLongevity = 0f;
public float slowAmount = 0.2f;
public float normalTime = 1f;
public float slowLongevity = 0.4f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (1)) {
Time.fixedDeltaTime = 0.0f * Time.timeScale;
if (Time.timeScale == normalTime)
Time.timeScale = slowAmount;
}
if (Time.timeScale == slowAmount) {
currentLongevity += Time.deltaTime;
}
if (currentLongevity > slowLongevity) {
currentLongevity = 0;
Time.timeScale = normalTime;
}
}
}
答案 0 :(得分:1)
因为你表示“怪异”。在运行SlowMotion脚本后,bullet行为停止,我建议问题与设置Time.fixedDeltaTime有关,就像在SlowMotion脚本的Update()方法中一样。您之后的评论也支持这一点,即“怪异”的评论。当你将rigidBody2D的碰撞检测设置为连续时,不再出现这种行为(我认为是子弹的RigidBody2D)。
Continuous RididBody2D碰撞检测可以确定更新之间是否发生了 ,其中Discrete碰撞检测在物理更新期间注册了碰撞 。在SlowMotion脚本中,以下行(在Update()方法中)将fixedDeltaTime设置为零:
Time.fixedDeltaTime = 0.0f * Time.timeScale;
由于Time.fixedDeltaTime 执行物理和其他固定帧速率更新的间隔(以秒为单位),因此必须存在一些实际运行帧速率的最小值(0.0)不能是实际的帧速率更新间隔)。当Time.fixedDeltaTime == 0.0时,Unity可以使用默认的最小值或使用它来指示帧更新尽可能频繁地运行(尽管我没有对此进行测试)。由于Bullet脚本调用Update()而不是FixedUpdate(),因此无法保证实际的interval between the frame updates is uniform。我怀疑当你运行SlowMotion脚本并将Time.fixedDeltaTime设置为0.0时,Unity会以尽可能小的帧更新间隔运行,并且在此之后,它会渲染预期的子弹行为。
测试此方法的一种方法是在编辑器中将初始Time.fixedDeltaTime设置为0.0(并且对于子弹的RididBody2D,您的碰撞检测行为将回到离散状态。)
在编辑器中设置Time Manager fixedDeltaTime:主菜单 - &gt;编辑 - &gt;项目设置 - &gt;时间
如果发现fixedDeltaTime有效,可以在编辑器中设置它,并在Awake()方法中检索SlowMotion脚本中的初始值,以初始化基本fixedDeltaTime。我不建议使用fixedDeltaTime == 0.0,因为在文档中没有指示0.0的时间间隔的一致行为,并且它可能更多地绑定到底层硬件并且可能导致更多意外行为。
希望这有帮助,欢呼!