【问题标题】:3d Unity C# enemy walks through walls3d Unity C# 敌人穿过墙壁
【发布时间】:2017-01-18 00:24:37
【问题描述】:

你好互联网的巫师,

我正在制作一个 3D 第一人称角色扮演游戏,您可以在其中攻击位于地图周围的敌人。我当前的脚本运行良好,但是有一个问题:只要敌人专注于玩家,他们就会穿过墙壁。

我已经尝试了一些方法来解决这个问题,但不幸的是没有结果。有谁知道这个问题的解决方案吗?

提前致谢。

地精攻击.cs:

using UnityEngine;
using System.Collections;

public class goblinAttack : MonoBehaviour {

    public Transform player;
    static Animator anim;

    // Use this for initialization
    void Start () 
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update () 
    {
        Vector3 direction = player.position - this.transform.position;
        float angle = Vector3.Angle(direction,this.transform.forward);
        if(Vector3.Distance(player.position, this.transform.position) < 10 && angle < 30)
        {

            direction.y = 0;

            this.transform.rotation = Quaternion.Slerp(this.transform.rotation,
                                        Quaternion.LookRotation(direction), 0.1f);

            anim.SetBool("isIdle",false);
            if(direction.magnitude > 5)
            {
                this.transform.Translate(0,0,0.10f);
                anim.SetBool("isRunning",true);
                anim.SetBool("isAttacking",false);
                anim.SetBool("isCrying",true);
            }
            else
            {
                anim.SetBool("isAttacking",true);
                anim.SetBool("isRunning",false);
                anim.SetBool("isCrying",false);
            }

        }
        else 
        {
            anim.SetBool("isIdle", true);
            anim.SetBool("isRunning", false);
            anim.SetBool("isAttacking", false);
            anim.SetBool("isCrying",false);

        }

    }
}

NPC 设置:

【问题讨论】:

  • 您的墙壁对象上是否有网格碰撞器?
  • 你需要进行一些寻路来找到通往玩家的合法路径。否则,地精会尝试直接冲向玩家,这意味着要么被拦住,要么跑过途中可能很容易绕过的障碍物。
  • 是的,我愿意。但它仍然穿过墙壁。

标签: c# unity3d artificial-intelligence move clip


【解决方案1】:

标有 IsKinematic is not affected by Forces, collisions or joints. 的刚体 请记住,将 Transform.Translate() 与刚体一起使用也可能会导致错误 - 考虑 Rigidbody.MovePosition(),它旨在用于物理。不过总的来说,我建议你使用pathfinding 来确保敌人一开始就不会试图穿过墙壁。

【讨论】:

  • 与 IsKinematic 无关。这是一个 Transform.Translate 问题。应该使用 MovePosition 或 AddForce。
  • 我明白了。不过,我究竟需要更改为 MovePosition 什么?所有转换?
  • 你需要用GetComponent获取刚体,然后用yourRigidBody.MovePosition(transform.position + transform.forward * Time.deltaTime);替换this.transform.Translate(0,0,0.10f);
  • 嗯,显然它仍然穿过墙壁,但速度较慢。那会是墙吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多