草庐IT

从零开始入门创作游戏——游戏对象的脚本编辑

默哀d 2025-06-21 原文

做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程

环境搭建在这里

从零开始入门创作游戏——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展示

有关从零开始入门创作游戏——游戏对象的脚本编辑的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格: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

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  7. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  10. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务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

随机推荐