unity 我的世界鼠标点击生成物品思路
思路
根据鼠标点击位置生成方块,
一开始我是想用射线的。后面经过实践,感觉用碰撞器,要比射线好得多。
实践是检验真理的唯一标准,
性能:举例:我在生成“我的世界”类似的地图时,一开始不知道用柏林噪声函数,用的随机数去边填空的方法,一般而言,都要生成5万个方块儿。因为想平滑地图原因。我给每一个方块儿都加了一个脚本,计算碰撞。
下面是正题:我原本以为碰撞非常消耗性能,照理说游戏开始时几万个方块儿同时计算碰撞,肯定会卡个几秒。但是出乎意料基本跟没加脚本加载速度差不多。并且我用任务管理器,看了CPU的使用率,也基本差不多。
不信的朋友可以请自试一下。事后我恍然大悟,这就是为什么你在手机在玩“我的世界”时,有几十万个方块儿,但是并不卡。但是换位思考一下,如果你放过几十万条射线。你的手机说不定卡成渣!
射线生成时是一个变量,但是碰撞机是一个定量。
当我写了一个脚本鼠标点击生成一条射线时。CPU又猛的跳了一个9%。只是一条啊,可想而知,就算有误差,这也绝对不容忽视。
扯远了!
1.屏幕坐标转世界坐标
2.鼠标点击时检测有无碰撞体
3.没有则生成方块,
需要2个脚本,①方块的生成脚本②检测有无碰撞体的脚本,
主要说下②创一个空物体,有触发器,跟随鼠标移动,脚本建一个变量,发生碰撞,则变量改变,
①中,只需访问②中变量,变量合适,则点击可以生成物体,
重要的是思路!其中的细节要靠自己!,大佬匆喷,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Monse : MonoBehaviour
{
public Camera Cam;
public GameObject block;
public int ss = 20;
public Text ssc;
public GameObject Gam;
public int v;
void Start()
{
ssc = GameObject.Find("ss1").GetComponent<Text>();
}
void Update()
{
if (ss > 0)
{
Vector3 V3 = Cam.ScreenToWorldPoint(new Vector3
(Input.mousePosition.x, Input.mousePosition.y, 10));
Gam.transform .position = V3;
if (Input.GetMouseButtonDown(0))
{
int v = Gam.GetComponent<ss2>().sw2;
int y = Gam.GetComponent<ss2>().sw3;
if (v==y)
{
ss = ss - 1;
ssc.text = ss.ToString();
Vector3 V32 = new Vector3(Mathf.Round(V3.x), Mathf.Round(V3.y), 0);//去小数
GameObject a = Instantiate(block, V32, Quaternion.identity);//实例化(名字+位置+旋转
if (ss == 0)
{
Destroy(gameObject);
ssc.text = "";
}
}
}
}
}
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ss2 : MonoBehaviour
{
public int sw2;
public int sw3;
void OnTriggerEnter(Collider theCollision)
{
if (theCollision.CompareTag("a2"))
{
sw2 = sw2 + 1;
}
}
void OnTriggerExit(Collider theCollision)
{
if (theCollision.CompareTag("a2"))
{
sw3 = sw3 + 1;
if (sw2 == sw3 && sw2 >= 99)
{
sw2 = 1;
sw3 = 1;
}
}
}
}
版权声明:本文为xyyskl99原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。