【Unity游戏设计】跳一跳Day1

一、创建场景

  • Assets/Secnes:Game
  • Assets创建游戏资源Prefabs存放预制体,Scripts脚本,Sounds声音,Textures图片资源,Materiais材质
  • 资源分类存放意识

二、场景建模

注意:alt+鼠标左键切换视角

  1. 视角与摄像机视角保持一致:Main Camera+GameObject+Align View to Selected
  2. 创建球:0,1.85,0
  3. 创建圆柱:0,0,0,
  4. 合并为一个物体Player=圆柱+球:0,2,0;缩放比:0.2,0.2,0.2
  5. 创建立方体:0,0,0

三、角色掉落效果

  • Add Component+physics+rigid body
  • 设计视角=游戏视角 Main Camera+GameObject+Align With View
    注意:需要退出以后进行视角锁定
    请添加图片描述

四、颜色(材质)

  • Materiais中创建Materia+选择颜色+拖动到物体上色

五、创建脚本

  • Scripts中创建Player,拖拽到角色(左侧Inspector-Player)身上
  • 双击Player打开VS2022

请添加图片描述

1.角色跳跃起来

  • 固定角度-Constraints:X,Z打勾
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private Rigidbody m_Rigidbody;
    // 最大力-public-易于调试
    public float fMaxForce = 500.0f;
    // 当前力量
    private float m_CurForce = 0.0f;

    // Start is called before the first frame update
    void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {}
        else if (Input.GetMouseButton(0)) // 按下鼠标左键开始蓄力
        {
            // 一秒的时间内力量增加100*
            m_CurForce += Time.deltaTime * 100;
            // 最大力量限制
            if (m_CurForce > fMaxForce)
            {
                m_CurForce = fMaxForce;
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {
            // 调用Jump函数
            Jump();
            // 跳起后清零
            m_CurForce = 0.0f;
        }
    }

    // 跳跃
    private void Jump()
    {
        // 施加向上的力
        m_Rigidbody.AddForce(Vector3.up * m_CurForce);
        // 施加向前的力
        m_Rigidbody.AddForce(Vector3.forward * m_CurForce);
    }
}

2.蓄力表现

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

public class Player : MonoBehaviour
{
    private Rigidbody m_Rigidbody;
    // 最大力-public-易于调试
    public float fMaxForce = 500.0f;
    // 当前力量
    private float m_CurForce = 0.0f;

    // Start is called before the first frame update
    void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) { }
        else if (Input.GetMouseButton(0)) // 按下鼠标左键开始蓄力
        {
            // 一秒的时间内力量增加100*
            m_CurForce += Time.deltaTime * 100;
            // 最大力量限制
            if (m_CurForce > fMaxForce)
            {
                m_CurForce = fMaxForce;
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {
            // 调用Jump函数
            Jump();
            // 跳起后清零
            m_CurForce = 0.0f;
        }
        ShowScale();
    }

    // 跳跃
    private void Jump()
    {
        // 施加向上的力
        m_Rigidbody.AddForce(Vector3.up * m_CurForce);
        // 施加向前的力
        m_Rigidbody.AddForce(Vector3.forward * m_CurForce);
    }

    // 蓄力表现
    private void ShowScale()
    {
        float sc = (fMaxForce - m_CurForce * 0.5f) / fMaxForce; // 比值实现蓄力表现:0-不变;1-缩小  m_CurForce * 0.5f:身高最多缩小到一般
        Vector3 scale = transform.localScale; // 获取角色当前缩放值
        scale.y = sc * 0.2f; // 因为角色原有的缩放比为0.2,保证角色的正常状态
        transform.localScale = scale;
    }
}

3.生成Box

(1)步骤一

  1. 将Cube,Player托至Prefabs
  2. Prefabs中的Cube,拖拽至左侧Player(Script)Box栏中

请添加图片描述

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

public class Player : MonoBehaviour
{
    private Rigidbody m_Rigidbody;
    // 最大力-public-易于调试
    public float fMaxForce = 500.0f;
    // 当前力量
    private float m_CurForce = 0.0f;

    // 预制体-产生新的盒子
    public GameObject Box = null;

    // 新盒子的距离范围(距离必须超过盒子大小)
    public float fMaxDistance = 1.2f;
    public float fMinDistance = 3.0f;

    // 新盒子的高矮
    public float fMaxHeight = 0.3f;
    public float fMinHeight = 2.0f;

    // 新盒子的方向
    private Vector3 m_Direction = Vector3.forward; // 默认在前方

    // 实际的距离和高矮
    private float m_Distance = 0.0f;
    private float m_Height = 0.0f;


    // Start is called before the first frame update
    void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody>();
        // 游戏开始:产生新盒子
        GenerateBox();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) { }
        else if (Input.GetMouseButton(0)) // 按下鼠标左键开始蓄力
        {
            // 一秒的时间内力量增加100*
            m_CurForce += Time.deltaTime * 100;
            // 最大力量限制
            if (m_CurForce > fMaxForce)
            {
                m_CurForce = fMaxForce;
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {
            // 调用Jump函数
            Jump();
            // 跳起后清零
            m_CurForce = 0.0f;
        }
        ShowScale();
    }

    // 跳跃
    private void Jump()
    {
        // 施加向上的力
        m_Rigidbody.AddForce(Vector3.up * m_CurForce);
        // 施加向前的力
        m_Rigidbody.AddForce(Vector3.forward * m_CurForce);
    }

    // 蓄力表现
    private void ShowScale()
    {
        float sc = (fMaxForce - m_CurForce * 0.5f) / fMaxForce; // 比值实现蓄力表现:0-不变;1-缩小  m_CurForce * 0.5f:身高最多缩小到一般
        Vector3 scale = transform.localScale; // 获取角色当前缩放值
        scale.y = sc * 0.2f; // 因为角色原有的缩放比为0.2,保证角色的正常状态
        transform.localScale = scale;
    }

    private GameObject GenerateBox()
    {
        // 创建新盒子
        GameObject obj = GameObject.Instantiate(Box);

        // 随机生成参数
        m_Distance = Random.Range(fMinDistance, fMaxDistance);
        m_Height = Random.Range(fMinHeight, fMaxHeight);
        m_Direction = Random.Range(0, 2) == 1 ? Vector3.forward : Vector3.left; // 1:前方 2:左

        // 方向*距离+目前角色位置
        Vector3 pos = m_Direction * m_Distance + transform.position; // 角色悬空导致盒子悬空
        pos.y = 0; // 盒子落地
        // 更新盒子的位置
        obj.transform.position = pos;
        // 更新盒子的高度:对x,z轴不进行改变,只对y轴进行改变
        obj.transform.localScale = new Vector3(1, m_Height, 1);
        // 更新盒子的颜色
        obj.GetComponent<MeshRenderer>().material.color = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f));      return null;
    }
}

(二)步骤二

  • 添加地面:3D Object+Plane;调整地面大小:x=10,z=10
  • 禁用:Mesh Renderer
  • 提升Cube的高度:y=0.5
    请添加图片描述
  • 施加向前或向左的力-取决于生成盒子的方向:m_Rigidbody.AddForce(m_Direction * m_CurForce);
  • 统一盒子高度+掉落效果
    1. 添加刚体组件
      请添加图片描述

    2. Add Component+physics+rigid body

    3. 更改Cube高度:pos.y = 2.0f;

    4. 取消刚体震动:只保留y值
      请添加图片描述

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

public class Player : MonoBehaviour
{
    private Rigidbody m_Rigidbody;
    // 最大力-public-易于调试
    public float fMaxForce = 500.0f;
    // 当前力量
    private float m_CurForce = 0.0f;

    // 预制体-产生新的盒子
    public GameObject Box = null;

    // 新盒子的距离范围(距离必须超过盒子大小)
    public float fMaxDistance = 1.2f;
    public float fMinDistance = 3.0f;

    // 新盒子的高矮
    public float fMaxHeight = 0.3f;
    public float fMinHeight = 2.0f;

    // 新盒子的方向
    private Vector3 m_Direction = Vector3.forward; // 默认在前方

    // 实际的距离和高矮
    private float m_Distance = 0.0f;
    private float m_Height = 0.0f;


    // Start is called before the first frame update
    void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody>();
        // 游戏开始:产生新盒子
        GenerateBox();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) { }
        else if (Input.GetMouseButton(0)) // 按下鼠标左键开始蓄力
        {
            // 一秒的时间内力量增加100*
            m_CurForce += Time.deltaTime * 100;
            // 最大力量限制
            if (m_CurForce > fMaxForce)
            {
                m_CurForce = fMaxForce;
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {
            // 调用Jump函数
            Jump();
            // 跳起后清零
            m_CurForce = 0.0f;
        }
        ShowScale();
    }

    // 跳跃
    private void Jump()
    {
        // 施加向上的力
        m_Rigidbody.AddForce(Vector3.up * m_CurForce);
        // 施加向前的力
        m_Rigidbody.AddForce(m_Direction * m_CurForce);
    }

    // 蓄力表现
    private void ShowScale()
    {
        float sc = (fMaxForce - m_CurForce * 0.5f) / fMaxForce; // 比值实现蓄力表现:0-不变;1-缩小  m_CurForce * 0.5f:身高最多缩小到一般
        Vector3 scale = transform.localScale; // 获取角色当前缩放值
        scale.y = sc * 0.2f; // 因为角色原有的缩放比为0.2,保证角色的正常状态
        transform.localScale = scale;
    }

    private GameObject GenerateBox()
    {
        // 创建新盒子
        GameObject obj = GameObject.Instantiate(Box);

        // 随机生成参数
        m_Distance = Random.Range(fMinDistance, fMaxDistance);
        m_Height = Random.Range(fMinHeight, fMaxHeight);
        m_Direction = Random.Range(0, 2) == 1 ? Vector3.forward : Vector3.left; // 1:前方 2:左

        // 方向*距离+目前角色位置
        Vector3 pos = m_Direction * m_Distance + transform.position; // 角色悬空导致盒子悬空
        pos.y = 2.0f; // 盒子落地
        // 更新盒子的位置
        obj.transform.position = pos;
        // 更新盒子的高度:对x,z轴不进行改变,只对y轴进行改变
        obj.transform.localScale = new Vector3(1, m_Height, 1);
        // 更新盒子的颜色
        obj.GetComponent<MeshRenderer>().material.color = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f)); return null;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/375658.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消…

Asp .Net Core 集成 NLog

简介 NLog是一个基于.NET平台编写的日志记录类库&#xff0c;它可以在应用程序中添加跟踪调试代码&#xff0c;以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点&#xff0c;支持在任何一种.NET语言中输出带有上下文的调试诊断信息…

相机图像质量研究(3)图像质量测试介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

用python编写爬虫,爬取房产信息

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88816284使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件&#xff0c;再run all就行 注意事项 可能遇到的bug 暂无&#xff0c;有的话私信我

Kafka 生产调优

Kafka生产调优 文章目录 Kafka生产调优一、Kafka 硬件配置选择场景说明服务器台数选择磁盘选择内存选择CPU选择 二、Kafka Broker调优Broker 核心参数配置服役新节点/退役旧节点增加副本因子调整分区副本存储 三、Kafka 生产者调优生产者如何提高吞吐量数据可靠性数据去重数据乱…

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下&#xff0c;智慧城市作为未来城市发展的先锋方向&#xff0c;正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志&#xff0c;更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…

Bootstrap5 导航组件和面包屑

Bootstrap5 导航组件和面包屑 Bootstrap5 提供了一种简单快捷的方法来创建基本导航&#xff0c;它提供了非常灵活和优雅的选项卡和Pills等组件。 Bootstrap5 的所有导航组件&#xff0c;包括选项卡和Pills&#xff0c;都通过基本的 .nav 类共享相同的基本标记和样式。 使用 B…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块

047_http模块_获取请求行和请求头 hello&#xff0c;大家好&#xff0c;那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法&#xff0c;我在这个文档当中都已经记录好了&#xff0c;方便大家后续做一个快速的查阅。 …

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…

洛谷_P1464 Function_python写法

目录 1.错误解法 2.学习记忆化搜索算法 2.1简介 2.2案例学习 3.解法 4.总结 1.错误解法 a 0 b 0 c 0 def w(a,b,c):if a<0 or b<0 or c<0:return 1elif a>20 or b>20 or c>20:return w(20,20,20)elif a<b and b<c:return w(a-1,b,c) w(a-1,…

Python程序员面试题精选及解析(2)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点无论是对…

小白代码审计入门

最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是着恰恰应了一句老话:万事开头难。但是小白我会坚持下去。何况现在已经喜欢上了代码审计,下面呢小白就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。…

【数据分享】1929-2023年全球站点的逐月平均降水量(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

基于spring cloud alibaba的微服务平台架构规划

平台基础能力规划&#xff08;继续完善更新…&#xff09; 一、统一网关服务&#xff08;独立服务&#xff09; 二、统一登录鉴权系统管理&#xff08;独立服务&#xff09; 1.统一登录 2.统一鉴权 3.身份管理 用户管理 角色管理 业务系统和菜单管理 部门管理 岗位管理 字典管…

【代码随想录24】93.复原 IP 地址 78.子集 90.子集II

目录 93.复原IP地址题目描述参考代码 78.子集题目描述参考代码 90.子集II题目描述参考代码 93.复原IP地址 题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

VitePress-11-静态资源引入- public目录的使用

作用简述 public目录就是一个存放静态资源的目录。 项目中可以通过【绝对路径】的方式进行引入。 具体的格式请继续阅读本文剩下的内容。 知识补充-源目录(比较重要) 源目录 的概念 &#xff1a; 是markdown源文件所在的位置。 默认情况下&#xff0c;源目录与项目的根目录保持…

警惕“中等数字化陷阱”,大力发扬先进基础设施“长板”

上世纪七、八十年代&#xff0c;拉美国家发展由富转穷&#xff0c;人均GDP发展至3000美金左右就开始停滞不前。研究界将这一现象归结为一个极具争议的概念——“中等收入陷阱”。 如今&#xff0c;在我国数字化发展当中&#xff0c;也有一种“中等数字化陷阱”正露出苗头&…

读千脑智能笔记06_人工智能的未来(上)

1. 人工智能正在经历一场复兴&#xff0c;这是科技界最热门的领域之一 1.1. 大多数科学进步都建立在被广泛接受的理论框架之上。这种理论框架称为“科学范式” 1.2. 人工智能的未来将与大多数人工智能从业者如今的设想存在本质上的不同 1.3. 人工神经网络与人类大脑中的神经…

Swift Combine 从入门到精通一

1. Combine 简介 用 Apple 官方的话来说&#xff0c;Combine 是: a declarative Swift API for processing values over time. Combine 是 Apple 用来实现函数响应式编程的库&#xff0c; 类似于 RxSwift。 RxSwift 是 ReactiveX 对 Swift 语言的实现。 Combine 使用了许多可以…