创建一个可操作的主角
将人物图片变成unity中的物件
- 创建人物
两个方法:
- 直接将图片拖进Scene
- 创建一个sprite,再拖到sprite里
*sprite Renderer可以将图形渲染
- 添加相关组件
在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;
}
}
}