0
点赞
收藏
分享

微信扫一扫

创建一个可操作的主角

柠檬的那个酸_2333 2022-04-21 阅读 53
unity

创建一个可操作的主角

将人物图片变成unity中的物件

  1. 创建人物

两个方法:

  • 直接将图片拖进Scene
  • 创建一个sprite,再拖到sprite里

*sprite Renderer可以将图形渲染

  1. 添加相关组件

在unity游戏制作中,我们一般希望模拟物体真实的,现实生活中的反应,所以我们会为物体添加以下组件以达到我们的需求

  • Rigidbody2D:为物件本身添加物理刚体,有了Rigidbody2D之后,任何力都会改变物理位置显示,所以用刚体覆盖物体 。
  • 2D碰撞体 :Collider2D (人物的碰撞其实是靠它来判断)
    • istrigger:将其变成一个碰撞判断体
    • metiral:可添加物理性质。例如修改其弹性和摩擦力之类的
    • 为了使人物运动丝滑,就我自己实验,需要为他添加三个碰撞体,分别是光滑的上半身(形状随便)、下半身(用circle碰撞体),和非光滑的脚(一个点)

人物的活动

总体逻辑:

通过获得并修改物体的参数(如其速度或坐标),并对其进行修改来得到移动的效果。

因为是模拟物理效果,所以我们最好是在FixedUpdate函数里面调用移动的函数

从unity上方Edit的projectsetting中的inputmannager可以看见和修改我们需要的Button(游戏中的指定一系列按键)或者Key(键盘按键)的名称

在代码中得到物体组件参数的方法

  • 在代码中可以通过 public 组件对应的变量类型 变量名来在inspector里面的脚本界面中得到可以接收物体组件的框,将组件拖进去就行
  • private 的变量的话,就在Start或者Awake里面得到就行。
    private Rigidbody2D rb;
    ...
     void Start()
        {
            rb = GetComponent<Rigidbody2D>();//然后就在后续代码中修改rb的参数就行
        }
    

2D地面移动

  • 逻辑:

通过左右按键为人物更改朝向

通过朝向*预设好的速度 的方法来为人物提供正确的速度

  • 动画逻辑:

设置一个浮点判定变量为人物的速度,当速度大于一个微小值(这样比较合理),判定人物移动,移动动画开始播放

public float speed;//这里是自己可以在unity编辑器里面设置的量
private bool facedirection;//默认值是false
...
void FixedUpdate()
    {
        GroundMove();//每秒50次左右被执行以判断是否移动
    }
...
void GroundMove()
    {
        float horizontalMove = Input.GetAxisRaw("Horizontal");//Raw返回-1,0,1,用于获得左右方向值
        if (horizontalMove != 0)
        {
            if (horizontalMove == 1)
                facedirection = false;//这里是根据得到的按键方向来判断面朝方向
            else facedirection = true;
	transform.localScale = new Vector3(horizontalMove, 1, 1);//控制人物翻转
        }
        rb.velocity = new Vector2(horizontalMove * speed, rb.velocity.y);
    }
   
anim.SetFloat("running", Mathf.Abs(rb.velocity.x));//取横轴速度的绝对值

跳跃

  • 逻辑:

玩家能不能起跳取决于玩家是否按下跳跃键,以及游戏设计是否允许,于是我们可以先预判定是否可以起跳

若是存在二段跳,我希望二段跳的逻辑是能在空中额外跳一次,像空洞骑士一样,而不是在如从高处掉下的浮空情况下可以跳两次,所以需要一个地面检测点

跳跃函数中,我们代码判定会从接触或不接触地面两种情况来进行,以适配在跳跃活动中的各种情况

  • 动画逻辑:

当人物站在地面上,肯定是不关跳跃什么事的

不在地面时,用竖向速度的正负来进行判定上升与下降

  • 跳跃相关代码如下:
public bool jumpPressed;
public bool isground;
public bool getmagic;//这个是判断角色是否能二段跳,一般是捡到道具将它改为true,方法见下文
public int jumpcount;
public Transform groundCheck;

...
void Update()
    {
        if (Input.GetButtonDown("Jump") && jumpCount > 0)//判断是否按下与跳跃次数是否还有
        {
            jumpPressed = true;
        }
}
void FixedUpdate()
{
	isground = Physics2D.OverlapCircle(groundCheck.position, 0.1f, ground);//在角色脚下做一个定位点,其实也可用角色的transfo.position.y-一个测试值来代替。作用是判断它是否在地面上
	Jump();//既然是物理效果,当然要放在FixedUpdate里面
}
...
Jump()//可支持多段跳跃的函数
{
	if (isground)//判断是否在地面上
        {
            jumpCount = num;//可跳跃次数重置
        }

        if (jumpPressed && isground)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpforce);
            jumpCount--;
            // 这里是提升手感的关键!!!
            /*我们的Jump()函数在FixedUpdate里判定,jumpPressed在Update()里面判定,下面这一句可以确保判定条件的对齐*/
            jumpPressed = false;
        }
        if (!isground && getMagic)
        {

            if (jumpPressed)
            {
                rb.velocity = new Vector2(rb.velocity.x, jumpforce);
                jumpCount -= 2;
                jumpPressed = false;
            }
        }
        else
        {
            jumpPressed = false;
        }
}

if (isground)
        {
            anim.SetBool("falling", false);
            anim.SetBool("jumping", false);
        }
        else if (rb.velocity.y > 0)
        {
            anim.SetBool("jumping", true);
        }
        else if (rb.velocity.y < 0)
        {
            anim.SetBool("jumping", false);
            anim.SetBool("falling", true);
        }

下蹲

  • 逻辑:

先想想,当一个人趴下的时候,他的竖向体积会减小,而我们为了人物移动的顺滑,我们会为人物添加三个碰撞体就排上用场了

上文说,人物有三个碰撞体,分别是光滑的上半身(形状随便)、下半身(用circle碰撞体),和非光滑的脚(一个点)

我们可以定义一个碰撞体组件变量,将头部碰撞体拖进去,在按下下蹲键的时候将他关闭,在放开下蹲键的时候重新启用

同时在人物蹲下钻进洞时,狭小的空间不能让人物站起来,若是这会儿玩家松开了下蹲键,不就… 嗯…

所以我们可以在人物头顶添加一个检测点,用法和地面检测点相同,当检测到头顶有墙,便不会站起

  • 动画逻辑

我们的人物在正常非跳跃非受伤的状态下随时都可以下蹲

判定条件可以设置为bool,按下时true,放开false

  • 下蹲代码如下:
 public Transform CeilingCheck;
...
void FixedUpdate()
    {
        GroundMove();//每秒50次左右被执行以判断是否移动
    }
...
 void GroundMove()
        Crouch();
    }
...
void Crouch()
    {
  
        if (!Physics2D.OverlapCircle(CeilingCheck.position, 0.2f, ground))
        {
  

            if (Input.GetButton("crouch"))
            {
  
  
                anim.SetBool("crouch", true);
                Discoll.enabled = false;
  
            }
            else
            {
                Discoll.enabled = true;
            }
        }
    }
举报

相关推荐

0 条评论