滚球游戏笔记

news2024/10/5 20:27:39
1、准备工作

(1) 创建地面:3D Object-Plane,命名为Ground

(2) 创建小球:3D Object-sphere,命名为Player,PositionY= 0.5。添加Rigidbody组件

(3) 创建文件夹:Create-Foder,分别命名为Materials、Scripts、Audio

2、颜色设置

(1) 在Materials文件夹,Create-Material。命名为GroundMaterial,更改颜色(128,181,128)

颜色:透明度A(0~255)       红R(0~255)        绿G(0~255)         蓝B(0~255)

(2) 地面颜色:拖拽GroundMaterial 到Ground

(3) 小球颜色:同样的方法设置

2、使小球运动

(1) 原理:施加一个力(大小、方向、作用点)通过Input.GetAxes() 方法获取Axes中的名称

Edit-Project Setting 

Input.GetAxis("Horizontal")

获取水平轴的输入值。水平轴通常表示左右移动的输入。该函数会返回一个介于-1到1之间的值

即:玩家按下Negative Button,Horizontal 的取值向-1偏移(一般表示向左移)

       玩家持续按住不放,Horizontal 持续为 -1。(方向持续向左)

       当玩家没有输入或处于中立位置时,这个值通常接近 0

(2) 添加 PlayerCtrller.cs 组件

    public float speed = 10f;
    private Rigidbody rb;//声明刚体

    void Start()
    {
        rb =this.GetComponent<Rigidbody>();//获取挂载此脚本物体(小球)的Rigidbody组件,并将之赋值给rb;方便后续设置小球运动
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");//获取水平轴的输入值,并赋值给moveH
        float moveV = Input.GetAxis("Vertical");//垂直方向

        //力的方向
        Vector3 movement = new Vector3(moveH, 0,moveV);

        //movement * speed:  力的方向和大小
        //将力施加到刚体上,使刚体(小球)根据物理规则移动。
        rb.AddForce(movement*speed);
    }
3、创建环境

(1) 3D Object-Cube。命名为Wall。设置颜色、大小、位置

(2) 用同样的方法制作另外三面墙

4、创建旋转的金币

(1) 3D Object-Cube。设置颜色、大小、位置

(2) 旋转的原理

旋转角度的表示方式之一:欧拉角

旋转的顺序是:Z轴—X轴—Y轴

(3) CoinCtrller.cs 组件

    public float speed = 5f;
    void Update()
    {
        this.transform.Rotate(new Vector3(30,45,90)*speed*Time.deltaTime);
    }

(4) 将金币制成预制件

5、接触事件——金币消失

(1) 打开PlayerCtrller.cs

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("coin"))
        {
            other.gameObject.SetActive(false);
        }
    }

(2) 不必要缓存处理:

方法一:给金币添加Rigidbody组件(从静态Collider变为动态Collider)后勾选Is Kinematic或取消勾选Use Gravity

方法二:

        if (other.gameObject.CompareTag("coin"))
        {
            //Destroy(other.gameObject);
        }
6、镜头跟随

(1) 原理:使球与摄像机保持固定的角度和距离

(2) 给Main Camera添加CamraCtrller.cs组件

    public Transform Player;//小球的Transform
    private Vector3 offset;//小球与摄像机位置的偏移(在三轴上的距离)
    void Start()
    {
        offset = Player.position - this.transform.position;
    }
    void LateUpdate()
    {
        this.transform.position = Player.position-offset;
    }

(3) 回到Unity赋值

7、PlayerCtrller.cs调整:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrler : MonoBehaviour
{
    public float speed = 10f;

    private float moveH = 0;
    private float moveV = 0;
    private Rigidbody rb;//声明刚体
    // Start is called before the first frame update
    void Start()
    {
        rb =this.GetComponent<Rigidbody>();//获取挂载此脚本物体(小球)的Rigidbody组件,并将之赋值给rb;方便后续设置小球运动
    }

    // Update is called once per frame
    void Update()
    {
        moveH = Input.GetAxis("Horizontal");//获取水平轴的输入值,并赋值给moveH
        moveV = Input.GetAxis("Vertical");//垂直方向
    }
    private void FixedUpdate()
    {
        //力的方向
        Vector3 movement = new Vector3(moveH, 0, moveV);

        //movement * speed:  力的方向和大小
        //将力施加到刚体上,使刚体(小球)根据物理规则移动。
        rb.AddForce(movement * speed);
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("coin"))
        {
            other.gameObject.SetActive(false);//或者将other物体添加Rigidbody组件以清除缓存
            //Destroy(other.gameObject);
        }
    }

}

注意

若在Update中使用movement,需乘以Time.deltaTime以确保相同的速度在不同帧率下保持一致。而在FixedUpdate中使用movement时,不需要

8、UI交互——Score

(1) UI-Text,命名ScoreText。宽高:240*64;Alt+左上角锚点。文本改为Score,改变字号、颜色

(2) 打开PlayerCtrller.cs

using UnityEngine.UI;
    
private int score = 0;
public Text scoreText;

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("coin"))
        {
            //……
            score++;
            scoreText.text ="Score:" + score.ToString();
        }
    }

(3) 赋值

9、UI交互——Win

(1) UI-Text,命名WinText。Reset。宽高:240*128;。文本改为Win,改变字号、颜色,居中

(2) 打开PlayerCtrller.cs

    public Text winText;
    void Start()
    {
        ……
        winText.gameObject.SetActive(false);
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("coin"))
        {
            ……
            if (score == 4)
            {
                winText.gameObject.SetActive(true);//显示文本物体
            }
        }
    }
10、UI交互——按钮_01(出现和隐藏)

(1) UI-Button (Legacy),命名为RestartBtn。调整位置(-200,-100)和文本内容Restart

(2) UI-Button (Legacy),命名为QuitBtn。调整位置(200,-100)和文本内容Quit

(3) 打开PlayerCtrller.cs

    public Button restartBtn;
    public Button QuitBtn;
    void Start()
    {
        ……
        restartBtn.gameObject.SetActive(false);//隐藏按钮物体
        QuitBtn.gameObject.SetActive(false);//隐藏按钮物体
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("coin"))
        {
            ……
            if (score == 4)
            {
                ……
                restartBtn.gameObject.SetActive(true);
                QuitBtn.gameObject.SetActive(true) ;
            }
        }
    }

(4) 赋值

10、UI交互——按钮_02(按钮事件)

(1) 在Canvas下,Create Empty。命名为BtnCtrller

(2) 给空物体BtnCtrller添加BtnCtrller.cs

using UnityEngine.SceneManagement;

public class BtnCtrller : MonoBehaviour
{
    public void OnRestart()
    {
        SceneManager.LoadScene("SampleScene");
    }
    public void OnQuit()
    {
        Application.Quit();//退出
    }
}

(2) 设置按钮的On Click

11、添加音效

(1) 将背景音乐 bgAudio 拖放到Hierarchy面板

(2) 选中 bgAudio,勾选开始运行就播放、循环播放。调节音量(volume)

(3) 将吃金币音效拖放到Hierarchy面板的Player上

(4) 选中 Player,取消勾选开始运行就播放、循环播放。调节音量(volume)

(5) 打开PlayerCtrller.cs

    public AudioSource triggerAudio;
        if (other.gameObject.CompareTag("coin"))
        {
            ……
            triggerAudio.Play();
            score++;
            ……
            }

(6) 赋值

(7) 同样的方法添加Win音乐

(8) 游戏结束,音乐停止

    public AudioSource bgAudio;
            if (score == 4)
            {
                ……
                bgAudio.Stop();
            }
               
12、安卓版打包——添加手柄

(1) 下载并导入  资源包 

(2) 打开Prefabs 文件夹,将 Fixed Joystick 拖放到Hierarchy面板上,调整大小和位置

(3) 打开PlayerCtrller.cs,调整脚本

    public FixedJoystick fixedJoystick;
    void Start()
    {
        ……
        fixedJoystick = GameObject.FindObjectOfType<FixedJoystick>();
    }
    private void FixedUpdate()
    {   
        ……
        //力的方向
        //Vector3 movement = new Vector3(moveH, 0, moveV);

        Vector3 movement = Vector3.forward* fixedJoystick.Vertical + Vector3.right * fixedJoystick.Horizontal;
        ……
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么选择住宅代理?IPXProxy住宅代理的优势

​在数字化时代&#xff0c;隐私和数据安全成为了每个互联网用户的关注焦点。住宅代理作为一种有效保护隐私的工具&#xff0c;因其独特的优势备受推崇。本文将从用户的角度&#xff0c;探讨选择住宅代理的诸多优势。 什么是住宅代理&#xff1f; 简单来说&#xff0c;住宅代理…

有哪些零售O2O应用模式?如何构建O2O闭环生态系统?

在零售业的演变历程中&#xff0c;O2O模式的兴起标志着一个新时代的开始。这种模式以其创新性&#xff0c;将线上的便捷与线下的实体体验完美融合&#xff0c;为消费者带来了前所未有的购物便利和体验丰富性。随着技术的不断进步和消费者需求的日益多样化&#xff0c;O2O模式已…

图神经网络入门(1)-networkx

简介 NetworkX是一个Python语言的图论建模工具&#xff0c;用于创建、操作复杂网络结构&#xff08;如图、有向图等&#xff09;。它提供了许多用于分析网络、生成随机网络、以及可视化网络的函数和工具。用户可以利用NetworkX来研究复杂网络的拓扑结构、节点间的关系以及路径查…

TikTok账号养号的流程分享

对于很多刚开始运营TikTok的新手小白来说&#xff0c;都会有一个同样的疑问&#xff0c;那就是&#xff1a;TikTok到底需不需要养号&#xff1f;这里明确告诉大家是需要养号的&#xff0c;今天就把我自己实操过的养号经验和策略总结出来&#xff0c;分享给大家。 一、什么是Ti…

新面貌、新功能、新内容!禅道官网改版升级,全面提升用户体验

为了给用户更好的体验&#xff0c;禅道团队于23年6月与艾体验团队达成合作&#xff0c;正式启动了禅道官网改版的项目&#xff0c;历经一年的努力&#xff0c;2024年6月7日&#xff0c;禅道新官网顺利完成改版升级&#xff0c;正式上线与大家见面啦&#xff01; 此次改版上线的…

超简洁的待办事项自托管便签todo

什么是todo todo 是一个自托管的 todo web 应用程序&#xff0c;可让您以简单且最少的方式跟踪您的 todo。 搭建 使用Docker命令行方式进行搭建 docker run -d -p 8000:8000 -v todo_db:/usr/local/go/src/todo/todo.db prologic/todo Docker-compose.yml version: 3 ​ se…

Nvidia Isaac Sim 入门教程 2024(2)安装与配置

Isaac Sim 安装与环境配置 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The a…

RT-Thread PIN设备

RT-Thread PIN设备 RT-Thread PIN设备驱动框架RT-Thread PIN设备驱动层次图RT-Thread PIN设备注册RT-Thread PIN设备注册函数 RT-Thread PIN设备操作函数pin_getpin_modepin_writepin_readpin_attach_irqpin_detach_irqpin_irq_enable PIN设备又叫GPIO设备&#xff0c;是MCU输入…

每日一练:攻防世界:qr-easy

本题思路与CTFSHOW: 36D杯 misc ez-qrcode思路相同 工具链接&#xff1a;补全二维码QRazyBox - QR Code Analysis and Recovery Toolkit (h3110w0r1d.com) 1.首先&#xff0c;我们需要基于上图的干净图像。 此二维码的大小为 29x29&#xff0c;版本V的大小为N N&#xff0c;…

基于STM32和人工智能的智能四轴飞行器系统

目录 引言环境准备智能四轴飞行器系统基础代码实现&#xff1a;实现智能四轴飞行器系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能飞行器管理与优化问题解决方案与优化收尾与总结 1. 引言 随着无人机技术的发展&…

Mybatis认识与学习

前言 在客户端工具中&#xff0c;编写增删改查的SQL语句&#xff0c;发给MySQL数据库管理系统&#xff0c;由数据库管理系统执行SQL语句并返回执行结果。 增删改操作&#xff1a;返回受影响行数 查询操作&#xff1a;返回结果集(查询的结果) 我们做为后端程序开发人员&#xff…

操作系统笔记(自用随笔)

如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01;

SpringBoot快速入门-上

Apache Tomcat Apache Tomcat是一个开源的Servlet 或 web容器&#xff0c;它实现了Java Servlet、JavaServer Pages (JSP)、Java Unified Expression Language (JUEL) 和 Java WebSocket 规范。 使用 官网下载 安装:绿色版 , 直接解压 卸载:直接删除目录 改编码: # conf/l…

超大cvs文件导入MySQL

1 XXX.cvs 太大 使用cvs拆分HugeCSVSplitter_jb51工具进行拆分&#xff0c;Line Count 设置为1,000,000 注意&#xff1a;1 拆分后除第一个子cvs文件含有标题外&#xff0c;其他的子文档都不含有标题行&#xff1b; 2 后一个文档的第一行为前一个文档的…

python将数据保存到文件的多种实现方式

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

关于FPGA对 DDR4 (MT40A256M16)的读写控制 3

关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 3 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 3一、引言二、DDR的功能性描述三、SDRAM设备中模式寄存器…

基于IDEA的Maven简单工程创建及结构分析

目录 一、用 mvn 命令创建项目 二、用 IDEA 的方式来创建 Maven 项目。 &#xff08;1&#xff09;首先在 IDEA 下的 Maven 配置要已经确保完成。 &#xff08;2&#xff09;第二步去 new 一个 project &#xff08;创建一个新工程&#xff09; &#xff08;3&#xff09;…

【windows|003】计算机硬件基础及存储单位

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&…

阿里云平台创建设备及连接

使用阿里云平台创建项目&#xff0c;利用MQTT.fx软件配置相关的连接&#xff0c;在软件上完成消息的订阅与推送&#xff0c;与手机APP进行同步数据。了解MQTT相关的协议。 1.注册阿里云平台账号&#xff0c;完成实名注册&#xff01; 618创新加速季_新迁入云享5亿算力补贴-阿里…

005-OSPF基本配置

OSPF基本配置 OSPF (Open Shortest Path First) 是一种链路状态路由协议&#xff0c;它属于内部网关协议&#xff08;IGP&#xff09;类别&#xff0c;用于在自治系统&#xff08;AS&#xff09;内部路由 IP 数据包。OSPF 通过使用 Dijkstra 算法计算最短路径树来确定到达每个…