首先将玩家,加血道具,掉血道具添加进场景中
为玩家挂接碰撞体和刚体

而两种道具只需要挂接碰撞体
下面是玩家的挂接脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
//设置玩家无敌时间间隔
public float timelnvincible = 2.0f;
//设置是否无敌变量
bool islnvincible;
//定义变量,进行无敌时间的计时,无敌时间计时器
float invincibleTimer;
//设置最大生命值(生命上限)
public int maxHealth = 5;
//设置当前生命值的属性health
//C#中支持面向对象程序设计中的封装概念,对数据成员的保护
//数据成员变量,默认一般都应该设为私有,只能通过当前类的方法或属性进行访问
//属性是公有的,可以通过取值器get、赋值器set设定对应字段的访问规则,满足规则才能够访问
int currentHealth;
public int health
{
get { return currentHealth; }
//set {currentHealth=value;}
}
//为了防止角色发生抖动(若要防止角色发生旋转,需要将角色中的Rigidbody 2D组件中的Constraints中的Z轴锁定)
//声明刚体对象
Rigidbody2D rigidbody2D;
//获取用户输入
float horizontal;
float vertical;
//该方法以单位每秒来表示移动速度
//将速度暴露出来,使其可调
public float speed = 3.0f;
private void Start()
{
//获取当前游戏对象的刚体组件
rigidbody2D = GetComponent<Rigidbody2D>();
//游戏开始前,玩家满血
//初始化当前生命值
currentHealth = maxHealth;
}
//每帧调用一次Update
void Update()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
//判断是否处于无敌状态,来进行计时器倒计时
if(islnvincible){
//如果无敌,进入倒计时
//每次update减去一帧所消耗的时间
invincibleTimer -= Time.deltaTime;
if (invincibleTimer<0)
{
islnvincible = false;
}
}
}
//为了使物理计算保持稳定(只要牵扯物理引擎相关方法,都需要放到FixedUpdate函数中)
//固定时间间隔执行的方法(不论硬件条件如何)
private void FixedUpdate()
{
Vector2 position = rigidbody2D.position;
position.x = position.x + speed * horizontal * Time.deltaTime;//Time.deltaTime表示帧所需要的时间
//因为每台机器的帧数刷新不同,所以需要乘上各台电脑的每帧刷新的时长,这样就能确保各台电脑每次按下按键后的移动距离都相同
position.y = position.y + speed * vertical * Time.deltaTime;
rigidbody2D.MovePosition(position);
}
//更改生命值的方法
public void ChangeHealth(int amount)
{
//假设玩家受伤害的时间间隔是2秒
if (amount<0)//当玩家扣血时
{
//判断玩家当前是否处于无敌状态
if (islnvincible)
{
return;//当玩家处于无敌状态时,return后面的所有函数内的语句都不执行,不掉血也不输出信息
}
islnvincible = true;
invincibleTimer = timelnvincible;
}
//限制方法,限制当前生命值的赋值范围:0-最大生命值
currentHealth = Mathf.Clamp(currentHealth+amount,0,maxHealth);//Mathf是一个静态类中的静态方法,不需要创建对象即可直接调用,Mathf是一个通用的数学函数
//在控制台输出生命信息
Debug.Log("当前生命值:"+currentHealth+"/"+maxHealth);
}
// Start is called before the first frame update
//void Start()
//{
// //只有将垂直同步设置成0,才能锁帧,否则锁帧的代码无效(但实际操作上设置为1同样也可锁帧)
// //垂直同步的作用就是显著减少游戏画面撕裂、跳帧,因为画面的渲染不是整个画面一同渲染的,而是逐行逐列渲染的
// QualitySettings.vSyncCount = 0;
// //设置应用程序帧数为10
// Application.targetFrameRate = 10;
//}
// Update is called once per frame
//void Update()
//{
// //获取水平输入,按向左,会获得-0.1f;按向右会获得1.0f
// float horizontal = Input.GetAxis("Horizontal");
// //获取垂直输入,按向下,会获得-0.1f;按向上会获得1.0f
// float vertical = Input.GetAxis("Vertical");
// //创建一个Vector2对象positon,用来获取当前对象的位置
// //Vector2是一个系统类,是C#中自带的一个类(Unity中的类),Vector2 position来描述2D的位置
// Vector2 position = transform.position;
// //更改position的x坐标值,让其加上0.1
// position.x = position.x + 0.1f*horizontal;
// position.y= position.y+ 0.1f*vertical;
// //更新当前对象的位置到新的位置
// transform.position = position;
//}
}
在加血道具和减血物体中,由于碰撞需要,需要将碰撞体组件中的Is Trigger勾上,这样玩家不仅可以通过碰撞体触发事件,还能够不被道具影响行进路线

下面是加血道具挂接脚本
为了让加血道具只能够使用一次,当玩家并不满血,拾到加血道具时,加血道具会消失(被销毁)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HealthCollectible : MonoBehaviour
{
//草莓加的血量
public int amount = 1;
//用来记录碰撞次数
//int collideCount=0;
//添加触发器碰撞事件,每次发生碰撞时,执行器中的代码
private void OnTriggerEnter2D(Collider2D other)
{
//collideCount = collideCount + 1;
//Debug.Log($"和当前物体发生碰撞的对象是:{other},当前是第{collideCount}次碰撞");
//获取Ruby游戏对象的脚本组件对象
RubyController rubyController = other.GetComponent<RubyController>();
if (rubyController!=null)
{
//当获取到脚本组件对象的时候再执行下列代码,防止出现错误
if (rubyController.health<rubyController.maxHealth)
{
//更改生命值
rubyController.ChangeHealth(amount);
//销毁当前游戏对象
//可以让草莓被吃掉
Destroy(gameObject);
}
else
{
Debug.Log("当前玩家满血,不需要加血");
}
}
else
{
// 当未获取到对象时(出错了),则报出提示错误
Debug.LogError("rubyController游戏组件并未获取到......");
}
}
}
减血道具与加血道具类似,将影响血量值改为负数即可
但与加血道具不同的一点是,若不控制每次减血的时间间隔(由于每次刷新都将响应减血),则在一秒内,所有血量都将清空。
所以我们需要设置一个控制器,来解决血量的瞬间减少的问题,该控制器设置在玩家的脚本身上(看上面的玩家脚本,都带有注释),实现的是,玩家走上地刺,每两秒钟间隔会扣一次血,捡到草莓时,草莓消失,玩家加血。

下面是减血道具的挂接脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DamageZone : MonoBehaviour
{
public int damageNum = -1;//减少的血量
private void OnTriggerStay2D(Collider2D other)
{
RubyController rubyController = other.GetComponent<RubyController>();
if (rubyController!=null)//当获取对象不为空时再进行血量控制函数的调用
{
rubyController.ChangeHealth(damageNum);
}
}
}
如有疑问欢迎留言或私信
谢谢!
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question