【问题标题】:Score updates every frame on raycast hit, not only once光线投射命中的每一帧都会更新分数,而不仅仅是一次
【发布时间】:2021-04-06 04:26:41
【问题描述】:

我需要以某种方式制作,当玩家运行 raycast 时,得分值会更新 1。但是,它会更新每一帧。

我尝试用布尔检查来修复它,但无论如何,它和以前一样工作。

我在哪里做错了?

代码如下:

public class ScoreBehavior : MonoBehaviour{

public delegate void ScoreUpOnPass();

public static event ScoreUpOnPass onRayHit;

private int score = 0;

private bool hitOnce = false;

void Start()
{
}

void Update()
{
    RaycastHit hit;
    Ray checkRay = new Ray(transform.position, Vector3.down);
    
    
    if(Physics.Raycast(checkRay, out hit))
    {
        if (hit.collider.tag == "Player" && !hitOnce)
        {
            hitOnce = true;
            Debug.Log(score); // updates every frame
            onRayHit?.Invoke();
        }
        else
        {
            hitOnce = false;
        }
    }
    
}

}

【问题讨论】:

  • 场景中是否还有其他带有碰撞器的对象?我认为当 hit.collider.tag 不是 Player 时它会被重置

标签: c# unity3d


【解决方案1】:

我会尝试移动你的 if 检查一下,以防它撞到任何东西或撞到未标记玩家的物体。

void Update()
{
    RaycastHit hit;
    Ray checkRay = new Ray(transform.position, Vector3.down);
    
    if (Physics.Raycast(checkRay, out hit))
    {
        if (hit.collider.tag == "Player" && !hitOnce)
        {
            hitOnce = true;
            Debug.Log(score); // updates every frame
            onRayHit?.Invoke();
        }
    }
    else if (hitOnce)
    {
        hitOnce = false;
    }
}

【讨论】:

  • 它不会改变任何东西... Raycast 命中,是玩家吗?是的。 hitOnce 是假的。得分,设置hitOnce = true。下一帧:是播放器吗?是的。 hitOnce 为假,设置为真。下一帧:player, false, score up, set to true... 所以,还是会提高分数。它只会每隔一帧而不是每一帧发生一次。
  • @Ermiq 抱歉,当我输入它时,我已经半睡半醒了。试试这个。
【解决方案2】:

我建议使用OnTriggerEnter()。在这种情况下,光线投射并不是正确的仪器选择。
在得分点添加一个对撞机,设置为isTrigger = true,使用OnTriggerEnter(Collider col)查看谁进入了触发区域。每个进入该区域的物体只会触发一次,如果物体离开该区域然后返回,它将再次触发,因此它是完成这项任务的最佳工具。

【讨论】:

  • 在我看来,Raycast 在我的情况下会更好,但我让它与对撞机一起工作。感谢您的想法:)
  • @LongCat 我修复了 raycast 以按您的预期工作。当我最初发布 sn-p 时,并不是全部都在那里。 Ermiq 让我直截了当。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2017-10-11
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多