【Unity3D开发】射箭小游戏

本文同时发布至我的个人博客,点击进入我的个人博客阅读。本博客供技术交流与经验分享,可自由转载。转载请在评论区或私信简单通知,感谢!

游戏简介

​ 射箭小游戏是一款射击类小游戏,游戏规则十分简单:玩家点击屏幕上的任意位置,弓箭就会向着鼠标所指的方向发射(注意弓箭会受到重力的影响)。玩家射中靶心得5分,每往外一环少一分,该游戏没有输赢设置。

游戏展示

设计思路

​ 这次项目还是使用熟悉的MVC架构。设计类图如下所示:

开发过程

#### (一)构建预设与素材

​ 先准备好游戏对象如箭靶、箭,设置的时候需要注意设置好Rigidbody属性和Collider属性。例如箭靶需要设置为is Kinematic避免它受到物理引擎的影响,而箭则需要设置is Kinematicfalse并为其添加重力作用。至于Collider的设置,对于箭靶和箭头的圆柱体我选择了Mesh Collider,箭身则使用Capsule Collider,碰撞器的选择会影响到物理效果的精度,对后面计分功能也有影响,需要谨慎选择。另外,对于箭头与箭身的结合,我使用了FixedJoint组件,这在后文会详细介绍,在这里只要为箭头与箭身添加该组件即可。

(二)代码复用

​ 在比较熟悉了MVC架构之后,开发速率会极大提升,因为之前使用的许多代码其实是可以复用的。例如ScenceControl类与GameScenceController类,我直接复用了上次打飞碟项目的代码,稍微修改一下类接口就可以立刻使用,开发效率得到很高的提升。对于ScenceControl类,我添加了一个setArrow()函数,如下:

GameObject setArrow()
{
    GameObject arrow = GameObject.Instantiate<GameObject>(arrowPrefab);
    GameObject head = GameObject.Instantiate<GameObject>(headPrefab);
    arrow.GetComponent<Rigidbody>().useGravity = false;
    arrow.GetComponent<FixedJoint>().connectedBody = head.GetComponent<Rigidbody>();
    head.GetComponent<FixedJoint>().connectedBody = arrow.GetComponent<Rigidbody>();
    return arrow;
}

​ 需要注意的是这里使用了FixedJoint组件,下面是该组件的简介:

Fixed Joints restricts an object's movement to be dependent upon another object. This is somewhat similar to Parenting but is implemented through physics rather than Transform hierarchy. The best scenarios for using them are when you have objects that you want to easily break apart from each other, or connect two object's movement without parenting.

固定关节基于另一个物体来限制一个物体的运动。效果类似于父子关系,但是不是通过层级变换,而是通过物理实现的。使用它的最佳情境是当你有一些想要轻易分开的物体,或想让两个没有父子关系的物体一起运动。

​ — Unity圣典

​ 大致就是,Fixed Joints可以帮助我们实现两个物体一同运动的效果,需要注意的是这两个物体必须都是刚体。在创建arrowhead后需要设置connectedBody属性来实现绑定。

(三)通过射线实现射箭

​ 这一部分代码我们同样熟悉了,与打飞碟中射出子弹的实现相似,这里不做赘述。代码如下:

void FixedUpdate () {
    if (Input.GetMouseButtonDown(0))
    {
        nowArrow = setArrow();
        Vector3 mp = Input.mousePosition;
        Ray ray = Camera.main.ScreenPointToRay(mp);
        nowArrow.GetComponent<Rigidbody>().useGravity = true;
        nowArrow.GetComponent<Rigidbody>().AddForce(ray.direction * 30, ForceMode.Impulse);
        nowArrow.AddComponent<ArrowComponent>();
        nowArrow = null;
    }
}

​ 这次的实现我将这部分代码写在FixedUpdate()而不是Update()中,这样可以减少游戏消耗。

(四)碰撞的设置

​ 通过OnTriggerEnter()可以监测触发器状态,当碰撞发射时会自动调用该函数,使用该函数我们可以实现“使箭留在箭靶” “计分”这两个需求。如下:

public class ArrowComponent : MonoBehaviour {
    private void OnTriggerEnter()
    {
      //取消动力学影响
        this.GetComponent<Rigidbody>().isKinematic = true;
    }
}

public class targetComponent : MonoBehaviour {
    private void OnTriggerEnter()
    {
      //调用加分函数
        GameScenceController.getGSController().addScore();
    }
}

​ 最后再添加UI,挂载脚本,游戏就基本完成了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容