unity3d射击类demo
1 创建地板(floor)和四面墙壁,new Plane实现
自带的网格碰撞器Mesh Collider,勾选Convex,否则碰撞其他物体无效
2 创建几个cube物体,添加Box Collider和RigidBody,为cube创建脚本,控制物体移动,由于移动过程中物体会产生反转,造成前后方向异常,可以采用在updata方法里重置物体的旋转角度的方法:transform.localRotation = Quaternion.Euler(0, 0, 0);(四元数重置物体的旋转角度)
3 控制物体移动:
方法一:改变物体的位移: transform.Translate(Vector3.left * speed);
方法二:为物体添加一个力:rigidbody.AddForce(Vector3.left * speed);
4 控制物体跳跃:
为了防止物体跳跃过高,需要提前处理跳跃逻辑,只在地面上可以跳跃,需要使用变量控制
1 为floor物体添加一个Tag标签,命名为Floor,
2 物体的碰撞事件(碰撞器):onCollisionEnter() OnCollisionExit() OnCollisionStay(),由于物体受重力影响,会一只在floor上面,物体的碰撞只在OnCollisionStay()方法处理,变量的值也在这个方法里控制
void OnCollisionStay(Collision other)
{
Debug.Log("OnCollisionStay other :"+ other.gameObject.tag);
if(other.gameObject.tag =="Floor")
{
isGround =true;
}
}
Update()方法:
if(Input.GetKey(KeyCode.Space))
{
if(isGround)
{
transform.Translate(Vector3.up );
isGround =false;
}
}
5 控制射线模拟射击行为
1 在需要发射射线的位置添加组件:Line Renderer;Light;Particle system
2 Line Renderer 配置材质(射线的颜色),射线起始宽度,结束宽度
3 Light里面配置点光源(Point),设置光源颜色(决定了射击时枪口光颜色)
4 射线发射物体创建子物体FaceLight(可选),决定了射击时正前方的颜色
5 注意:前4个组件默认不选中,以控制射击动作时射线和光线闪烁
6 编写代码,控制射线
1 awake函数里获取每个组件对象
2 updata函数里判断鼠标左键点击动作,点击鼠标左键即可触发射击操作
if(Input.GetButtonDown("Fire1")&& timer >= betweenTwoShot &&Time.timeScale !=0)
{
Shooting();
}
gunLight.enabled =true;
faceLight.enabled =true;
gunParticle.Stop();
gunParticle.Play();
gunLine.enabled =true;
gunLine.SetPosition(0, transform.position);
Debug.Log("射线的位置:"+ transform.position);
shootRay.origin = transform.position;
shootRay.direction = transform.forward;
shootableMask =LayerMask.GetMask("shooter");
if(Physics.Raycast(shootRay,out shootHit, gunRange, shootableMask))//光线投射(射线起点,射线方向,射线长度,碰撞器)
{
//进入这个方法只是表示射线射击到了这个layer里,并不表示射击到了目标物体
Debug.Log("射线已投射......");
gunLine.SetPosition(1, shootHit.point);
}
// If the raycast didn't hit anything on the shootable layer...
else
{
// ... set the second position of the line renderer to the fullest extent of the gun's range.
gunLine.SetPosition(1, shootRay.origin + shootRay.direction * gunRange);
Debug.Log("else......");
}
6 设置脚本模拟敌人受到伤害
1 为敌人物体创并挂上脚本CubeHealth,射线发出后,由于敌人属于环境layer层的子类,可以获取到射线
2 使用射线碰撞器方法获取射线碰撞组件是否已经挂CubeHealth脚本的组件,获取到后做下一步处理
CubeHealth cubeHealth = shootHit.collider.GetComponent<CubeHealth>();
if(cubeHealth !=null)
{
Debug.Log("射线已投射--------------");
}
publicvoidTakeDamage(int hit,Vector3 point)
{
defaultHealth -= hit;
Debug.Log("cube health :"+ defaultHealth);
if(defaultHealth <=0)
{
Destroy(gameObject);
}
}
publicclassCameraFollow:MonoBehaviour
{
publicTransform target;//设置跟随的对象,这里写主角的tag
Vector3 offset;
publicfloat smoothTime =5f;
// Use this for initialization
voidStart()
{
offset = transform.position - target.position;
}
// Update is called once per frame
voidUpdate()
{
Vector3 v3 = target.position + offset;
//插值器,表示在一定时间内(第三个参数),从坐标一(第一个参数)移动到坐标二(第二个参数)
transform.position =Vector3.Lerp(transform.position, v3, smoothTime *Time.deltaTime);
}
}
publicvoid onButtonClick()
{
canvas.gameObject.SetActive(false);//设置Canvas隐藏
human.gameObject.SetActive(true);//设置主角显示
environment.gameObject.SetActive(true);//设置环境显示
}
publicclass cubeManager :MonoBehaviour
{
publicGameObject cubeObject;
publicGameObject sphereObject;
voidStart()
{
InvokeRepeating("CreateCube",3f,3f);
}
voidCreateCube()
{
Vector3 v3 = transform.TransformDirection(Random.Range(0f,6f),Random.Range(0f,4f),Random.Range(-26f,-6f));
Instantiate(cubeObject, v3, transform.rotation);
Instantiate(sphereObject, v3, transform.rotation);
}
}
publicclassDestoryObject:MonoBehaviour{
//设置cube或者floor 的is Trigger为true时,才会执行此函数
voidOnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnter other :"+ other.gameObject.tag);
if(other.gameObject.tag =="cube")
{
Destroy(other.gameObject);
}
if(other.gameObject.tag =="sphere")
{
Destroy(other.gameObject);
}
}
voidOnTriggerStay(Collider collider)
{
}
voidOnTriggerExit(Collider collider)
{
}
}
unity3d射击类demo相关推荐
- Unity3D射击类游戏制作第五节--玩家角色-武器
ps:因为在上一节中子弹的射击是连续的,暂时还没有找到解决的办法,所以在RobotPlayer中加了如下代码: if (Input.GetKeyDown(KeyCode.Space)){animato ...
- Unity3D射击类游戏制作第三节--游戏模型
将此角色模型拖拽到场景中 在Resources–Animation中新建一个 New Animator Controller并取名为Player 将Player动画控制器拖到模型上 在Player动画 ...
- Unity3D射击类游戏制作第一节--场景搭建
导入资源 在Asset Store中下载游戏所需的资源:FPS Icons Pack:RPG_FPS_game_assets_industrial:SciFiWarriorPBRHPPolyart 并 ...
- Unity3D休闲射击类游戏《Survival Shooter》完整源码
Unity3D休闲射击类游戏<Survival Shooter>完整源码分享给大家学习,这个对于那些想要制作u3d射击类游戏有很大帮助. 运行环境是:Unity5.3.1 下载地址: ht ...
- 用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇
不知不觉这已经是第七篇文章了,今天来谈谈python中类(class)在游戏中的应用. 老规矩,先展现一下之前的几篇博文: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用pytho ...
- 简单的射击类Android游戏--《环形射击》
时隔差不多一个月之久,又一个游戏诞生了,不过相较于之前的几款游戏,这款游戏的可玩性比较高,虽然说其游戏整体的框架复杂度是相当低的,因为可以把其定义为简单射击类小游戏,名字叫做<环形射击>. ...
- Java类Demo中存在_Java中的数据类型转换
先来看一个题: Java类Demo中存在方法func0.func1.func2.func3和func4,请问该方法中,哪些是不合法的定义?( ) public class Demo{ float fu ...
- [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏
前言 这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示 ...
- EA出品的java射击类游戏,盘点五款射击类RPG游戏:你喜欢这类型游戏吗?
盘点五款射击类RPG游戏:你喜欢这类型游戏吗? 2020-06-04 18:04:06 3点赞 10收藏 3评论 RPG这种类型的游戏有很多,也是有许多玩家的喜欢.说到射击类型与RPG相结合的游戏,不 ...
最新文章
- linux out of memory分析(OOM)
- rosserial_java_编写ros串口节点,使用官方serial包(示例代码)
- VTK:PolyData之ReverseSense
- Linux探秘之用户态与内核态
- javaweb在线问卷系统_2020 最新流行的Java Web报表工具比对
- 解决org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql ...
- 什么是 FreeMarker
- pycharm 快捷使用
- python网络虫营销_python与sem,大数据降低竞价推广成本利器
- QT GUI界面中集成VISIO绘图区详细说明
- ReportMachine通过嵌套表达式计算某个值。
- Android 电话的国家代码
- 【python柱状图】图例大小、位置,X轴刻度大小,旋转角度
- 微信小程序父子组件方法调用方法汇总
- 解决Win10桌面右键卡顿一直转圈圈的问题
- jQuery老矣,尚能饭否
- 运动快乐的来源-内啡肽
- 业务常识:线上充值与掉单
- 全球与中国智能监控摄像头市场现状及未来发展趋势
- python 发红包import random用redenv_python 发红包
热门文章
- ORA-29491: invalid table for chunking 错误记录
- Java 并发编程艺术 读书笔记
- 要求返回三位数中的水仙花数 ,数字范围在100-999中。(水仙花数:百位数的3次方+十位数的3次方+个位数的三次方=数字本身)
- 树形表实现 bootstrap-table + treegrid
- 在那个时候根本没有计算机房,王德厚:我们现在的写作环境与王瑶先生那个时候没有根本区别...
- Mac下编写C或C++
- 每页多张幻灯片密集打印的设置技巧
- mysql从数据库查询的时间与实际时间相差8小时(时区问题)
- Win10 企业版ltsc 无法访问samba网络共享问题及解决!(转)
- 微信小程序实现开关原理、动态添加class