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相关推荐

  1. Unity学习笔记(一):第三人称镜头和人物移动

    凭借一腔热情,想着大学做点什么事,就想着做个游戏出来.之前没有接触过unity等各类引擎,学习了一段时间发现有许多地方挺复杂的,开个专栏记录一下学到的东西. 基本目标是做一个RPG式的游戏,涉及的东西 ...

  2. Pass4side CompTIA PDI+ Beta Exam PD1-001 DEMO 免费下载

    PD1-001 认证考试题库 PD1-001 权威考题 考题特点PD1-001考试题库全面覆盖考试内容,同时提供有100%正确的答案!使用Pass4Side产品,我们确保你一次通过考试 价格: 625 ...

  3. Unity3D中的第三人称镜头的脚本控制

    好久没有敲Blog了,谢谢大家的留言.关注.私信等支持,但是我好像已经没有办法让自己继续写以前的博客系列了,因为我发现网上关于unity3D的内容太少了,所以我无法自拔地想写U3D相关的文章!!! 第 ...

  4. unity全免费下载网站 源代码插件模型场景全部免费

    www.unityfly.com unity项目源代码插件模型场景免费资源学习分享 unity爱心飞扬下载站

  5. Unity 第一人称、第三人称、漫游视角 控制器.

    前言 这是以前写的人物控制器(包含第一人称.第三人称.漫游视角),这里做个记录,方便后续参考使用. 实现 模型使用官方的,操作使用鼠标右键控制视角,键盘WASD.Shift控制人物移动. 切换到漫游视 ...

  6. UNITY 虚拟相机 Cinemachine 第三人称视角 新输入系统 超简单

    效果展示 第一步 在人物模型添加一个空的子物体,作为相机的跟随点,位置大概在胸口. 第二步 添加一个虚拟相机 虚拟相机配置如下 注意Follow的物体就是刚刚设置的空物体 第三步 在人物模型上添加Pl ...

  7. Unity 相机跟随(第三人称视角)

    思路 声明两个变量 相机高度 相机距离目标多少米 在Start中获取相机偏差值 改变相机照射玩家的远近 声明一个变量位置坐标将所有值带入算出相机观察点坐标 使用Lerp插值移动过去 在LookAt玩家 ...

  8. Threejs实现键盘控制人物行走跳动/Capsule碰撞体(胶囊体)/碰撞检测(Octree八叉树)/游戏第三人称/镜头跟随人物移动

    个人主页: 左本Web3D,更多案例预览请点击==> 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例

  9. Unity官方代言角色Unity Chan(Unity娘/优妮蒂/ユニティちゃん)模型免费下载

    Unity Chan Unity Chan就是下面这个角色啦 游戏引擎研发商Unity Technologies日本分公司Unity Technologie Japan日前宣布,自2014年4月7日起 ...

最新文章

  1. 机器学习基础(一)——人工神经网络与简单的感知器
  2. python程序员工作怎样-怎样才能成为一名Python程序员
  3. ckfinder 图片预览 有的显示有的不显示_Python学习之图片显示
  4. 浅说 Rewrite规则简介
  5. FreeMarker笔记 前言第1章 入门
  6. linux系统下如何使用U盘、光盘、软盘?如何挂载U盘,光盘镜像?
  7. Eclipse关联JavaDoc
  8. html5执行shell,利用nginx执行Shell 脚本
  9. 解决firefox和IE9对icon font字体的跨域访问问题
  10. [搬运] mac下安装GDB
  11. C++如何生成随机数
  12. ajax请求resource文件Access to XMLHttpRequest at 'file:'
  13. 二、Vue菜鸟小教程-vue-router的简单入门程序
  14. 离线扫一扫识别车牌号 车牌识别 OCR识别技术
  15. origin拟合曲线方法
  16. Android外挂开发探索
  17. 机器学习之过拟合与欠拟合
  18. 爱上一个人的七种表现
  19. Android UI框架深度解析
  20. 关于c3p0连接池使用xml配置出现的一些错误

热门文章

  1. Jenkins 也宣布弃用 JDK 8,你还在用JDK8吗
  2. 智能卡的操作系统——COS
  3. linux 磁盘压测工具 fps,荣耀MagicBook Pro锐龙版性能评测,可媲美MX150 2GB核心显卡...
  4. 双系统从Windows下分出空间给Ubuntu的空间不够的分区
  5. Terraria及tModloader开服教程
  6. 编程中的脚手架是什么意思
  7. Lawliet|Python学习笔记3——函数
  8. 例题6-13 古代象形符号(Ancient Messages,World Finals 2011,UVa 1103)
  9. 804. 唯一摩尔斯密码词
  10. Android 平板、手机: 忘记密码处理及刷机处理技术贴(以三星为例)