上期链接:Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客
上期我们聊到了人物的自身属性和受伤时的计算,我们先给人物和野猪挂上属性和攻击属性的代码,然后通过触发器触发受伤的事件。物体(人物也好敌人也行)受伤时通常是在被攻击者的内部进行计算的(这是有好处的,比如使用人物更复杂的血量计算方式,我们在人物内部让它自己自动计算就好了),我们使用关键词this来将Attacker内部的变量的访问权限赋给Character,然后我们又使用了计时器,让被攻击的物体在受到攻击后可以有短暂的无敌时间,计时器的写法你还知道吗?先创建三个变量一个布尔二个浮点,创建新的能赋给人物无敌的函数,然后判断人物如果不如那么人物的无敌状态就是True,然后赋给无敌时间(一个浮点变量我们是在Unity窗口手动赋给的,另一个浮点变量是内部进行使用它,在函数判断人物是否处在无敌时才用公共无敌时间赋给那个私有的浮点变量,这样就在内部激活了人物的无敌时间),我们在update中计算人物无敌的倒计时,到点了就切换人物无敌状态为flase,然后在人物的Character中的TakeDamage函数中,我们判断人物如果不是无敌则进入扣血规则,然后如果人物的当前血量足够扣除一次血量则正常减血(如果人物血量为2敌人攻击为5,那么人物直接判断血量归零),不然人物死亡,而无敌状体的赋给与否全在人物扣血那部分功能中执行,如果人物血量归零那么将无法触发无敌状态。总的来说,上次就是多了两份通用的代码文件,分别是物体的属性和攻击(仅对需要这些的物体有用,如果是场景的死物一般不给属性如血量,也可以给看你设定,攻击应该是不要加上去的,除了陷阱啥的),虽然多了两份代码,我们还是要弄清两份代码之间的访问和运行的逻辑,以及什么时候用它们。这期我们看看角色的 受伤和死亡的逻辑和动画 。代码先下方:
public class PlayerAnimations : MonoBehaviour
{
private Animator anim;//创建好这个组件变量后,如果不知道如何通关代码控制组件,可以去看代码手册
private Rigidbody2D rb;//这个2D不能忽略,不然不报错但是人物跑不起来。
private Player_control playercon;//人物控制
private physicsCheck physicsCheck;
private void Awake()
{
physicsCheck = GetComponent<physicsCheck>();
anim = GetComponent<Animator>();
rb= GetComponent<Rigidbody2D>();
playercon = GetComponent<Player_control>();
}
private void Update()
{
SetAnimatons();//每帧时时检测,判断是否需要切换动画。
}
public void SetAnimatons()//需要做很多动画的切换,我们用这个函数来执行所有的动画切换。
{
anim.SetBool("isGround", physicsCheck.isGround);
anim.SetFloat("velocityX",math.abs(rb.velocity.x));
anim.SetFloat("velocityY",rb.velocity.y);
anim.SetBool("shift", playercon.isShift);
anim.SetBool("isDead", playercon.isDead);
}
public void PlayerHurt()
{
anim.SetTrigger("hurt");
}
}
public class Player_control : MonoBehaviour
{
public PlayerInputControl inputControl;
public Vector2 inputDirection;//public变量表示一个公开的方法,它代表我在Unity窗口中可以查看得到。
private Rigidbody2D rb;
private physicsCheck physicsCheck;//创建物理检测变量
private SpriteRenderer rbSprite;
[Header("基本参数")]
public float speed;
public float walkSpeed;
public float jumpForce;
public float hurtForce;
[Header("按键按下")]
public bool isShift=false;
[Header("状态")]
public bool isHurt;
public bool isDead;
private void Awake()
{
physicsCheck = GetComponent<physicsCheck>();
rb= GetComponent<Rigidbody2D>();
inputControl = new PlayerInputControl();
inputControl.GamePlayer.Jump.started += Jump;//按下空格那一瞬间执行事件Jump
//inputControl.GamePlayer.Walk.performed += Walk;
rbSprite = GetComponent<SpriteRenderer>();
}
private void OnEnable()
{
inputControl.Enable();
}
private void OnDisable()
{
inputControl.Disable();
}
private void Update()
{
inputDirection = inputControl.GamePlayer.Move.ReadValue<Vector2>();
isShift= Keyboard.current.shiftKey.isPressed;//检测按键
}
private void FixedUpdate()//固定频率运行,即0.02秒执行一次。跟物理有关的放在这执行
{
if (!isHurt)
{
if (isShift && physicsCheck.isGround)
Walk();
else
Move();
}
}
public void Move()
{
rb.velocity = new Vector2(inputDirection.x*speed*Time.deltaTime,rb.velocity.y);
//人物翻转
if(inputDirection.x>0)
rbSprite.flipX = false;
if(inputDirection.x<0)
rbSprite.flipX = true;
}
private void Jump(InputAction.CallbackContext obj)
{

1810

被折叠的 条评论
为什么被折叠?



