【Unity3D】点击交互——简单工厂

摘要:
实施一个简单的点击游戏来学习交互式相关内容,并使用简单的工厂来创建、管理、回收和重用标签,而无需实时创建和销毁标签。1.单击对象,将出现一个事件。将楼板的标记设置为“完成”。您可以使用标记查找对象并相应地写入事件。VoidUpdate(){Vector3mp=InputmousePosition;cm=Camera.main;Rayray=cm.ScreenPointToRay;RaycastHitit;if{//如果单击标记为Tag的对象,则{Vector 3finishposition=hit.point+newVector3;GameObjectcyliner_1=GameObject.CreatePrimitive;cyliner_1.GetComponent<Collider>().enabled=false;cylinder_1.transform.position=hit.point+newVector3;}}现在可以单击以创建圆柱形标记,但它不会消失。用户只需申请使用GameObjectmyFactory即可。placeAttackMarkmyFactory作为工厂类,其中placeAttackMark函数是一个特定的实现。

实现一个很简单的点击小游戏,学习交互相关的内容,在不实时创建销毁的情况下,使用简单工厂创建、管理、回收、复用标记。

游戏概述:点击出现标记,两秒内自动消失

游戏展示:

【Unity3D】点击交互——简单工厂第1张

【Unity3D】点击交互——简单工厂第2张


1.1实现点击效果。
  1.1.1用 Plane 或其他物体做地面, tag 为“Finish”
    先创建Plane,并选择tag为Finish。

【Unity3D】点击交互——简单工厂第3张

  1.1.2点击地面后,出现一个圆形攻击标记,两秒后自动消失。注意:该攻击标记不能挡住点击。(Primitive Objects / Cylinder)

    1.点击对象出现事件,之前设置地板的tag为Finish,可以利用tag找到对象,对应编写事件。

if (hit.collider.gameObject.tag.Contains ("Finish"))

    2.圆形攻击标记,按提示创建Cylinder作为攻击标记。

GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);

    3.刚开始不知道不能挡住点击该如何完成,这一点是在整体实现之后才查到相关资料解决的,加上下面一句代码,把圆柱形标记设为不启用,这样就不会妨碍在同一地方继续点击生成或出现圆柱形标记。

cylinder_1.GetComponent<Collider> ().enabled = false; // 不影响再次点击

    4.整理代码,如下。

        void Update() {
            Vector3 mp = Input.mousePosition;
            cm = Camera.main;
            Ray ray = cm.ScreenPointToRay (mp);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) {
                // 如果点击到标签为Tag的对象
                if (hit.collider.gameObject.tag.Contains ("Finish")) {
                    Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f);
                    
                    GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
                    cylinder_1.GetComponent<Collider> ().enabled = false;
                    cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f);
                    
                }
            }
        }

现在可以点击创建圆柱形标记,但是还不会消失。要求需要在两秒内自动消失,考虑增加一个类专门管理消失。(消失不是destroy,如下面所提示的,对象创建之后,放在列表内,不必释放,因为释放再重建耗费太多资源。)做到这一步,需要先使用简单工厂,先放上代码,后续在下一点再讲述。

【Unity3D】点击交互——简单工厂第4张

专门管理延时的类:

【Unity3D】点击交互——简单工厂第5张

  1.1.3请使用一个简单工厂创建、管理这些的标记,并自动收回这些标记(注意,这些对象创建后,放在列表内,不必释放)。
为适应下面红色字体要求,修改类名和相关函数名。
用户仅需申请使用即可 GameObject myFactory.placeAttackMark(Vector3 position)
myFactory为工厂类,其中的placeAttackMark(Vector3 position)函数为具体实现。
建立myFactory.cs,建立placeAttackMark函数和对象列表(public List<GameObject> free = new List<GameObject>();),将之前Update里面的内容放到placeAttackMark中。考虑到需要回收对象(修改位置或者隐藏,让用户无法看到),在创建新的标记时需要判断对象列表里还有没有可用的,有则复用不创建。

 修改之前Update里面的内容,如下所示:重要代码后写有注释。

        public void placeAttackMark(Vector3 target) {
            cm = Camera.main;
            Ray ray = cm.ScreenPointToRay (target);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) {
                // 如果点击到标签为Tag的对象
                GameObject cylinder_1;
                if (hit.collider.gameObject.tag.Contains ("Finish")) {
                    Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f);
                    if (free.Count == 0) { // 如果未使用的圆柱形标记为空,则创建
                        cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
                        cylinder_1.GetComponent<Collider> ().enabled = false; // 不影响再次点击
                        cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f);
                        
                    } else {
                        // 还有标记空闲,复用标记
                        cylinder_1 = free[0];
                        free.RemoveAt(0); // 用了之后移除
                        cylinder_1.transform.position = hit.point + new Vector3(0f,0.8f,0f);
                    }
                    // 两秒后自动消失
                    waitToRecovery wt = cylinder_1.AddComponent<waitToRecovery>();
                    wt.delay2min (cylinder_1, free);
                }
            }

        }

最后,在用户端直接访问 myFactory.placeAttackMark(Vector3 position)即可。
在这里,如之前一样,在myFactory里面实现了GetInstance方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Com.mygame;

public class BaseCode : MonoBehaviour {

    private Camera cm;
    private GameObject temp;
    // Use this for initialization
    void Start () {
        cm = Camera.main;
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            Vector3 mp = Input.mousePosition;
            myFactory.GetInstance ().placeAttackMark (mp);
        }
    }
}

免责声明:文章转载自《【Unity3D】点击交互——简单工厂》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇记录k8s安装es开源微内核seL4下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3D根据游戏的发展Terrain Toolkit地形生产

 今天我们继续给我Unity3D游戏开发系列。今天我们来通过Terrain Toolkit为了使地形。 虽然Unity3D它为我们提供了一个地形渲染工具,我们发现,这个地形绘制工具并不能满足我们的要求,由于通过手动绘制这样的方法来画地形的起伏缺少了自然的侵蚀感,人力雕琢的感觉过于强烈,毕竟通过人去感觉自然界地形的起伏变化是力不从心的。所以我们建议通过...

[Unity3D]Unity3D游戏开发之刀光剑影特效的实现

大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国产标签吧!博主近期在玩一部叫做《雨血》的游戏,博主不禁感慨:在这样一个流星蝴蝶不再闪烁、网游成风、国产双剑兴许创新不足的后国产时代,竟然还能够有这样一部再次...

[vuforia][unity3d]资源链接

http://bbs.csdn.net/topics/390787189 CSDN论坛中 “Qualcomm Vuforia(AR虚拟现实)开发” 主题资源下载http://bbs.csdn.net/forums/qualcomm CSDN论坛http://bbs.9ria.com/thread-417491-1-1.html unity获取对象...

使用Unity3D生成网格并加贴图

        在使用Unity3D进行开发时,我们通常需要生成自己的网格来进行控制,比如进行图像变形等等。本文将介绍如何在Unity3D中生成一个网格。         首先,需要在空间中生成顶点,然后在定义三角面片顶点序号。生成网格的代码如下: using UnityEngine; using System.Collections; public...

unity3D 重新加载场景时重置时间从0开始

void Update() { //.ToString()以两位数显示累加的时间//此方法可在重新加载场景时,重新计算时间 LastTime.text = Time.timeSinceLevelLoad.ToString("00"); }...

Unity3D写雷电游戏(二)

通过上一篇那些资料的学习,现在假定你能比较熟练的操作unity3D了。 本人也是Unity3D的初学者,这边记录一下我的游戏制作经过,希望对别人有所帮助吧,欢迎大家一起讨论。 一、搭建游戏的框架。 一般的游戏都可以分为四个场景: 1.开始界面 2.游戏场景 3.暂停界面 4.结束界面 开始界面,就是存放开始菜单的地方了,游戏场景就是游戏的主场景,游戏的主要...