java设计飞镖游戏_3分钟手把手带你使用Unity制作“扔飞镖游戏”

原标题:3分钟手把手带你使用Unity制作“扔飞镖游戏”

日落西山红霞飞~战士打靶把营归呀巴扎嘿。今天我制作一个简单的打靶游戏(扔飞镖)

在制作之前首先要思考这个游戏需要什么对象,很简单,一只飞镖、一个靶。

这里我把飞镖设置成了刚体,什么是刚体?简而言之,就是给这个物体加上了物理引擎,有了刚体,这个对象可以发生正常的碰撞,可以有质量、有阻力、有重力。这些属性自然我们可以通过时时改变游戏对象的Position和Rotation来模拟。但是这样子的话我们要时刻计算这个对象每个点对应的状态,计算开销十分之大。然而刚体就帮我们完成了所有的一切。

值得注意的是,刚体中通过改变位置来改变状态和通过施加力来改变位置这两种方法不能共存,刚体中Is Kinematic属性可以勾选是否为运动学,在运动学状态下,对象不再受力的作用,反之亦然。

刚体往往要配合碰撞器来使用,基础的碰撞器有盒碰撞器、球碰撞器等等,他们有自己的中心位置、大小等属性。比如一个球碰撞器:

8f5910571cd544f84c96af34b1576b58.png

绿线范围就是这个碰撞器的感应边缘

碰撞器可以理解为一个看不见的防御网,一旦有物体进入这个网,都会根据物理引擎模拟出被撞飞的效果(当然谁撞飞既取决于质量,也取决于是否为静态碰撞器,详情请查询具体的碰撞器和刚体的知识)

下面说一下我设计的思路

靶我是通过五个球体通过修改Z值变成圆饼做成的

对象树和做出来的效果如图

f7826a03398c9706e37894c77f8cc779.png

靶是一个空对象。这里对靶不设置为刚体,因为我把它作为了静态碰撞器。由于射中不同的环分数不一样,因此每个子对象都添加了一个碰撞器,这样子就能根据飞镖到底是撞到了哪个子对象从而可以计算相应的分数。

理想很丰满,现实很骨感,想用网格碰撞器,但是面太多不能用,用球碰撞器又不能把检测范围做成圆饼

c7cda90e91ecec67d5d11362c50e5a82.png

这种范围就像结界一样,飞镖无论多快都无法穿过,隔空就被撞飞了。

那该怎么办呢?后来我有了新思路,就保持这种球体碰撞器,不同的是把它们都设为触发器,飞镖每穿过一个触发器就把这个触发器发送给靶,然后当飞镖头部刚好和靶重合的时候,把飞镖的刚体设为运动学,这样一来可以使得飞镖无法受到里的作用而产生飞镖卡在了靶上的效果,同时靶对象保存的最后一个触发器就是飞镖扎中的那个圆环。

那么思路明确了我们就可以开始做了。首先要有靶和飞镖吧,靶在上面已经做好了,那么展示一下我的飞镖(感觉像一个导弹)

ad1c816b44e74a86d3a71a74257e2fa1.png

代码也很简单,搞了三个类

1.Arrow类

这个就是飞镖的类

具体有如下几个功能:

在未射出时跟随鼠标改变位置

当扔出后给它施加力

便于重新开始,设置了Init函数用于初始化,IsFly判断是否被扔出,time记录飞行时间,为了模拟真实仍飞镖的情景,0.5秒内我给了飞镖一个向上的力,之后飞镖就只有重力和向前的力

代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Arrow : MonoBehaviour {

private int IsFly;

private float time;

private void Start()

{

Init();

}

public void Init()

{

IsFly = 0;

transform.position = new Vector3(0, 0, -7);

gameObject.GetComponent().isKinematic = false;

gameObject.GetComponent().useGravity = false;

}

// Update is called once per frame

void Update () {

if (IsFly == 0)

{

Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position); // 目的获取z,在Start方法

Vector3 mousePos = Input.mousePosition;

mousePos.z = screenPos.z; // 这个很关键

Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);

this.transform.position = worldPos;

if (Input.GetButtonDown("Fire1"))

{

IsFly = 1;

time = 0;

}

} else

{

time += Time.deltaTime;

}

}

private void FixedUpdate()

{

if (IsFly == 1)

{

Rigidbody rigid = this.gameObject.GetComponent();

if (rigid)

{

if (time < 0.5)

{

rigid.AddForce(new Vector3(0, 5, 10));

}

else

{

rigid.AddForce(new Vector3(0, 0, 15));

rigid.useGravity = true;

}

}

}

}

}

2.Target类

这个挂载在靶这个父对象身上,Catch判断飞镖是否被触发器捕捉到(没被捕捉到表示没有扎在靶上),Score记录得分,trigger记录最后一个被触发的触发器,arrow则是飞镖对象。

由于飞镖移动较快,检测可能没那么迅速,所以用了连续检测。由于我把靶放在了(0,0,0)位置上,所以只要当飞镖的位置的Z>0.05(飞镖头进入了靶)就可以把飞镖设为运动学。

代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Target : MonoBehaviour {

public int Catch;

public int Score;

private static Trigger trigger;

public static Arrow arrow;

// Use this for initialization

private void Start()

{

print("hh");

Init();

}

public void Init()

{

if (arrow == null)

arrow = Instantiate(Resources.Load("Prefabs/飞镖"));

Catch = 0;

Score = -1;

trigger = null;

arrow.Init();

}

public void Catched()

{

Catch = 1;

}

public static void SetTrigger(Trigger tri)

{

trigger = tri;

}

private void OnGUI()

{

if (Score != -1)

{

GUI.Label(new Rect(400, 80, 100, 30), "Your Score is " + Score);

GUI.Label(new Rect(400, 100, 150, 30), "push blank to rebegin");

}

}

// Update is called once per frame

void Update () {

if (Input.GetAxis("Jump") > 0)

Init();

if (Catch == 1)

{

if (arrow.transform.position.z > 0.05)

{

arrow.GetComponent().isKinematic = true;

arrow.GetComponent().useGravity = false;

print(trigger.gameObject.name);

switch(trigger.gameObject.name)

{

case "圈1":

Score = 5;

break;

case "圈2":

Score = 4;

break;

case "圈3":

Score = 3;

break;

case "圈4":

Score = 2;

break;

case "圈5":

Score = 1;

break;

}

}

return;

}

if (arrow.transform.position.z > 0.5)

Score = 0;

}

}

3.Trigger类

首先我们要把每个碰撞器的 Is Trigger设为true。它关联到靶对象(Target类),当触发器检测到飞镖,就把触发器自身发送给Target

代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Trigger : MonoBehaviour

{

public Target target;

// Use this for initialization

// Update is called once per frame

void OnTriggerEnter(Collider collider)

{

print("name : " + gameObject.name);

target.Catched();

Target.SetTrigger(this);

}

}

好,简陋版就做出来了

26beefdae8fd53950f3e23e490b98b9e.png

拓展部分

可能这样子这个游戏很没有挑战性,那么我们还可以制造风,东西南北风!简单来说就是给飞镖添加别的力—— 一切阻碍它正常移动的力,也可以说,阻力。这个也很简单,就是时时给飞镖添加一个向左、向右、向后的阻力,一切都可以靠自己DIY返回搜狐,查看更多

责任编辑:

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

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

相关文章

Leetcode——1453. 圆形靶内的最大飞镖数量

墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。 投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。 请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。 示例 1&#xff1a; 输入&#xff1a;points [[-2,0],[2,0],[0,2],[0,-…

打印飞镖图形

打印如图下非标 代码如下 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<string.h> int main() {int n 0;while (scanf("%d", &n) 1){//上n行int i 0;for (i 0; i < n; i){int j 0;for (j 0…

【数据结构与算法】之深入解析“圆形靶内的最大飞镖数量”的求解思路与算法示例

一、题目要求 墙壁上挂着一个圆形的飞镖靶,现在请你蒙着眼睛向靶上投掷飞镖。投掷到墙上的飞镖用二维平面上的点坐标数组表示,飞镖靶的半径为 r,请返回能够落在任意半径为 r 的圆形靶内或靶上的最大飞镖数。示例 1:输入:points = [[-2,0],[2,0],[

【题解】飞镖

题目描述 小明喜欢玩飞镖游戏&#xff0c;他会把每次的得分都记录在数组中。今天有个飞镖大奖&#xff0c;得奖的规则是&#xff1a;如果你4次飞镖的得分先后是&#xff08;a&#xff0c;b&#xff0c;c&#xff0c;d&#xff09;&#xff0c;满足abcd。 小明准备把记录里的其他…

OpenCV技巧篇——多目标视觉定位(以飞镖定位为例)

OpenCV技巧篇【1】——多目标视觉定位&#xff08;以飞镖定位为例&#xff09; 1、针对问题 多目标视觉定位是指通过计算机视觉技术对一张图片中的多个目标进行识别和定位的过程。本篇将以对飞镖定位为例&#xff0c;提出一个简单有效的多目标定位技巧&#xff0c;最终实现如…

LeetCode 1453. 圆形靶内的最大飞镖数量(几何题)

1. 题目 墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。 投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。 请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。 示例 1&#xff1a; 输入&#xff1a;points [[-2,0],[2,0…

一个飞镖模型

#飞镖 #一个角 from turtle import* def angle():pu()goto(0,0)pendown()pencolor("black")left(45)fd(50)left(68)fd(91.73)left(157)fd(120)begin_fill()fillcolor("black")right(135)fd(50)right(68)fd(91.73)right(157)fd(120)end_fill()#飞镖复杂化 d…

扔飞镖游戏

日落西山红霞飞~战士打靶把营归呀巴扎嘿。今天我制作一个简单的打靶游戏&#xff08;扔飞镖&#xff09; 在制作之前首先要思考这个游戏需要什么对象&#xff0c;很简单&#xff0c;一只飞镖、一个靶。 这里我把飞镖设置成了刚体&#xff0c;什么是刚体&#xff1f;简而言之&…

2022赛规整理——飞镖

2022赛规整理——飞镖 ​ V1.0 2021.10.23 1、比赛场地 &#xff08;1&#xff09;打击角度及距离 飞镖口——前哨站&#xff1a;左6.5&#xff0c;直线距离15865mm 飞镖口—— 基地 &#xff1a;右7.3&#xff0c;直线距离25233mm &#xff08;2&#xff09;基地示意图 基…

QT之“飞镖盘”自定义控件

QT之“飞镖盘”自定义控件 前言控件预览实现 前言 现在发一个我之前看过有人写了一个抽奖转盘&#xff0c;所以闲来无事写了一个飞镖盘控件&#xff0c;在我看来它其它没有什么实用价值&#xff0c;纯属写来玩玩而已。 控件预览 实现 画背景 void QDartboard::drawBkg(QPai…

在window上配置NASM

NASM是支持x86、x64架构CPU的汇编器(汇编软件)&#xff1b;NASM也支持大量的文件格式&#xff0c;包括Linux&#xff0c;*BSD&#xff0c;a.out&#xff0c;ELF&#xff0c;COFF&#xff0c;Mach−O&#xff0c;Microsoft 16−bit OBJ&#xff0c;Win32以及Win64&#xff0c;同…

pc单机版雷电修改器源码

记得以前第一次接触电脑玩的第一个游戏就是雷电&#xff0c;那时候觉得这游戏真好玩&#xff0c;很过瘾。闲来没事干&#xff0c;所以想重温一下游戏&#xff0c;&#xff08;当时玩的不是这个版本的雷电&#xff09;&#xff0c;那时候是和小伙伴一起玩的&#xff0c;可惜现在…

《愤怒的小鸟》登陆PC 绿色免安装版首发

这群去年风靡手机的小鸟就不用过多的介绍了&#xff0c;一个月前其开发商游戏开发商Rovio表示将会推出PC版。今天为大家带来的就是绿色免安装版的愤怒的小鸟。 游戏的玩法很简单&#xff0c;将弹弓上的小鸟弹出去&#xff0c;砸到绿色的肥猪&#xff0c;将肥猪全部砸到就能过关…

Pygame小游戏之俄罗斯方块凭什么火了30年?(史上最畅销单机游戏)

前言 一款俄罗斯方块火了30年&#xff0c;成为有史以来最畅销的单机游戏。 它为什么有那么的魔力经久不衰? 小编总结了一些原因&#xff1a;上手极其简单&#xff0c;技巧却很多&#xff0c;满足在混乱中创造秩序的渴望…… 工程师阿列克谢说&#xff0c;人们并没有意识到&…

硬盘图标修改器 V1.0 绿色版

软件名称&#xff1a;硬盘图标修改器 V1.0 绿色版软件语言&#xff1a; 简体中文授权方式&#xff1a; 免费软件应用平台&#xff1a; Win7 / Vista / Win2003 / WinXP / Win2008 软件大小&#xff1a; 12.3MB图片预览&#xff1a; 软件简介:是否厌倦了千篇一律的Windows硬盘图…

Java多线程与并发编程

课程地址&#xff1a; https://www.itlaoqi.com/chapter.html?sid98&cid1425 源码文档&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WMvM3j6qhyjIeAT87kIcxg 提取码&#xff1a;5g56 Java多线程与并发编程 1-并发背后的故事什么是并发 2-你必须知道线程的概念程…

“黑客”入门学习之“单机游戏外挂原理与实现”

“黑客”入门学习之“单机游戏外挂原理与实现”&#xff08;文末全套黑客资料教程&#xff09; 昨天给小伙伴们分享了一篇"游戏外挂原理与实现"的文章&#xff0c;小伙伴们很热情&#xff0c;反响很好&#xff0c;好多朋友私信我&#xff0c;或者直接回复我"写…

PMP P-03 Scope Management

范围管理&#xff1a;要做多少事情&#xff0c;内容

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…

代码随想录算法训练营第四十七天|LeetCode 382,115

目录 LeetCode 392.判断子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 115.不同的子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 …