首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一2D对撞机贴在墙上?

统一2D对撞机贴在墙上?
EN

Stack Overflow用户
提问于 2015-08-11 19:41:28
回答 1查看 1.3K关注 0票数 1

我刚刚从5.0.0更新到5.2.1版本,我遇到了一些问题。统一翻译了新版本的游戏后,我对游戏进行了测试。一切都很好,除了当我在比赛中射中一颗子弹时,他们会粘在墙上而不是弹跳,但只能在一定的角度和距离上。子弹太快了,跳过对撞机,卡在对撞机里。这有点道理,但奇怪的是,我在游戏中有一个慢动作的C#脚本。每当我打开慢动作,然后再关掉它,子弹的问题就会消失。我似乎不知道是什么导致了这个问题,在我更新软件之前,它肯定不存在。有人能帮我解决这个问题吗?谢谢。我会在下面贴出子弹脚本和慢动作脚本。顺便说一下,子弹是在播放器脚本中实例化的。

项目脚本:

代码语言:javascript
复制
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;

}

}

慢动作脚本:

代码语言:javascript
复制
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;
    }

}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-31 16:18:47

由于您指出在运行SlowMotion脚本后“怪异”的弹出行为停止,我建议这个问题与设置Time.fixedDeltaTime有关,就像您在SlowMotion脚本的Update()方法中所做的那样。这一点也得到了后面的评论的支持,即当您将刚Body2D的碰撞检测设置为连续(我假设是子弹的RigidBody2D )时,“怪异”行为就不再出现了。

连续RididBody2D碰撞检测可以确定更新之间是否发生了接触,因为离散型碰撞检测在物理更新期间注册了冲突。在SlowMotion脚本中,下面一行(在Update()方法中)将fixedDeltaTime设置为0

代码语言:javascript
复制
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的一致行为,而且它可能更多地绑定到底层硬件,并可能导致更多意外行为。

希望这有帮助,干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31950536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档