【问题标题】:Enemy follow player when player is not looking. OnBecameInvisible not working当玩家不看时,敌人跟随玩家。 OnBecameInvisible 不起作用
【发布时间】:2021-04-12 01:44:05
【问题描述】:

所以我想在我的游戏中为我的敌人创造一个哭泣的天使效果。因此,当玩家可以看到敌人时,他们不会移动,而当玩家看不到敌人时,他们会向玩家靠近。这是我附在敌人身上的代码,它不起作用。非常感谢您的帮助!

using System.Collections.Generic;
using UnityEngine;
public class WeepingAngel : MonoBehaviour
{ 
     public GameObject Player;
// Start is called before the first frame update
void Start()
{
    Player = GameObject.FindGameObjectWithTag("Player");
}
 void OnBecameInvisible()
{
    if (Player)
    {
        transform.position = Player.transform.position - Player.transform.forward;
        Vector3 lookPos = Player.transform.position - transform.position;
        lookPos.y = 0;
        transform.rotation = Quaternion.LookRotation(lookPos);
    }    
}
}

【问题讨论】:

  • not working 到底是什么意思?你有debugged 并检查过Player 是否被分配了吗?是否调用了OnBecameInvisible?当您期望调用该消息时,您的场景设置和情况到底是什么?请注意,这意味着该对象根本对场景的渲染没有任何贡献......任何阴影仍然可见,那么仍然不会调用此消息!
  • 好吧,当玩家没有看敌人并且它没有那样做时,敌人应该跟随玩家
  • 嗯,我从你的描述中得到了这个......但现在请阅读并回答评论的其余部分^^
  • 我不明白你的意思,我只是有一个敌人在建筑物里闲置,我想让他们跟着玩家

标签: c# unity3d


【解决方案1】:

我会假设 OnBecameInvisible 在您认为应该调用的情况下不会被调用。可能发生这种情况的原因是它会对任何相机做出反应。这甚至包括场景视图。

替代解决方案

您可以使用此 wiki 文章中提供的方法,而不是 OnBecameInvisiblehttp://wiki.unity3d.com/index.php?title=IsVisibleFrom

修改后的代码

using UnityEngine;

public class WeepingAngel : MonoBehaviour
{
    public GameObject player;
    private new Camera camera;
    private new Renderer renderer;

    private void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        camera = Camera.main;
        renderer = GetComponent<Renderer>();
    }

    private void Update()
    {
        bool isVisible = GeometryUtility.TestPlanesAABB(
            GeometryUtility.CalculateFrustumPlanes(camera),
            renderer.bounds);

        if (!isVisible)
            TryMovingTowardsPlayer();
    }

    private void TryMovingTowardsPlayer()
    {
        if (player == null)
            return;

        transform.position = player.transform.position - player.transform.forward;
        Vector3 lookPos = player.transform.position - transform.position;
        lookPos.y = 0;
        transform.rotation = Quaternion.LookRotation(lookPos);
    }
}

【讨论】:

  • 我应该将哪个渲染器附加到游戏对象?
  • @user12719872 取决于您的用例。如果你有一个 2D 游戏,那么 SpriteRenderer 将是你需要的,我会假设。它继承了Renderer 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多