屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)
游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置
实现方式
Camera.main.WorldToScreenPoint
Camera.main.ScreenToWorldPoint
3D打地鼠实例
我这里用到的素材都比较简陋,几乎全是用Unity做的
首先是锤子

就是两个Cylinder,在把手的位置放一个空物体用于模拟锤子的动作,命名为Hammer,把锤子作为Hammer的子物体,给Hammer添加Animation动画:

在三个关键帧位置设置Hammer的Rotation,分布为(45, 0, 0),(-15, 0, 0),(45, 0, 0)
把锤子头部的Tag改为Hammer,并添加刚体,勾选UseGravity和IsKinematic,用于触发打到地鼠事件
然后是地鼠
这里就用Capsule代替了
然后给Capsule添加Animation动画,并放在一个空物体上,命名为Mouse,更改Tag为Mouse
为Capsule添加脚本
public class MouseController : MonoBehaviour {
/// <summary>
/// Recycles the mouse.
/// </summary>
public void RecycleMouse()
{
// Destroy(transform.parent.gameObject);
//对象池回收.
MousePool.Instance.RecycleMouse(transform.parent.gameObject);
}
//被打到时的触发方法.
void OnTriggerEnter(Collider other)
{
if(other.tag == "Hammer")
{
print("Score");
RecycleMouse();
}
}
}

在四个关键帧位置设置Capsule的Position分别为(0, -1, 0),(0, 0, 0),(0, 0, 0),(0, -1, 0)
将Mouse拖为预设体
锤子的动画状态机:

布置洞口
为了能看到地鼠的出没,我这里用PS简单的做了一张有有透明洞口的png图片:
<=这里有一张看不见的图片。。。
新建一个Material,将Shader该为Transparent/Diffuse,把上面那张图片拖上去
新建9个Cube,把刚才新建的Material赋予它,改变位置和大小,调整摄像机,最终结果如下:

下面是锤子上的代码:
public class HammerController : MonoBehaviour {
Animator anim;
Transform head;
void Start () {
anim = this.GetComponent<Animator>();
head = GameObject.Find("Head").transform;
}
Vector3 newPosition;
Vector3 screenPos;
void Update () {
MouseShow();
HammerMove();
}
//记时器.
float timer = ;
//地鼠的预设体.
public GameObject mousePrefab;
int ranIndexX;
int ranIndexY;
//Mouse出现的方法.
void MouseShow()
{
timer += Time.deltaTime;
//每过1s生产一个地鼠.
if(timer > )
{
timer -= ;
ranIndexX = Random.Range(, );
ranIndexY = Random.Range(, );
//通过对象池生成地鼠.
MousePool.Instance.InstantiateMouse(mousePrefab, new Vector3(ranIndexX * , , ranIndexY * ), Quaternion.identity);
}
}
//锤子的移动和动画控制器.
void HammerMove()
{
if(Input.GetMouseButtonDown())
{
anim.SetTrigger("Attack");
}
//将锤子的坐标转换为其在屏幕上的坐标,并保持y轴位置不变.
screenPos = Camera.main.WorldToScreenPoint(new Vector3(transform.position.x, , transform.position.z));
//鼠标位置.
newPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPos.z);
//将得到的屏幕坐标转换为世界坐标.
transform.position = Camera.main.ScreenToWorldPoint(newPosition);
}
}
最后是对象池的代码:
public class MousePool {
//对象池.
Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();
//单例模式.
private static MousePool instance;
public static MousePool Instance {
get {
if(instance == null)
{
instance = new MousePool();
}
return instance;
}
}
private MousePool(){}
//对象的存储类别.
string tags;
GameObject mouse;
//对象池管理方法.
public GameObject InstantiateMouse(GameObject prefab, Vector3 position, Quaternion rotation)
{
tags = prefab.tag;
//如果对象池中存在该类别并且数码大于0,则从对象池中取出该对象,否则实例化一个该对象.
if(pool.ContainsKey(tags) && pool[tags].Count > )
{
mouse = pool[tags][];
pool[tags].Remove(mouse);
mouse.transform.position = position;
mouse.transform.rotation = rotation;
mouse.SetActive(true);
}else{
if(!pool.ContainsKey(tags))
{
pool.Add(tags, new List<GameObject>());
}
mouse = GameObject.Instantiate(prefab, position, rotation) as GameObject;
}
return mouse;
}
//回收方法.
public void RecycleMouse(GameObject mouse)
{
pool[mouse.tag].Add(mouse);
mouse.SetActive(false);
}
}
好了,游戏基本完成
屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)的更多相关文章
- Java对象池技术的原理及其实现
看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...
- JedisCluster中应用的Apache Commons Pool对象池技术
对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分. apache common pool 官方文档可以参考:https://c ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- 对象池技术和通用实现GenericObjectPool
对象池技术其实蛮常见的,比如线程池.数据库连接池 他们的特点是:对象创建代价较高.比较消耗资源.比较耗时: 比如 mysql数据库连接建立就要先建立 tcp三次握手.发送用户名/密码.进行身份校验.权 ...
- 基于Netty包中的Recycler实现的对象池技术详解
一.业务背景 当项目中涉及到频繁的对象的创建和回收的时候,就会出现频繁GC的情况,这时就出现了池化的技术来实现对象的循环使用从而避免对象的频繁回收,Netty包下的Recycler就实现了这一功能.当 ...
- 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池
第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- common-pool2对象池(连接池)的介绍及使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...
随机推荐
- PAT甲级训练刷题代码记录
刷题链接:https://www.patest.cn/contests/pat-a-practise 1001 #include <iostream> #include <stdio ...
- Linode VPS上架日本东京2号机房,性能速度评测报告(推荐)
我非常喜欢的海外免备案vps品牌linode日本机房长期缺货,中国用户想买都买不到.不过近日,陆续有国内朋友收到了Linode邀请,Tokyo 2日本东京机房开启内测,很快正式上架销售. 苦等太久的站 ...
- python字符串和列表
import sys#sys.argv[0] 被设定为指定模块的全名#脚本名和附加参数传入一个名为 sys.argv 的字符串列表.你能够获取这个列表通过执行 import sys,列表的长度大于等于 ...
- AC自动机(AC automation)
字典树+KMP 参考自: http://www.cppblog.com/mythit/archive/2009/04/21/80633.html ; //字典大小 //定义结点 struct node ...
- 【USACO】草地排水
Drainage Ditches 草地排水 usaco 4.2.1描述在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一 ...
- Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作
目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...
- Linux Tomcat 自启动
使用chkconfig命令 修改tomcat/bin/startup.sh,在开头的地方添加如下内容 #chkconfig: #description:tomcat auto start #proce ...
- 通过一个表的id同时查询多个表的数据
'select c.字段名,x.字段名 as 改为新的显示名,x.字段名 from 表名1 b,表名2 c,表名3 x where b.字段id=' . $id . ' and b.`字段id`=c. ...
- Chapter 19_0 位操作库
位操作库是Lua5.2版本里添加的库,所有函数放在bit32 table里.(bit32只能针对32位整数运算) 在Lua5.3版本里,bit32库被废弃掉.不过可以使用一个外部兼容库,但是最好直接用 ...
- <hdu - 1280> 前M大的数 (注意其中的细节)
这是杭电hdu上的链接http://acm.hdu.edu.cn/showproblem.php?pid=1280 Problem Description: 还记得Gardon给小希布置的那个作业么 ...