做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程
环境搭建在这里
从零开始入门创作游戏——Unity3d的环境搭建_默哀d的博客-CSDN博客
素材导入和基本页面介绍在这里
从零开始入门创作游戏——Unity编辑器的使用_默哀d的博客-CSDN博客
接下来是编辑游戏对象的运动和交互逻辑脚本
为了让小恐龙能根据按键进行运动,我们需要编写脚本来进行控制
在资产窗口中右键【新建】——【C#脚本】
注意:这里有几个坑
一、脚本会默认生成一部分的代码,而其中最重要的是第一个类名是与生成的脚本文件名一致的,如果后面改了脚本名字,这里也要记得改一下。
public class DinosaurSctrip : MonoBehaviour
二、如果代码没有自动补全的话,就是没有配置对应的解决方案(大概就是VS用来分析代码构成的东西),参考这个文档来安装
unity 打开vs没有解决方案_Unity使用VS Code编写C#代码没有代码补全怎么解决?_weixin_43514201的博客-CSDN博客_unity用vs写代码不会自动补全
接下来就是正式写代码了,我不会C#所以可能用词不太对,意思意思就好
首先是引用需要用到的类,加在void Start() 之前,其他的代码解释我都写在注释里了。
public class DinosaurScript : MonoBehaviour
{
Rigidbody2D rb;//控制物体下落的组件
public float jumpHeight;//创建公共变量 跳的高度
// Start is called before the first frame update
void Start()//游戏启动时进行的配置
{
rb = GetComponent<Rigidbody2D>();//获取该组件
}
// Update is called once per frame
void Update()//游戏其中每一帧进行的判断
{
if (Input.GetKeyDown(KeyCode.Space))//如果空格键按下一次时
{
rb.velocity = new Vector2(0, jumpHeight);//给这个物体一个新的速度(x轴,y轴)
}
}
}
保存后,回到unity 3d的页面,将脚本拖动到恐龙这个游戏对象中,右侧就会出现脚本配置,同时公共变量 jumpHeight 可以在这里随时修改,方便调整

可以在游戏运行的时候随时调整这两个参数,以获得自己最满意的参数
注意:这里又有一个坑,在游戏试运行的时候,调整完的参数并不会保存,一旦停止就会恢复原本的参数,所以调完自己记一下,停止运行后再修改和保存一次。

当然,这里有个明显的BUG,那就是连续按空格,小恐龙就会不停往上跳,所以需要添加一个参数限制连续跳动,然后在遇到地面后才能再次跳起。
完善后的代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DinosaurScript : MonoBehaviour
{
Rigidbody2D rb;//控制物体下落的组件
public float jumpHeight;//跳的高度
bool isJumping;//判断是否正在跳
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
isJumping = false;//游戏开始时默认参数
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)&& isJumping == false)//只有满足按下空格同时能跳时才能跳起
{
rb.velocity = new Vector2(0, jumpHeight);
isJumping = true;//一旦跳起了就变成不能跳了
}
}
private void OnCollisionEnter2D(Collision2D collision)//Unity中判断任何碰撞的类
{
isJumping = false;//这里不严谨,只要发生任意刚体碰撞就能再次跳动,后面再完善
}
}
然后再去测试游戏,发现小恐龙能只能跳一次了。
为了让场景看起来是小恐龙移动,我们这次使用的是视角不动,而是背景移动。
跟上面一样,先创建脚本,然后是使用unity内置的位置函数和时间函数来对游戏对象的位置进行刷新。
public class Movement : MonoBehaviour
{
public float movementSpeed;//移动速度
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.position = new Vector2(transform.position.x - movementSpeed * Time.deltaTime, transform.position.y);
/*这里个人感觉比较复杂
游戏对象改变后的位置 = 原本的x轴位置 减 移动速度×增量时间,y轴不变,这样的效果就是对象向左水平平移
*/
}
}
写好脚本后,同样可以添加到对应的游戏对象中,如果保持整个游戏背景对象的移动速度是一样的,可以直接将脚本添加在父对象上(红色箭头)。如果想要个别对象移动快一点,可以添加在子对象中(绿色箭头),修改一下不同的速度参数就可以了

但是上面这样移动会一直移动到超出镜头范围,为了让背景对象会自动重置,接下来需要添加两个参数,消失点和再生点
public class Movement : MonoBehaviour
{
public float movementSpeed;//移动速度
public float startPosition;//消失点
public float endPosition;//再生点
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.position = new Vector2(transform.position.x - movementSpeed * Time.deltaTime, transform.position.y);
if (transform.position.x <= endPosition)//如果更新后的x坐标小于等于消失点
{
transform.position = new Vector2(startPosition, transform.position.y);//那么这个对象的x轴坐标就重置为再生点坐标
}
}
}
消失点和再生点的值可以直接将游戏对象移动到镜头外,然后看其x轴坐标来设定,因为游戏分辨率问题,最好还是设置远一点,不然可能会在分辨率大的设备中,对象直接在镜头内消失和再生。

而地面,为了保证其连续性,需要创建2~3个地板对象,当其中一个离开摄像头后,就在摄像头以外的地方再生。
有个小问题:地板交替再生时,中间的缝可能会不停变大然后变得不连贯,这个可以通过覆盖一部分地面来解决这个问题(不知道为啥我还是会出现这个问题)

这样就完成了基本操作和场景运动了,后面再写碰撞交互和UI展示
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser