

- 3.将其中一张拖动到视图中,并且重命名为Boar
- 4.设置Boar图层,为Boar添加Rigibody2D组件, 并设置


- 6.添加Layer层, 然后在Boar对象中选择碰撞剔除, 使其碰不到Player和其他Enemy


- 7.给boar添加触发器
记得勾选isTrigger,用于计算伤害, 并排除掉其他Enemy

- 8.创建文件夹Asssets/Script/General, 表示通用的类, 将原来的PhysicsCheck.cs移动到这个目录,然后
- 8.1 在这个目录下创建Character.cs, 并挂载到Player和Boar上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Character : MonoBehaviour
{
[Header("基础属性")]
public float maxHealth;
public float currentHealth;
[Header("受伤无敌")]
public float invulnerableDuration;
private float invulnerableCounter;
public bool invulnerable;
private void Start()
{
currentHealth = maxHealth;
}
private void Update()
{
if (invulnerable)
{
invulnerableCounter -= Time.deltaTime;
if (invulnerableCounter <= 0)
{
invulnerable = false;
}
}
}
public void TakeDamage(Attack attacker)
{
if (invulnerable)
return;
if (currentHealth >= attacker.damage)
{
currentHealth -= attacker.damage;
TriggerInvulnerable();
} else
{
currentHealth = 0;
Debug.Log("触发死亡");
}
}
private void TriggerInvulnerable()
{
if (! invulnerable)
{
invulnerable = true;
invulnerableCounter = invulnerableDuration;
}
}
}
- 8.2 在这个目录下创建Attack.cs, 并挂载到Player和Boar上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attack : MonoBehaviour
{
public int damage;
public float attackRange;
public float attackRate;
private void OnTriggerStay2D(Collider2D other)
{
other.GetComponent<Character>()?.TakeDamage(this);
}
}
- 8.3 修改PlayerController.cs, 添加血量等信息
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
public PlayerInputControl inputControl;
private Rigidbody2D rb;
public Vector2 inputDirection;
public PhysicsCheck physicsCheck;
[Header("基本功能")]
public float speed;
public float jumpForce;
private void Awake()
{
inputControl = new PlayerInputControl();
rb = GetComponent<Rigidbody2D>();
inputControl.Gameplay.Jump.started += Jump;
physicsCheck = GetComponent<PhysicsCheck>();
}
private void OnEnable()
{
inputControl.Enable();
}
private void OnDisable()
{
inputControl.Disable();
}
private void Update()
{
inputDirection = inputControl.Gameplay.Move.ReadValue<Vector2>();
}
private void FixedUpdate()
{
Move();
}
public void Move()
{
rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);
int faceDir = (int)transform.localScale.x;
if (inputDirection.x > 0)
faceDir = 1;
if (inputDirection.x < 0)
faceDir = -1;
transform.localScale = new Vector3(faceDir, 1, 1);
}
private void Jump(InputAction.CallbackContext context)
{
if (physicsCheck.isGround)
{
rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
}
}
}