基本上,我在寻找一个主意。 如何使我的敌人巡逻,但当它到达玩家时-会冲刺并造成伤害,但同时当它到达墙壁且玩家站在墙壁后面时,请勿攻击。 你知道-我不想让他们穿过墙壁。

我已经做了一个简单的Game Object(矩形)来指出它的视线,它可以正常工作,但是我想对其进行一些改进。

为了使它更加怪异……我只想让敌人攻击我,却不让我穿过墙壁

一些代码:

[DamageFromEnemy.cs]

private void FixedUpdate()
{
    isThatPlayer = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, PlayerLayer);

    isThatWall = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, gameObject.GetComponent<EnemyScript>().WallLayer);

    if (isThatWall == true && gameObject.GetComponent<EnemyScript>().movingRight == true)
    {
        PlayerDetector.transform.Translate(new Vector3(changePosX, 0, 0));

        //playerDetectX -= PlayerDetector.transform.position.x; // Lowering size. Not Working

        changePosX = (playerDetectX / 2) * (1 / enemyScaleX) + (enemyScaleX / 2) * (1 / enemyScaleX);

        Debug.Log("pozycja x: " + changePosX);
    }

    if (isThatWall == true && gameObject.GetComponent<EnemyScript>().movingRight == false)
    {
        PlayerDetector.transform.Translate(new Vector3(- changePosX, 0, 0));

        //playerDetectX -= PlayerDetector.transform.position.x; // Lowering size. Not Working

        changePosX = (playerDetectX / 2) * (1 / enemyScaleX) + (enemyScaleX / 2) * (1 / enemyScaleX);

        Debug.Log("pozycja x: " + changePosX);
    }

    DetectPlayer();

    AttackTimer();
}
void OnDrawGizmosSelected()
{
    Gizmos.color = Color.blue;
    Gizmos.DrawWireCube(PlayerDetector.position, new Vector3(playerDetectX, playerDetectY));
}

[EnemyScript.cs]

void Update ()
{
    trap = Physics2D.OverlapCircle(ColideDetector.position, detectorRadius, TrapLayer);
    otherEnemy = Physics2D.OverlapCircle(ColideDetector.position, detectorRadius, EnemyLayer);

    if (health <= 0)
    {
        Destroy(gameObject);
    }

    transform.Translate(Vector2.right * speed * Time.deltaTime );

    RaycastHit2D groundInfo = Physics2D.Raycast(groundDetection.position, Vector2.down, distance);

    RaycastHit2D wallInfoR = Physics2D.Raycast(wallDetection.position, Vector2.right, distance, WallLayer);

    RaycastHit2D wallInfoL = Physics2D.Raycast(wallDetection.position, Vector2.left, -distance, WallLayer);


    if (groundInfo.collider == false || trap == true || otherEnemy == true || wallInfoR == true || wallInfoL == true)
    {
        if(movingRight == true)
        {
            transform.eulerAngles = new Vector3(0, -180, 0);
            movingRight = false; 
        }
        else
        {
            transform.eulerAngles = new Vector3(0, 0, 0);
            movingRight = true;
        }
    }
}

一些Gif反馈

在最后的gif帧中,您可以看到它有时会出错。

    public PlayerControls player;
public LayerMask WallLayer;

player = FindObjectOfType<PlayerControls>();
        RaycastHit2D checkWallsToHero = Physics2D.Raycast(wallToHeroRay.position, player.transform.position, 150,WallLayer);

    if (checkWallsToHero == true)
    {
        playerCheck = false;
    }

    void OnDrawGizmosSelected()
{
    Gizmos.color = Color.blue;
    Gizmos.DrawWireCube(PlayerDetector.position, new Vector3(playerDetectX, playerDetectY));
    Gizmos.DrawLine(wallToHeroRay.position, player.transform.position);
}

[新代码示例-可能是错误的]:

isThatPlayer = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, PlayerLayer);

    isThatWall = Physics2D.OverlapBox(PlayerDetector.position, new Vector2(playerDetectX, playerDetectY), 0, gameObject.GetComponent<EnemyScript>().WallLayer);


    RaycastHit2D checkWallsToHero = Physics2D.Raycast(wallToHeroRay.position, player.transform.position, 0, gameObject.GetComponent<EnemyScript>().WallLayer);

    if (checkWallsToHero.collider != true /*&& isThatPlayer == true*/)
    {
        Debug.Log("Pierwszy state");
        Debug.Log(checkWallsToHero.collider);

        //Debug.Log(isThatPlayer);
        //Debug.Log("Hit: " + checkWallsToHero.collider.gameObject.name);

        playerCheck = false;
        enemyAttackReady = false;
        coolDownTimer = 0;

        enemyAttackCD = 0;
    }
    else if (checkWallsToHero.collider == true && isThatPlayer == true)
    {
        Debug.Log(checkWallsToHero.collider);
        Debug.Log("Drugi state");
        ReadyToAttack(); //charging enemy
        DetectPlayer(); //bool to true when OverlapBox hits player

        AttackTimer(); //cd between enemy attacks
    }

#1楼 票数:1

if (Physics2D.Raycast2D
(wallToHeroRay.position,player.transform.position,out hit,10)
 &&hit.transform.gameObject.tag == "Player") 
     {                       
         RayHit = true;  
     }
else {             
         RayHit = false;
     }

要使用此功能,您必须将您的播放器标记为“玩家”,然后,如果它的光线击中了播放器本身而不是墙,则它只会给您命中

编辑:这是我按照评论中@ Draco18s的想法整理的代码,如果对您有用,请告诉他谢谢您。 我只是认为这很有意义,他应该把它当作答案

  ask by K_Leszczynski translate from so

未解决问题?本站智能推荐:

1回复

Unity3D看不到哈萨克语字母

我是Unity3D的新开发人员。 当我写像ҚӨӘІҢUnity的哈萨克语字母时????? 我需要做什么? 如果我从json获取数据,它将正确显示。
1回复

Teamcity的unity3d-plugin似乎看不到Unity文件夹

问候大家! 我正在尝试开始使用Teamcity Unity3d-runner-plugin。 在服务器上成功安装并在项目中设置构建步骤后,将无法构建项目。 项目无法开始处理警告消息: 警告:没有为此构建配置启用兼容的代理。 请注册一个构建代理或调整构建配置要求。 在“代理要求”
2回复

在统一2d中看不到动画中的“示例”选项卡

我需要为我的播放器制作一个空闲动画,但为了让它顺利工作,我需要更改我的动画样本。 但是我看不到示例选项卡。 动画选项卡的屏幕截图有什么解决办法吗?
1回复

Unity3D进行单元测试时,测试类看不到被测类。

这个问题已经在这里有了答案: 如何在Unity中设置单元测试并修复缺少的程序集引用错误? 2个答案 我试图以后用C#编写需要在Unity3D内部运行的脚本的单元测试。 我的C#脚本位于Unity项目的“资产/脚本”文件夹中。 我在Mac OS X版本10.14.4下将U
1回复

Unity-我在屏幕上看不到鼠标

我在Unity中制作了一个简单的3D游戏,大部分情况下一切正常,但是当我的玩家死亡时,在死亡屏幕上看不到鼠标。 我还有另外两个场景,在我看来它们具有完全相同的设置,但是可以看到这些场景上的鼠标。
1回复

构建后,Unity3d在项目文件夹中看不到XML文件

我正在使用XML文件来存储一些数据,因此它更容易本地化到其他语言,因为Unity有resx问题我必须使用XML。 在UnityEditor中,一切都很好,但是当我构建它时,它在第一次使用XML时停止工作。 我猜Unity由于某种原因无法访问XML文件,因为当我尝试手动将XML文件放到My
2回复

尝试在unity3D中使用GooglePlay服务广告功能,我没有任何错误,但是我看不到我的广告

我正在尝试将google-play-services的“ com.google.androind.gms.ads”添加到我的统一项目中,以加载广告,我觉得我已经走得很远了,因为调用Java类不再有任何错误。 但是我现在有点卡住了,因为我没有错误,也没有广告。 这是我统一的c#类中的代码。
1回复

在Unity3D中LWRP看不到后期处理效果

为新的Lightweight渲染管道设置后期处理效果时,我遇到了一个问题。 后处理效果在场景和“游戏”视图中可见,但在运行游戏时无法通过相机看到。 该项目正在为VR使用单遍渲染 我们正在使用LWRP 3.0.0和Post-Processing Package 2.1.2(均为最新