本次Unity的学习将跟随 M_Studio 的“Unity2018教程2D入门“进行学习
2月19日已经观看了该教程的11-14
摆烂了一个月,真该死啊
1.卡墙问题
卡墙问题是角色在墙面上一直向墙里方向按行走,并不会掉下去,反而会卡在墙体上,不符合要求。
卡墙问题可以通过给角色头部的圆形碰撞器上添加一个光滑的物理材质。
创建好之后就可以去修改具体的值,改为0即可
2.解决无限跳问题
无限跳其实很好解决,只需要在Jump()函数里面添加一个额外条件,需要小狐狸在地上才生效跳跃
void jump()//跳跃
{
animator.SetBool("jump", Input.GetButtonDown("Jump"));//设置动画里面的jump
if (Input.GetButtonDown("Jump")&& coll.IsTouchingLayers(ground))//按下空格并且player在地面
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);//改变y轴
}
}
3.添加简单UI
在左上角添加一个表示得分的UI
首先需要先添加一个Canvas,在Canvas下添加两个Text,新版Unity的Text位置发生了变化
两个Text一个写成得分,一个初始写为0,选中text按下f即可找到UI的一个调整,放置到合适位置,如果你放在了左上角,一定要在这里
选为对应左上角,就可以对应固定位置。
接下来就是代码中如何让0按吃到的樱桃和钻石计算分数并展示
可以再定义一个score变量去记录,然后将UI的text传入代码
在之前的收集物销毁代码中进行添加,销毁之后,将之前的0变为score的值
using UnityEngine.UI;
public Text score;//得分的UI
private void OnTriggerEnter2D(Collider2D collision)//收集物的数据增加
{
if(collision.tag == "Collection_Cherry")
{
Destroy(collision.gameObject);
Cherry ++;
Score = Cherry + Gem * 2;//得分
score.text=Score.ToString();
}
if (collision.tag == "Collection_Gem")
{
Destroy(collision.gameObject);
Gem++;
Score = Cherry + Gem * 2;//得分
score.text = Score.ToString();//改变score
}
}
4.添加敌人并增加击杀与受伤效果
添加敌人和敌人的待机动画效果很简单。
击杀
设定是跳到敌人头顶击杀,然后player会反弹的跳起来一下
关键点就是跳和头顶
那么条件就可以是动画效果里面fall为true然后碰撞体相碰
教程中使用了OnCollisionEnter2D也就是2D的碰撞体相撞,
if (collision.gameObject.tag == "Enemies")//tag的设置之前讲过
{
if(animator.GetBool("fall"))//得到fall为true说明player正在下降途中
{
Destroy(collision.gameObject);//消失怪物
animator.SetBool("jump", true);//跳跃动画
rb.velocity = new Vector2(rb.velocity.x, jumpForce);//跳起
}
}
受伤
受伤的效果是走路碰到怪物会反弹回去,并切换动画
首先添加动画hurt并且添加动画内的变量hurt,当hurt为true时,变化动画,为false时变为idle
接下来在代码内实现效果
首先条件还是碰撞体相碰
然后条件时player的x位置与怪物比较,为左时向左边施加力,为右时向右边施加力,同时受伤反弹时并不能让moveMent一直运作,所以加入一个bool在受伤时,设为true暂停movement,在之前的变换动画内再添加恢复
else if (transform.position.x<collision.gameObject.transform.position.x)
{
rb.velocity = new Vector2(-3, rb.velocity.y);
isHurt = true;
animator.SetBool("hurt", true);
}
else
{
rb.velocity = new Vector2(3, rb.velocity.y);
isHurt = true;
animator.SetBool("hurt", true);
}
调用movement的方法修改
void FixedUpdate()//每一秒的
{
if (!isHurt) {
moveMent();
}
switchAnimation();
}
改变动画的方法修改
void switchAnimation()//动画转换
{
if (rb.velocity.y < 0)
{
animator.SetBool("fall", true);
animator.SetBool("jump", false);
}else if (coll.IsTouchingLayers(ground))
{
animator.SetBool("fall", false);
}else if (isHurt)
{
animator.SetBool("hurt", false);
animator.SetFloat("running", 0f);
if (rb.velocity.x < 0.1f)
{
isHurt = false;
}
}
}
经过本次修改之后,全部代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Player : MonoBehaviour
{
private Rigidbody2D rb;//player的刚体
private Animator animator;//player的动画控制器
public float speed;//速度
public float jumpForce;//跳跃的速度
public LayerMask ground;//地板图层
public Collider2D coll;//碰撞体player
public Text score;//得分的UI
public int Cherry = 0;//樱桃数量
public int Gem = 0;//钻石数量
public int Score = 0;//得分
public bool isHurt;//是否受伤的布尔变量
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
// Update is called once per frame
void FixedUpdate()//每一秒的
{
if (!isHurt) {
moveMent();
}
switchAnimation();
}
void Update()
{
jump();
}
void moveMent()//移动
{
float facedircetion = Input.GetAxisRaw("Horizontal");
float horizontalMove = Input.GetAxis("Horizontal");//0是不动,正数向右,负数向左
if (horizontalMove != 0)
{
animator.SetFloat("running", Mathf.Abs(facedircetion));
rb.velocity = new Vector2(horizontalMove * speed* Time.deltaTime, rb.velocity.y);
}
if (facedircetion != 0)
{
transform.localScale = new Vector3(facedircetion, 1, 1);
}
}
void jump()//跳跃
{
animator.SetBool("jump", Input.GetButtonDown("Jump"));//设置动画里面的jump
if (Input.GetButtonDown("Jump")&& coll.IsTouchingLayers(ground))//按下空格并且player在地面
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);//改变y轴
}
}
void switchAnimation()//动画转换
{
if (rb.velocity.y < 0)
{
animator.SetBool("fall", true);
animator.SetBool("jump", false);
}else if (coll.IsTouchingLayers(ground))
{
animator.SetBool("fall", false);
}else if (isHurt)
{
animator.SetBool("hurt", false);
animator.SetFloat("running", 0f);
if (rb.velocity.x < 0.1f)
{
isHurt = false;
}
}
}
private void OnTriggerEnter2D(Collider2D collision)//收集物的数据增加
{
if(collision.tag == "Collection_Cherry")
{
Destroy(collision.gameObject);
Cherry ++;
Score = Cherry + Gem * 2;//得分
score.text=Score.ToString();
}
if (collision.tag == "Collection_Gem")
{
Destroy(collision.gameObject);
Gem++;
Score = Cherry + Gem * 2;//得分
score.text = Score.ToString();//改变score
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Enemies")
{
if(animator.GetBool("fall"))
{
Destroy(collision.gameObject);
animator.SetBool("jump", true);
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}else if (transform.position.x<collision.gameObject.transform.position.x)
{
rb.velocity = new Vector2(-3, rb.velocity.y);
isHurt = true;
animator.SetBool("hurt", true);
}
else
{
rb.velocity = new Vector2(3, rb.velocity.y);
isHurt = true;
animator.SetBool("hurt", true);
}
}
}
}