【Unity2D:C#Script】为角色添加受伤效果

一、创建尖刺预制体

1. 在prefabs文件夹新建一个尖刺预制体,并添加到场景面板上

2. 为尖刺预制体添加Box Collider 2D组件,设置碰撞体积,设置属性IsTrigger为true

3. 在Scripts文件夹新建一个Spine脚本,并添加到尖刺预制体上

二、编辑Ruby脚本

        详情见:【Unity2D:C#Script】为角色添加回血效果 

using Cinemachine.Utility;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEditor.Rendering;
using UnityEngine;

public class Ruby : MonoBehaviour {

    public int maxHealthPoint = 100;
    public int healthPoint;
    private int speed = 5;
    // 创建rb2d对象
    private Rigidbody2D rb2d;

    void Start() {
        // 设置游戏的帧率为60帧
        Application.targetFrameRate = 60;
        healthPoint = maxHealthPoint;
        // 用rb2d接收Rigidbody组件
        rb2d = GetComponent<Rigidbody2D>();
    }

    void Update() {
        // 创建float型Horizontal变量和Vertical变量,用来接受键盘输入
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        // 创建一个二维变量position来存储Rigidbody2D组件中的坐标
        Vector2 position = transform.position;

        // 控制Ruby移动
        position.x += horizontal * speed * Time.deltaTime;
        position.y += vertical * speed * Time.deltaTime;

        /*transform.position = position;*/
        rb2d.MovePosition(position);
    }

    public void changeHealthPoint(int value) {
        healthPoint = Mathf.Clamp(healthPoint+value, 0, maxHealthPoint);
        Debug.Log("HP:" + healthPoint + " / " + maxHealthPoint);
    }

}

三、编辑Spine脚本

1. 仿照上一章的内容,Spine脚本代码为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spine : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision) {
        Ruby ruby = collision.GetComponent<Ruby>();
        if(ruby != null) {
            if(ruby.healthPoint < ruby.maxHealthPoint) {
                ruby.changeHealthPoint(-40);
                Destroy(gameObject);
            }
        }
    }
}

2. 因为尖刺不是消耗品,和Ruby发生碰撞后不会消失,因此可以删除Destory()方法。同时无论Ruby是否满血,碰到尖刺都会损失生命值,因此也可以删掉判断Ruby是否满血的if条件语句

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spine : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision) {
        Ruby ruby = collision.GetComponent<Ruby>();
        if(ruby != null) {
            ruby.changeHealthPoint(-40);
        }
    }
}

3. 测试后发现,只有当Ruby进入尖刺时才会损失生命值,而我们想要的效果是只要Ruby在尖刺范围内就持续掉血。此时,需要将OnTriggerEnter2D()方法替换为OnTriggerStay2D()方法。与此同时,还需要将Ruby的Rigidbody 2D组件的SleepMode属性设置为Never Sleep,否则当Ruby不移动时将无法出发碰撞检测

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spine : MonoBehaviour
{
    private void OnTriggerStay2D(Collider2D collision) {
        Ruby ruby = collision.GetComponent<Ruby>();
        if(ruby != null) {
            ruby.changeHealthPoint(-40);
        }
    }
}

 

四、为主角添加无敌时间 

1. 修改后,Ruby虽然可以在尖刺范围内持续掉血,可是Ruby的血量在一瞬间就减到了0,是因为OnTriggerStay2D()方法每帧都执行一次,相当于每秒执行60次。因此我们需要给Ruby脚本添加无敌时间。首先添加三个变量:整型常量InvincibleTime(用const关键字来创建常量),是无敌状态的持续时间;浮点型变量invinibleTimer,作为计算无敌时间冷却的计时器;布尔变量isInvinible,表示现在是否处于无敌状态

using Cinemachine.Utility;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEditor.Rendering;
using UnityEngine;

public class Ruby : MonoBehaviour {

    // Ruby基础属性
    public int maxHealthPoint = 100;
    public int healthPoint;
    private int speed = 5;
    // 无敌时间
    public const int InvincibleTime = 2;
    public double invinibleTimer;
    public bool isInvinible;
    // 创建rb2d对象
    private Rigidbody2D rb2d;

    void Start() {
        // 设置游戏的帧率为60帧
        Application.targetFrameRate = 60;
        healthPoint = maxHealthPoint;
        // 用rb2d接收Rigidbody组件
        rb2d = GetComponent<Rigidbody2D>();
    }

    void Update() {
        // 创建float型Horizontal变量和Vertical变量,用来接受键盘输入
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        // 创建一个二维变量position来存储Rigidbody2D组件中的坐标
        Vector2 position = transform.position;

        // 控制Ruby移动
        position.x += horizontal * speed * Time.deltaTime;
        position.y += vertical * speed * Time.deltaTime;

        rb2d.MovePosition(position);
    }

    public void changeHealthPoint(int value) {
        healthPoint = Mathf.Clamp(healthPoint+value, 0, maxHealthPoint);
        Debug.Log("HP:" + healthPoint + " / " + maxHealthPoint);
    }

}

2. 在Start()方法中初始化变量invinibleTimer和isInvinible;在Update()方法中判断isInvinible是否为true,若为true,invinibleTimer将每秒减少1,当invinibleTimer减到小于0时,说明无敌状态已经结束,设置isInvinible的值为false

using Cinemachine.Utility;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEditor.Rendering;
using UnityEngine;

public class Ruby : MonoBehaviour {

    // Ruby基础属性
    public int maxHealthPoint = 100;
    public int healthPoint;
    private int speed = 5;
    // 无敌时间
    public const int InvincibleTime = 2;
    public double invinibleTimer;
    public bool isInvinible;
    // 创建rb2d对象
    private Rigidbody2D rb2d;

    void Start() {
        // 设置游戏的帧率为60帧
        Application.targetFrameRate = 60;
        // 用rb2d接收Rigidbody组件
        rb2d = GetComponent<Rigidbody2D>();
        // 初始化变量
        healthPoint = maxHealthPoint;
        invinibleTimer = 0;
    }

    void Update() {
        // 创建float型Horizontal变量和Vertical变量,用来接受键盘输入
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        // 创建一个二维变量position来存储Rigidbody2D组件中的坐标
        Vector2 position = transform.position;

        // 控制Ruby移动
        position.x += horizontal * speed * Time.deltaTime;
        position.y += vertical * speed * Time.deltaTime;
        rb2d.MovePosition(position);

        // 无敌时间计时器
        if(isInvinible == true) {
            invinibleTimer -= Time.deltaTime;
            if(invinibleTimer < 0) {
                isInvinible = false;
            }
        }
    }

    public void changeHealthPoint(int value) {
        healthPoint = Mathf.Clamp(healthPoint+value, 0, maxHealthPoint);
        Debug.Log("HP:" + healthPoint + " / " + maxHealthPoint);
    }

}

        注:Time.deltaTime等于每帧的秒数,每秒调用的次数(等于帧数)*  每帧的秒数=1秒,因此invinibleTimer -= Time.deltaTime的含义就是invinibleTimer的值每秒减少1

3. 打开Spine脚本,给减少生命值的语句加一层if条件语句,同时设置invinibleTimer和invinibleTimer的值

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spine : MonoBehaviour
{
    private void OnTriggerStay2D(Collider2D collision) {
        Ruby ruby = collision.GetComponent<Ruby>();
        if(ruby != null) {
            if(ruby.isInvinible == false) {
                ruby.changeHealthPoint(-40);
                ruby.invinibleTimer = 2;
                ruby.isInvinible = true;
            }
        }
    }
}

        进入Unity,可以看到Ruby的无敌效果已经制作完成,本章完。 

  • 33
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity2D中可以通过Animator和SpriteRenderer组件实现图片轮播。 1. 创建动画控制器:在Assets面板中右键点击空白处,选择Create->Animator Controller,命名为ImageSlider。 2. 添加动画状态:在Animation面板中右键点击空白处,选择Create State->Empty,命名为Image1。再次右键点击空白处,选择Create State->Empty,命名为Image2。 3. 配置动画状态:选中Image1状态,在Inspector面板中将它的Motion属性设置为Image1。选中Image2状态,将它的Motion属性设置为Image2。 4. 添加动画参数:在Animator面板中,点击Parameters,添加一个Trigger类型的参数,命名为Next。 5. 添加动画过渡:选中Image1状态,将Next参数拖拽到它的右上角,即可添加一个从Image1到Image2的过渡。再选中Image2状态,将Next参数拖拽到它的左上角,即可添加一个从Image2到Image1的过渡。 6. 添加SpriteRenderer组件:在场景中创建一个空物体,将需要轮播的图片作为子物体添加进去。给每个子物体添加SpriteRenderer组件,并设置对应的Sprite。 7. 添加脚本控制动画:在空物体上添加一个脚本ImageSlider,实现以下逻辑: ``` using UnityEngine; public class ImageSlider : MonoBehaviour { private Animator animator; // 动画控制器 private void Start() { animator = GetComponent<Animator>(); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) // 按下空格键 { animator.SetTrigger("Next"); // 触发Next参数,切换图片 } } } ``` 这样就完成了图片轮播的实现,按下空格键即可切换图片。 ### 回答2: 在Unity2D中,可以通过以下步骤来实现图片轮播: 1. 首先,准备好需要轮播的图片资源。可以将这些图片资源放置在项目的文件夹中,确保图片资源的命名清晰明了。 2. 创建一个空的GameObject作为父物体,用于容纳图片。选择Empty Object,在Hierarchy面板中创建一个空物体,将其命名为ImageContainer或其他合适的名字。 3. 在ImageContainer对象上添加一个RectTransform组件。通过在Inspector面板中点击Add Component按钮,搜索并添加RectTransform组件。 4. 在ImageContainer对象下创建多个子物体,每个子物体代表一个图片。通过在Hierarchy面板中右键点击ImageContainer,选择Create Empty或复制粘贴多个子物体。 5. 在每个子物体上添加一个Image组件。通过在Inspector面板中点击Add Component按钮,搜索并添加Image组件。 6. 将准备好的图片资源分配给每个子物体上的Image组件。可以通过在Inspector面板的Image组件中的Image字段下拖拽图片资源到对应的子物体上。 7. 在ImageContainer对象上添加一个脚本组件,用于实现轮播功能。可以通过在Inspector面板中点击Add Component按钮,选择New Script并命名为SlideshowController或其他合适的名字。然后通过在脚本编辑器中编写代码来实现轮播功能。 8. 在脚本代码中,利用一个计时器来控制图片的显示和切换。通过使用协程、Invoke函数或Update函数来实现定时切换图片的功能。在切换图片时,可以通过获取ImageContainer对象下的子物体,并通过操作其Image组件的sprite字段来切换显示的图片。 9. 可以根据需求,添加一些额外的功能,例如图片的切换效果、自动循环播放等。 通过以上步骤,就可以在Unity2D中实现图片的轮播效果。根据具体需求可以对代码进行适当调整和优化。 ### 回答3: 在Unity2D中,实现图片轮播可以通过以下步骤: 1. 导入图片资源:将要使用的图片资源导入到Unity项目中,可以将图片拖拽到项目视图中的合适文件夹中。 2. 创建画布:在Hierarchy面板中点击右键,选择UI -> Canvas以创建一个新的画布。画布用于显示UI元素。 3. 创建Image对象:在Hierarchy面板中点击右键,选择UI -> Image以创建一个新的Image对象。这将会自动创建一个Image游戏对象和一个CanvasRenderer组件。 4. 设置图片:选择刚刚创建的Image对象,在Inspector面板中找到Image组件的Source Image属性,将其设置为想要显示的第一张图片。 5. 创建脚本:右键点击项目视图中的合适文件夹,选择Create -> C# Script,创建一个新的脚本。给脚本取一个合适的名字,例如"ImageSlider"。 6. 编写脚本:双击打开刚刚创建的脚本,在脚本中编写代码逻辑。可以使用Coroutine来实现图片的切换。 ```csharp using System.Collections; using UnityEngine; using UnityEngine.UI; public class ImageSlider : MonoBehaviour { public Sprite[] images; // 图片数组,存储要显示的图片 public Image image; // Image对象,用于显示图片 public float delayTime; // 图片切换的间隔时间 private int currentIndex; // 当前显示的图片索引 void Start() { StartCoroutine(SlideImages()); } IEnumerator SlideImages() { while (true) { image.sprite = images[currentIndex]; yield return new WaitForSeconds(delayTime); currentIndex = (currentIndex + 1) % images.Length; } } } ``` 7. 添加脚本:将编写好的脚本挂载到Image对象上,将要显示的图片拖拽到ImageSlider组件的Images属性中。 8. 调整Image对象的大小和位置,以确保图片正确显示。 9. 运行游戏,就可以看到图片按照设定的间隔时间进行轮播了。 通过以上步骤,就可以在Unity2D中实现图片轮播效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值