版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

目标

  • 预制体Tag的更改
  • 子弹脚本的编写
  • 子弹碰到圆环后反弹

预制体Tag的更改

  • 首先我们先打开我们的砖块(任意)预制体然后在上方找到Tag选项

  • 单击打开后点击Add Tag,点击+号,增加两个如下Tag

  • 由于我们的圆环是动态创建的所以我们需要在脚本中添加更改Tag的代码,首先我们先Disc脚本找到对应的函数并添加第23行代码如下所示:

private void CreateArch(int radius, int deg, int rot)
{
// 创建圆环
ProBuilderMesh pbMesh = ShapeGenerator.GenerateArch(PivotLocation.FirstVertex,
deg, radius, 0.5f, 1, 20, true, true, true, true, true);
pbMesh.GetComponent<MeshRenderer>().material = mat; // 设置圆环的Tag
pbMesh.gameObject.tag = "Arch"; // 给圆环添加碰撞器
pbMesh.gameObject.AddComponent<MeshCollider>(); // 使圆环平躺
pbMesh.transform.Rotate(-90, 0, 0); // 设置圆环的父节点,使其绕着父节点公转(父节点默认创建在原点)
Transform xRig = new GameObject("xRig").transform;
pbMesh.transform.SetParent(xRig, false); // 设置圆环初始在圆盘的旋转角度
xRig.Rotate(0, rot, 0);
Transform yRig = new GameObject("yRig").transform;
xRig.SetParent(yRig, false); yRig.SetParent(this.transform, false);
}
}
  • 然后保存并关闭我们的脚本即可。
  • 由于我们的砖块是有预制体的,所以我们只需打开砖块的预制体然后把Tag改为Brick即可。

子弹脚本的编写

  • 我们先新建一个脚本重命名为Porjectile并打开编写如下代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine; // 子弹脚本
public class Projectile : MonoBehaviour
{
private void Start()
{
} // 把子弹跟其他物体碰撞的脚本写在这里
private void OnCollisionEnter(Collision collision)
{
// 子弹跟谁发生了碰撞?
if (collision.gameObject.tag == "Arch")
{
print("你碰到了圆环!");
}
else if (collision.gameObject.tag == "Brick")
{
print("你碰到了砖块!");
}
}
}
  • 并把脚本拖给子弹即可,由于子弹有可能会碰到平台,我们可以选中平台把平台的Mesh Colider组件给移除掉。注意,子弹上得添加Rigidbody和Sphere Colider组件,否则子弹不会产生碰撞效果。

子弹碰到圆环后反弹

  • 首先我们需要联系优梦创客的助教Alice老师她为我们提供完成本节课任务所需要的插件,然后把插件导入至我们的Unity,并打开我们的Projectile预制体并添加Lober脚本,并把左上角的√给取消掉,如下所示



    然后重新打开我们的Projectile脚本并把代码修改为如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine; // 子弹脚本
public class Projectile : MonoBehaviour
{
private Lober lober;
private Transform ply; private void Start()
{
lober = GetComponent<Lober>(); ply = GameObject.FindWithTag("Player").transform;
} // 把子弹跟其他物体碰撞的脚本写在这里
private void OnCollisionEnter(Collision collision)
{
// 子弹跟谁发生了碰撞?
if (collision.gameObject.tag == "Arch")
{
print("你碰到了圆环!"); lober.endPos = ply.position; lober.enabled = true;
}
else if (collision.gameObject.tag == "Brick")
{
print("你碰到了砖块!");
}
}
}

最新文章

  1. [已解决] git 重命名文件夹
  2. composer 一些使用说明
  3. java基础-复制
  4. python 函数小实例
  5. PHP-----类与对象,成员方法,成员属性,构造方法,析构方法
  6. HowTo Perform the spatial selection 'Share a line segment with' using ArcObjects
  7. multi-CPU, multi-core and hyper-thread--转
  8. 手把手集成web端手写公式功能
  9. 《Java核心技术卷二》笔记(三)正则表达式
  10. 88. Merge Sorted Array
  11. Javascript的简单测试环境
  12. RabbitMQ-从基础到实战(1)— Hello RabbitMQ
  13. html &lt;input type=&quot;text&quot; /&gt;加上readonly后在各种浏览器的差异。
  14. Python学习之MacBook Pro中Python3.7安装pip以及numpy
  15. JavaScript复习笔记——数据类型
  16. JavaScript -- 时光流逝(四):js中的 Math 对象的属性和方法
  17. 数字图像处理的Matlab实现(2)—MATLAB基础
  18. ES6函数的特性(箭头语法)
  19. Fibonacci Modified
  20. linux命令-查找所有文件中包含某个字符串

热门文章

  1. &#128161;我们的表单解决方案 el-form-renderer
  2. Oracle 数据库登录、用户解锁、改密码、创建用户授权操作
  3. 如何把一个jar包导入到eclipse中
  4. gulp压缩js文件报错日志
  5. Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别
  6. ContentProvider 使用详解
  7. 个人使用的lilypond第一个模板
  8. python基础之条件控制
  9. c++随笔之编译器编译原理
  10. 数据结构之队列C++版