Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在游戏对象周围移动_C#_Unity3d - Fatal编程技术网

C# 在游戏对象周围移动

C# 在游戏对象周围移动,c#,unity3d,C#,Unity3d,我正在尝试用刚体来创建MOB AI。我想让暴徒(游戏对象)使用 mobrigid.AddForce((((goal - transform.position).normalized)*speed * Time.deltaTime)); (目标是一群暴徒周围的一个随机位置) 这就是它变得复杂的地方,一些暴徒以极快的速度在空中飞行,而另一些暴徒则以慢速正常移动。(是的,我确实确定了目标。Y是地面上的一个地方,而不是空中的)。我试着通过改变阻力来修复它,但这会导致暴徒在空中行走,而不会在重力作用下坠

我正在尝试用刚体来创建MOB AI。我想让暴徒(游戏对象)使用

mobrigid.AddForce((((goal - transform.position).normalized)*speed * Time.deltaTime));
(目标是一群暴徒周围的一个随机位置)

这就是它变得复杂的地方,一些暴徒以极快的速度在空中飞行,而另一些暴徒则以慢速正常移动。(是的,我确实确定了目标。Y是地面上的一个地方,而不是空中的)。我试着通过改变阻力来修复它,但这会导致暴徒在空中行走,而不会在重力作用下坠落

我真的迷路了,想不出如何简单地用刚体移动游戏对象,而不产生这种奇怪的行为

暴徒日志(目标的Y更改为0):

编辑:
暴徒形象:

我的动作逻辑:

   case MOBTYPE.EARTHMOB:
            switch (currentstatus)
            {
                case MOBSTATUS.STANDING:

                        if (mobrigid.IsSleeping())
                        {
                            mobrigid.WakeUp();
                        }   



                        goal = this.transform.position;
                            goal.x = Random.Range(goal.x - 150, goal.x + 150);
                            goal.z = Random.Range(goal.z -150, goal.z + 150);
                    goal.y = 0;

                                    currentstatus = MOBSTATUS.WALKING;

                 //   Debug.Log("Transform:"+this.transform.position+ "Goal:" + goal+ "goal-transform:" + (goal - transform.position));

                    break;
                case MOBSTATUS.WALKING:
                    if (Random.Range(1, 100) == 5)
                    {
                        currentstatus = MOBSTATUS.STANDING;
                    }
                    if (mobrigid.IsSleeping())
                    {
                        mobrigid.WakeUp();
                    }
                    mobrigid.AddForce((((goal - transform.position).normalized) * 10000 * Time.deltaTime));
                    // transform.LookAt(goal);
                    var distance = Vector3.Distance(goal, gameObject.transform.position);
                    if (distance <=5)
                    {

                        currentstatus = MOBSTATUS.STANDING;

                    }

                    break;
            }
            break;
case MOBTYPE.EARTHMOB:
开关(当前状态)
{
案例编号:status.STANDING:
if(mobrigid.IsSleeping())
{
mob.WakeUp();
}   
目标=此.transform.position;
goal.x=随机范围(goal.x-150,goal.x+150);
goal.z=Random.Range(goal.z-150,goal.z+150);
目标y=0;
currentstatus=MOBSTATUS.WALKING;
//Log(“Transform:+this.Transform.position+”目标:“+Goal+”目标转换:”+(Goal-Transform.position));
打破
case.MOBSTATUS.WALKING:
if(随机范围(1100)==5)
{
currentstatus=MOBSTATUS.STANDING;
}
if(mobrigid.IsSleeping())
{
mob.WakeUp();
}
mobrigid.AddForce(((目标-变换.位置).normalized)*10000*Time.deltaTime));
//转换。注视(目标);
var distance=Vector3.距离(目标、游戏对象、变换、位置);

如果(距离使用
刚体.AddForce
功能沿一个方向向对象添加力。由于您有一个位置需要将
刚体
移动到,您必须使用
刚体.MovePosition
功能。您可能还需要将刚体标记为运动学

将刚体对象移动到特定位置的简单协同路线函数:

IEnumerator MoveRigidbody(Rigidbody rb, Vector3 destination, float speed = 50f)
{
    const float destThreshold = 0.4f;

    while (true)
    {
        Vector3 direction = (destination - rb.position).normalized;
        rb.MovePosition(rb.position + direction * speed * Time.deltaTime);

        float dist = Vector3.Distance(rb.position, destination);

        //Exit function if we are very close to the destination
        if (dist <= destThreshold)
            yield break;

        yield return null;
        //yield return new WaitForFixedUpdate();
    }
}
要启动
开始移动
功能:

void Start()
{
    StartCoroutine(StartMoveMent());
}


虽然我上面所说的应该有效,但我确实建议您使用Unity的内置寻路系统。这是一个教程。它简化了寻找通往目的地的路径,目的地也可以是目的地。

目标是一个随机位置
您是否使用随机函数来获得位置?尝试用硬编码值(如“0”)固定z坐标只生成随机的x和y,比如向量(x,y,0),记录差分向量
目标-变换。定位
,不要尝试
修复
任何东西,否则你会失去跟踪。试着找到根本原因。@neverholds为什么x和y?我不应该得到x和z吗?我得到的目标是这样的:目标=移动位置,然后x=随机(mob.x-15,mob.x+10);与z相同。我将记录goal-transform.position并更新,Y是给定位置在地形上的最大高度。你是对的,它应该是x和z。当你说
goal=mob position
时,你以后会修正它类似于goal=vector(random(mob.x-15,mob.x+10),0,random(mob.z-15,mob.z+10).根据我的理解,这里的Y坐标应该是零,而不是
mob.Y
,否则在
目标变换过程中,你也会体验到Y轴的差异。位置
。请尝试一下。如果你的力增加到地板上,如果你的刚体与地板重叠的力过大,你的刚体可能会被抛到空中。请确保添加的力与地板平行。@尽管如此,我编辑了日志,不知道Greg,谢谢,那么我应该怎么做才能避免这种情况?谢谢你的回答!在我实现它之前,因为我的代码非常不同,在更新函数中使用不同的开关而不是IEnumrators。我想问一下是否会有性能差异ces如果我按照你在更新中说的做而不是IENumerator?不是真的。IENumerator给了你按顺序执行代码的优势。如果你愿意,你仍然可以在更新函数中这样做
void Start()
{
    StartCoroutine(StartMoveMent());
}