我刚刚从5.0.0更新到5.2.1版本,我遇到了一些问题。统一翻译了新版本的游戏后,我对游戏进行了测试。一切都很好,除了当我在比赛中射中一颗子弹时,他们会粘在墙上而不是弹跳,但只能在一定的角度和距离上。子弹太快了,跳过对撞机,卡在对撞机里。这有点道理,但奇怪的是,我在游戏中有一个慢动作的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;
}
}
}发布于 2015-08-31 16:18:47
由于您指出在运行SlowMotion脚本后“怪异”的弹出行为停止,我建议这个问题与设置Time.fixedDeltaTime有关,就像您在SlowMotion脚本的Update()方法中所做的那样。这一点也得到了后面的评论的支持,即当您将刚Body2D的碰撞检测设置为连续(我假设是子弹的RigidBody2D )时,“怪异”行为就不再出现了。
连续RididBody2D碰撞检测可以确定更新之间是否发生了接触,因为离散型碰撞检测在物理更新期间注册了冲突。在SlowMotion脚本中,下面一行(在Update()方法中)将fixedDeltaTime设置为0
Time.fixedDeltaTime = 0.0f * Time.timeScale;由于Time.fixedDeltaTime是执行物理和其他固定帧速率更新的秒间隔,因此必须有一些实际运行帧速率的最小值(0.0不能是实际的帧速率更新间隔)。当Time.fixedDeltaTime == 0.0时,统一可以使用缺省的最小值,或者使用它来指示帧更新尽可能频繁地运行(尽管我还没有测试这个值)。由于符号脚本调用Update()而不是FixedUpdate(),因此无法保证实际的帧更新之间的间隔是一致的。。我怀疑,当您运行SlowMotion脚本,并将Time.fixedDeltaTime设置为0.0时,团结会以尽可能小的帧更新间隔运行,并且在此之后,它将呈现预期的弹出行为。
测试这一点的一种方法是在编辑器中将初始Time.fixedDeltaTime设置为0.0 (对于子弹的RididBody2D,您的碰撞检测行为恢复为离散)。
在编辑器中设置时间管理器fixedDeltaTime:主菜单->编辑->项目设置->时间
如果您找到了一个工作的fixedDeltaTime,您可以在编辑器中设置它,并在SlowMotion脚本中的works ()方法中检索初始值,以初始化基本fixedDeltaTime。我不建议使用fixedDeltaTime == 0.0,因为在文档中没有迹象显示有一个时间间隔为0.0的一致行为,而且它可能更多地绑定到底层硬件,并可能导致更多意外行为。
希望这有帮助,干杯!
https://stackoverflow.com/questions/31950536
复制相似问题