关于Unity游戏开发中对于向量重要度的一些感悟

        大家好啊,这里是学习了两年python却找不到目标,于是开始学习游戏的铜钱。

        在我通过网络学习unity的途中,无数人向我提及了掌握向量的重要性,当然在我遇见向量上真正的困难时,我才知道这句忠告的重要性。

        昨天,了解了untiy基础操作的我,开始跟随B站up主的goodorc_gamedev的视频开始了人生中第一个项目——一款类马里奥的2D横板闯关游戏。

        我一直跟随大佬做到敌人判断物体和峡谷从而实现来回移动而不落下峡谷的功能,敌人脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyWalk : MonoBehaviour
{
    public float speed = 3;

    Rigidbody2D rigid;
    // Start is called before the first frame update
    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        Vector3 front = new Vector3(-1, 0, 0);
        if (transform.localScale.x < 0)
        {
            front = new Vector3(1, 0, 0);
        }

        Vector3 beg = transform.position + new Vector3(0, -0.1f, 0);
        Vector3 down = new Vector3(0, -1, 0);



        //发送横向的射线,接触到图层为Default的物体时,改变方向。

        Debug.DrawLine(beg, beg + front * 1f, Color.red);
        if (Physics2D.Raycast(beg, front, 1f, LayerMask.GetMask("Default")))
        {
            transform.localScale = new Vector3(transform.localScale.x * -1, transform.localScale.y, transform.localScale.z);
        }



        //发送斜向下的射线,离开图层为Default的物体时,改变方向。
        Debug.DrawLine(beg, beg + (front+down).normalized * 1.5f, Color.red);
        if (!Physics2D.Raycast(beg,front + down , 1.5f, LayerMask.GetMask("Default")))
        {
            transform.localScale = new Vector3(transform.localScale.x * -1, transform.localScale.y, transform.localScale.z);
        }

        rigid.velocity = new Vector2(front.x * speed, rigid.velocity.y);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

我理所当然的在同一个平台放置了两名敌人,为了让他们互相碰撞而改变方向,我为敌人在代码中添加上了敌人的图层Enemy。

        结果确实两名敌人疯狂在屏幕上抽搐:

 

        略加思索后,我发现原因是:向量射线是从敌人的中心点向外发出的,在过程中已经接触到了敌人物体,于是就有了这一幕。

        了解到原因后,我开始对向量的发射点做调整:

        

        我的预想是,将射线的发射点放在敌人的鼻子上,在接触到物体和敌人单位时,敌人回头。于是我改短了射线长度,开始运行。这次在敌人接触物体时,又一次出现了抽搐的情况。

         通过观察我发现,原来是射线的发射点在敌人图像反转时,其本身也是在现有中心点进行翻转,而不是想我想得一样依附在敌人的鼻子上。这就导致在敌人接触到物体时,射线翻转也检测到了自己,于是又开始了反复横跳。

        所以我就开始研究起来,如何在图像翻转的同时改变射线的发射点。

        可是对于现在还根本不怎么了解向量的我来说,这又是何其的不易。

        这里就不给大家卖关子了,直接上修改后的代码,至于修改过程中的辛苦,我想大家一定时在初学编程的时候都体会过的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyWalk : MonoBehaviour
{
    public float speed = 3;

    Rigidbody2D rigid;
    // Start is called before the first frame update
    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        Vector3 front = new Vector3(-1, 0, 0);
        if (transform.localScale.x < 0)
        {
            front = new Vector3(1, 0, 0);
        }
        //在这里:
        Vector3 beg = transform.position + front + new Vector3(0, -0.1f, 0);
        //就是上面这一段
        Vector3 down = new Vector3(0, -1, 0);

        Debug.DrawLine(beg, beg + front * .1f, Color.red);
        if (Physics2D.Raycast(beg, front, .1f, LayerMask.GetMask("Default","Enemy")))
        {
            transform.localScale = new Vector3(transform.localScale.x * -1, transform.localScale.y, transform.localScale.z);
        }
        Debug.DrawLine(beg, beg + (front+down).normalized * 1.5f, Color.red);
        if (!Physics2D.Raycast(beg,front + down , 1.5f, LayerMask.GetMask("Default")))
        {
            transform.localScale = new Vector3(transform.localScale.x * -1, transform.localScale.y, transform.localScale.z);
        }

        rigid.velocity = new Vector2(front.x * speed, rigid.velocity.y);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

        其实方法也很简单,就是在beg变量中加上一个front向量。

        由于图像的翻转回会影响到front的值,我们只需要在射线原点的基础上,再加上一个动态的1或-1,就可以做到在翻转的同时实现射线原点的重定位。

        相信大家也看出来了,这其实是一个很简单,很基础的问题,但是却因为我对向量的不熟悉,最终使得再解题过程中将问题复杂化了。再加上我对C#代码的不熟悉,只掌握到了可以完成一点点小型项目的水准,就更是对我解题过程的雪上加霜了。

        于是我这个unity新人想在这里提醒和我一样,刚刚开始学习unity和想要学习unity的同学们——向量在游戏开发中真的非常非常重要,请一定要好好掌握。不要像我一样,因为对其的不了解,而在一个很简单的问题上花费了大量的时间。

        另外,如果有看到着的大佬,请问在初学游戏开发时有没有什么好书推荐呀,萌新求带~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值