网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月05日漏签0天
unity3d吧 关注:116,962贴子:562,384
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回unity3d吧
>0< 加载中...

最近好闲啊,天天逛贴吧,来点技术问题呀

  • 取消只看楼主
  • 收藏

  • 回复
  • 大风起兮云飞扬123
  • Script
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
就我这个活跃度,看了有意思的帖子就回。之前开了个贴回答问题,现在问题也没人问了。打王者又被坑,逛贴吧,给官方上传插件,最近还开了个公众号unity风雨路,写文章闲的一批啊。。。要不要霹雳吧啦写一堆技术贴???可是我懒啊。。。把我CSDN的搬过来?那又深度有点高,,,贴吧小白多点。。。不晓得干啥子。。。
典韦台词:求求你阻止我,疯狂的是我还是整个世界?
懒得找镇楼图,从公众号里扒拉出一个某文章的图。


  • 大风起兮云飞扬123
  • Script
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraAvoidBlock : MonoBehaviour {
//摄像机观察目标,即主角
public Transform Target;
public Transform LookAt;
//在摄像机和主角之间的物体
List<GameObject> lastHitObjs;
List<GameObject> hitObjs;
void LateUpdate() {
if (Target == null || LookAt == null) return;//主角为空,就不作任何操作
AvoidViewBlock();//在Update函数中检测是否有物体挡住主角
}
void AvoidViewBlock()
{
Vector3 ori = Target.position+Vector3.up*0.2f;//射线起点是主角位置偏上一点
Vector3 dir = (transform.position-Target.position).normalized; //射线方向从主角指向摄像机,向量要进行单位化
Debug.DrawRay(ori,dir);//运行时,在场景中观察射线是否正常
RaycastHit[] raycastHits=Physics.RaycastAll(ori,dir,1000f);//获取射线的raycast hit数组
//每一帧射中的物体都要重新计算,清空物体列表
hitObjs.Clear();
//把除了主角本身以外碰撞到的物体加入到List中
if (raycastHits.Length > 1)
{
for(int i = 0; i < raycastHits.Length; i++)
{
if (raycastHits[i].transform.Equals(Target)) continue;
GameObject go = raycastHits[i].collider.gameObject;
if (go.GetComponent<Renderer>()==null)continue;
hitObjs.Add(go);
//对这些物体进行操作:如降低材质透明度或禁用Renderer
//注意:不能禁用该物体碰撞盒,否则下一帧检测不到该物体,也无法复原
SetMaterialAlpha(raycastHits[i].collider.gameObject,0f);
}
}
//这里的思想是:理论上要把lastHitObjs中的所有物体都恢复
//但是有一些物体这一帧还在遮挡,所以把它们刨去
for(int i = 0; i < lastHitObjs.Count; i++)
{
for(int j = 0; j < hitObjs.Count; j++)
{
if (hitObjs[j] != null)
{
if (hitObjs[j] == lastHitObjs[i])
{
lastHitObjs[i] = null;
}
}
}
}
for(int i = 0; i < lastHitObjs.Count; i++)
{
if (lastHitObjs[i] != null)
{
SetMaterialAlpha(lastHitObjs[i], 1f);//把他们的材质透明度恢复
}
}
//结束之后,更新lastHitObjs
for (int i = 0; i < hitObjs.Count; i++)
{
lastHitObjs.Add(hitObjs[i]);//这次的物体移到上次被碰到的List当中去
}
}
void SetMaterialAlpha(GameObject go,float alpha)
{
Renderer renderer = go.GetComponent<Renderer>();
int matNum= renderer.sharedMaterials.Length;
//SharedMaterials和materials的区别在于:
//改变前者会改变所有用到了这个材质的物体,而后者只改变这个物体
for (int i=0;i<matNum;i++)
{
Color _color = renderer.materials[i].color;
_color.a = alpha;
renderer.materials[i].SetColor("_Color", _color);
}
}
}


2026-03-05 20:09:43
广告
不感兴趣
开通SVIP免广告
  • 大风起兮云飞扬123
  • Script
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
。


  • 大风起兮云飞扬123
  • Script
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
之前有个人问我小地图怎么做。懒得在写一次了,翻了翻以前写的一个,最基础的做法。代码都不用那种。毕竟适合小白,小白怕啥,不就怕代码吗,整个无代码分享出来。
注意:该场景为固定场景,即小地图会看到整个场景而非跟随主角的局部地图。适合用于小的游戏场景。
假如是FPS游戏,当然FPS必然有个Player(玩家)和enemy(敌人)。先拿player来举例子,我们可以在player下面建立一个子物体用Sphere这个球体来做子物体,这个子物体就是用来代替player在小地图中的显示的。然后把Sphere的属性中的collider这个属性去掉。然后给把其Shader设置成发光的材质,本例中设为绿色发光的。如图所示:

给他新建一个layer命名为dd,并且让其在dd这一层里。如图:

下面就可以新建一个摄像机,命名为mincamera,把他的放到整个场景的上方,使其镜头俯视整个场景,然后把属性里的viewport Rect 的数值调整到适合的大小,大小都可以在
camera preview里看到,同时在camera preview里也能看到用来代替Player的发光的绿色小球。如下面3副图:


这样小地图就已经见到雏形了,然后呢就So easy了。把mincamera的Culling Mask属性的摄像层次只设定到level和dd这两个层就OK了,这样mincamera就只能看到level和dd这两个层的物体了,leve就是我们的场景地图所在层,dd就是我们上面说到的用来代替Player的发光Sphere所在层。如图:

然后呢不要忘记我们的主相机,主相机不能摄像到dd这一层其他的都要摄到,如下图:

看下运行结果有图有真相:那个绿色的小点就是我们的玩家player。无论玩家在场景里怎么走,小地图都能跟踪显示了。那同样的enemy也用这个方法,小地图就可以显示敌人的位置了。ok了,So easy 完成了!简单吧一句代码都没写。。。

————————————————


  • 大风起兮云飞扬123
  • Script
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回unity3d吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示