unity demo免费下载:第三人称镜头移动+瞄准线+发射弧线球打击方块(方块可以识别受击方向)demo
Unity: 第三人称视野移动+瞄准线+发射弧线球打击方块(方块可以识别受击方向)demo
功能描述:
相机能够根据鼠标滑动而移动(类似第三人称游戏镜头控制)
发射弧线的小球
相机视野有辅助线(瞄准线,类似愤怒的小鸟瞄准线)
方块能判断哪一方向被击中
演示
demo版本1.0
demo版本2.0
说明补充 和 下载链接
两个场景资源包,免费下载
网盘链接:
链接:https://pan.baidu.com/s/1P9Uj7i6v-NPlrIB6rE-0Dg
提取码:f8sd
第一个使用的手动添加力和赋予初速度(没用用重力)的方法,不同角度发射小球运动轨迹相同(在碰到物体前),小球碰到物体后运动比较梦幻。代码自己写的。
第二个场景用了重力,不同角度发射小球运动轨迹不同,小球碰到物体后运动会下落。因为项目的临时变化,才改用了重力,由于赶时间,在计算轨迹上用了别人的代码【Unity】预计算刚体运动轨迹_萧然-CSDN博客_unity 轨迹线
部分细节
子弹发射部分(注意,最后把施加力的代码放在了FixedUpdate里面,这点非常重要,后面有简单的讲解)
- 由于镜头会移动、要用刚体控制,而且目标位置不是固定的,所以实现子弹弧线运动没有我想的那么简单
(该方法已经弃用)
在Fire类
//向前运动 bulletSon.GetComponent<Rigidbody>().velocity = bulletSon.transform.forward * speedZ;
在新的子弹类里面跟新子弹自身竖直方向的力
private void Update() {t += Time.deltaTime;deltaForce = 1f / 2 * a * t * t;gameObject.GetComponent<Rigidbody>().AddForce(gameObject.transform.up * (gameObject.GetComponent<BulletParameter>().deltaForce*(-1))); }
(已弃用)
其实AddForce需要一直存在,才能实现现实生活中的力的效果,如果只在函数里面调用一次AddForce,就相当于只附加了一个初速度。
(现在用的此方法)
然后稍微优化了一下结构,把速度放在子弹的类里面
public class BulletParameter : MonoBehaviour {public float deltaForce = 0 ;private float a = 10.5f;private float t = 0;private float speedFront = 9f;private void Start(){//不能放在update里面,会覆盖速度//向前运动gameObject.GetComponent<Rigidbody>().velocity = transform.forward * speedFront;}private void Update(){t += Time.deltaTime;deltaForce = 1f / 2 * a * t * t;//相当于自身的竖直方向gameObject.GetComponent<Rigidbody>().AddForce(gameObject.transform.up * (gameObject.GetComponent<BulletParameter>().deltaForce*(-1)));} }
只是当子弹碰撞物体后,就会很鬼畜地乱飞,还挺有意思的。如果以世界坐标应该就不会有这种情况,但是这样的话就需要改变镜头的控制方式,不满足需求。
(最终采用的方法)
如果需要平抛运动可以这样,力放在FixedUpdate里面这点非常非常重要,不然后面根据公式计算的辅助线会和运动轨迹不重合!
using System.Collections; using System.Collections.Generic; using UnityEngine;public class BulletParameter : MonoBehaviour {private float speedFront = 9f;//向前运动的速度private float forceVertical = -0.3f;//竖直方向的力//已弃用//public float deltaForce = 0 ;//力的变化//private float a = 11f;//力的变化速率//private float t = 0;//运动时间private void Start(){//不能放在update里面,会覆盖速度//向前运动gameObject.GetComponent<Rigidbody>().velocity = transform.forward * speedFront;}private void FixedUpdate(){//t += Time.deltaTime;//deltaForce = 1f / 2 * a * t * t;//相当于自身的竖直方向,此为类平抛运动//gameObject.GetComponent<Rigidbody>().AddForce(gameObject.transform.up * (gameObject.GetComponent<BulletParameter>().deltaForce*(-1)));//此为平抛运动gameObject.GetComponent<Rigidbody>().AddForce(gameObject.transform.up * forceVertical);} }
- 子弹发射需要开启碰撞连续检测
bulletSon.GetComponent<Rigidbody>().collisionDetectionMode = CollisionDetectionMode.Continuous;//bulletSon是我自己的子弹类
- 让子弹自身的坐标和当前相机一致,有助于控制不同角度发射子弹和辅助线瞄准的功能
bulletSon.transform.rotation = gameObject.transform.rotation;
轨迹弧线部分
- 因为Linerenderer画的线我用着有些地方有些卡手,不方便,画的线是扁的所以我就用预制体代替点,描出运动轨迹。轨迹点通过物理公式计算得到。
- 可能有人会想直接抛出一个物体记录轨迹点,就可以省去计算的过程。实际上,物体抛出后,需要时间运动,这个时间会带来巨大的延迟,当你稍微移动一下视野,等半天才能得到轨迹。所以需要直接计算出来。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DrawLineObject : MonoBehaviour
{public BulletParameter bullet;public GameObject camera;//获得相机public GameObject pointObject;//充当辅助线点 的预制体private GameObject[] points;//辅助线的点private float speedFront;//向前运动的速度private float forceVertical;//竖直方向力private float lineTime;//线能触及到子弹运动的时长private int pointNums;//点的个数private void Awake(){speedFront = bullet.speedFront;//camera = GameObject.Find("MainCamera");forceVertical = bullet.forceVertical;lineTime = 0.5f;pointNums = 5;points = new GameObject[pointNums];for(int i = 0; i < pointNums; i++){points[i] = Instantiate(pointObject);}}private void Update(){//获得单位时间,用单位时间算点的位移float interval = lineTime / pointNums;for (int i = 1; i <= pointNums; i++){Vector3 pointNow = camera.transform.position;//pointNow = camera.transform.position;pointNow += camera.transform.forward * speedFront * interval * i;pointNow += camera.transform.up * forceVertical * 0.5f * Mathf.Pow((interval * i), 2);points[i - 1].transform.position = pointNow;}}}
方向判断
- 思路概括:
当发生碰撞时,用子弹的坐标和方块的坐标减,得到新坐标,新坐标xyz中绝对值最大的轴和它的正负即可判断被击中的面
- 我先用了一个枚举保存方向
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum Direction
{Up=2,Down=-2,Right=1,Left=-1,Front=3,Back=-3
}
- 判断方向的代码,此处不再赘述。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SideJudge : MonoBehaviour
{private void OnCollisionEnter(Collision collision){if(collision.gameObject.tag == "bullet"){Vector3 Direct = collision.transform.position - this.transform.position;//坐标相减var dir = CollDirection(Direct);//判断方向print(gameObject.name + "的" + dir + "边,坐标为:" + Direct + "被击中");}}Direction CollDirection(Vector3 direct){int index = 0;float[] array = new float[] { direct.x, direct.y, direct.z };//根据数值最大轴的正负判断for (int i = 0; i < 3; i++){if (Mathf.Abs(direct[i]) > Mathf.Abs(direct[index])){index = i;}}return (Direction)( (index + 1) * (int)(direct[index] / Mathf.Abs(direct[index]) ) );}
}
镜头移动
只需要一个看向点、读取鼠标状态,然后改变位置即可。
unity demo免费下载:第三人称镜头移动+瞄准线+发射弧线球打击方块(方块可以识别受击方向)demo相关推荐
- Unity学习笔记(一):第三人称镜头和人物移动
凭借一腔热情,想着大学做点什么事,就想着做个游戏出来.之前没有接触过unity等各类引擎,学习了一段时间发现有许多地方挺复杂的,开个专栏记录一下学到的东西. 基本目标是做一个RPG式的游戏,涉及的东西 ...
- Pass4side CompTIA PDI+ Beta Exam PD1-001 DEMO 免费下载
PD1-001 认证考试题库 PD1-001 权威考题 考题特点PD1-001考试题库全面覆盖考试内容,同时提供有100%正确的答案!使用Pass4Side产品,我们确保你一次通过考试 价格: 625 ...
- Unity3D中的第三人称镜头的脚本控制
好久没有敲Blog了,谢谢大家的留言.关注.私信等支持,但是我好像已经没有办法让自己继续写以前的博客系列了,因为我发现网上关于unity3D的内容太少了,所以我无法自拔地想写U3D相关的文章!!! 第 ...
- unity全免费下载网站 源代码插件模型场景全部免费
www.unityfly.com unity项目源代码插件模型场景免费资源学习分享 unity爱心飞扬下载站
- Unity 第一人称、第三人称、漫游视角 控制器.
前言 这是以前写的人物控制器(包含第一人称.第三人称.漫游视角),这里做个记录,方便后续参考使用. 实现 模型使用官方的,操作使用鼠标右键控制视角,键盘WASD.Shift控制人物移动. 切换到漫游视 ...
- UNITY 虚拟相机 Cinemachine 第三人称视角 新输入系统 超简单
效果展示 第一步 在人物模型添加一个空的子物体,作为相机的跟随点,位置大概在胸口. 第二步 添加一个虚拟相机 虚拟相机配置如下 注意Follow的物体就是刚刚设置的空物体 第三步 在人物模型上添加Pl ...
- Unity 相机跟随(第三人称视角)
思路 声明两个变量 相机高度 相机距离目标多少米 在Start中获取相机偏差值 改变相机照射玩家的远近 声明一个变量位置坐标将所有值带入算出相机观察点坐标 使用Lerp插值移动过去 在LookAt玩家 ...
- Threejs实现键盘控制人物行走跳动/Capsule碰撞体(胶囊体)/碰撞检测(Octree八叉树)/游戏第三人称/镜头跟随人物移动
个人主页: 左本Web3D,更多案例预览请点击==> 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例
- Unity官方代言角色Unity Chan(Unity娘/优妮蒂/ユニティちゃん)模型免费下载
Unity Chan Unity Chan就是下面这个角色啦 游戏引擎研发商Unity Technologies日本分公司Unity Technologie Japan日前宣布,自2014年4月7日起 ...
最新文章
- 机器学习基础(一)——人工神经网络与简单的感知器
- python程序员工作怎样-怎样才能成为一名Python程序员
- ckfinder 图片预览 有的显示有的不显示_Python学习之图片显示
- 浅说 Rewrite规则简介
- FreeMarker笔记 前言第1章 入门
- linux系统下如何使用U盘、光盘、软盘?如何挂载U盘,光盘镜像?
- Eclipse关联JavaDoc
- html5执行shell,利用nginx执行Shell 脚本
- 解决firefox和IE9对icon font字体的跨域访问问题
- [搬运] mac下安装GDB
- C++如何生成随机数
- ajax请求resource文件Access to XMLHttpRequest at 'file:'
- 二、Vue菜鸟小教程-vue-router的简单入门程序
- 离线扫一扫识别车牌号 车牌识别 OCR识别技术
- origin拟合曲线方法
- Android外挂开发探索
- 机器学习之过拟合与欠拟合
- 爱上一个人的七种表现
- Android UI框架深度解析
- 关于c3p0连接池使用xml配置出现的一些错误
热门文章
- Jenkins 也宣布弃用 JDK 8,你还在用JDK8吗
- 智能卡的操作系统——COS
- linux 磁盘压测工具 fps,荣耀MagicBook Pro锐龙版性能评测,可媲美MX150 2GB核心显卡...
- 双系统从Windows下分出空间给Ubuntu的空间不够的分区
- Terraria及tModloader开服教程
- 编程中的脚手架是什么意思
- Lawliet|Python学习笔记3——函数
- 例题6-13 古代象形符号(Ancient Messages,World Finals 2011,UVa 1103)
- 804. 唯一摩尔斯密码词
- Android 平板、手机: 忘记密码处理及刷机处理技术贴(以三星为例)