Unity相扑战斗球

这篇具有很好参考价值的文章主要介绍了Unity相扑战斗球。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

玩家球通过上下键控制,相机依靠左右键控制,有加力量的东西,玩家球碰到力量吸收后,可以更大力碰撞敌人,当一波球碰掉后,还会生成新一波球。

  • 物理材质的弹力限制数0-1

为玩家和敌人分别加上物理材质

Unity相扑战斗球,Unity案例项目,unity,游戏引擎

  • 玩家碰撞钻石添加能量,并且钻石消失,这里应该把钻石的触发器勾选上,玩家的触发器不能勾选,因为玩家触发器勾选的话会导致与其他物体碰撞时没有碰撞效果,会穿过去

Unity相扑战斗球,Unity案例项目,unity,游戏引擎

协程

Unity相扑战斗球,Unity案例项目,unity,游戏引擎

先进入Start开启协程,执行Demo打印002,yield return null的意思是暂停 1帧并且在Update执行完之后才开始执行,所以执行到这时返回start中的StartCoroutine方法,Update会执行一次打印001,因为等待一帧,再打印001,yield结束,打印003。

Unity相扑战斗球,Unity案例项目,unity,游戏引擎

先进入Update打印001,开启协程(协助主线程,两个同时进行)打印002,yield暂停一帧(等update执行完暂停一帧再次执行,在update之后在lateupdate之前) ,打印003,主线程继续执行打印005,等待暂停一帧则update执行打印001,进入协程打印002再次yield暂停一帧,主线程继续执行打印003此时过去一帧,上一次Demo函数暂停那帧以执行完则打印004,再打印Latepdate里的005,此后一直循环001 002 003  004 005,每次打印的004都是上次暂停一帧结束后打印的。

  • Instantiate拷贝函数

在Unity游戏开发引擎中,`Instantiate`是一个用于创建游戏对象副本的函数。当你调用`Instantiate`函数时,它会根据提供的参数创建一个新实例,并将其放置在场景中。
在你提供的代码片段中:

Instantiate(enemyPrefab, GenerateSpawnPosition(), enemyPrefab.transform.rotation);


这里有三个参数:
1. `enemyPrefab`:这是一个游戏对象的预制体(Prefab),它通常包含了游戏对象的结构和组件的定义。预制体可以看作是游戏对象的蓝图或模板。
2. `GenerateSpawnPosition()`:这个参数看起来是一个函数调用,它应该返回一个位置向量,这个位置向量指定了新创建的游戏对象应该被放置的位置。在Unity中,你通常需要定义这个函数来确保新实例被放置在合适的位置,比如随机位置或者根据某种规则计算出的位置。
3. `enemyPrefab.transform.rotation`:这个参数是一个四元数,它代表了旋转信息。这里,`enemyPrefab.transform`指的是预制体本身的变换(位置、旋转和缩放),而`rotation`属性则是指预制体的旋转状态。将这个旋转状态传递给`Instantiate`函数意味着新创建的游戏对象将会继承预制体的旋转状态,这样新对象就会以与预制体相同的旋转角度出现在场景中。
总结来说,这行代码的意思是:在指定的位置(由`GenerateSpawnPosition()`函数返回的位置)创建一个`enemyPrefab`预制体的实例,并且这个新创建的实例应该继承预制体的旋转状态。这通常用于在游戏中生成敌人或其他游戏对象,并且确保它们以正确的角度和位置出现。 

  • 预制体中引用游戏对象,在与预制体对象相关联的脚本代码中不能public游戏对象然后在场景中拖拽,因为预制体是一个文件,在游戏未运行之前他就存在,而场景中的游戏对象是等游戏运行后才会出现的,所以在未运行时将一个没有的东西拖拽进行赋值是拖拽不进去的。

源码

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnManager : MonoBehaviour
{
    public GameObject enemyPrefab;
    public GameObject powerupPrefab;
    private float spawnRange = 9;
    public int enemyCount;
    public int waveNumber = 1;
    void Start()
    {
        SpawnEnemyWave(3);
        Instantiate(powerupPrefab, GenerateSpawnPosition(), powerupPrefab.transform.rotation);
    }

    // Update is called once per frame
    void Update()
    {
        enemyCount = FindObjectsOfType<EnemyController>().Length;
        //查找EnemyController类型的对象, FindObjectOfType<EnemyController>()返回EnemyController这个类型的对象,FindObjectsOfType<EnemyController>()找EnemyController类型的数组
        if (enemyCount == 0)
        {
            waveNumber++;
            SpawnEnemyWave(waveNumber);
            SpawnEnemyWave(1);
            Instantiate(powerupPrefab, GenerateSpawnPosition(), powerupPrefab.transform.rotation);
        }
    }
    Vector3 GenerateSpawnPosition()
    {
        float spawnPosX = Random.Range(-spawnRange, spawnRange);
        float spawnPosZ = Random.Range(-spawnRange, spawnRange);
        Vector3 randomPos = new Vector3(spawnPosX, 0, spawnPosZ);
        return randomPos;
    }
    void SpawnEnemyWave(int enemiesToSpawn) 
    {
        for(int i = 0; i < enemiesToSpawn; i++)
        {
            Instantiate(enemyPrefab, GenerateSpawnPosition(), enemyPrefab.transform.rotation);
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyController : MonoBehaviour
{
    public float speed;
    private Rigidbody enemyRb;
    private GameObject player;
    void Start()
    {
        enemyRb = GetComponent<Rigidbody>();
        player = GameObject.Find("Player");
    }

    // Update is called once per frame
    void Update()
    {
       
        Vector3 lookDirection = (player.transform.position - transform.position).normalized;
        enemyRb.AddForce(lookDirection * speed);
        //(player.transform.position - transform.position).normalized意思是玩家的位置与敌人的位置之差的向量方向,normalized相当于模【(x*x+y*y+z*z)的平方根】即两个物体之间的相对角度,最后化为一返回一个(x*x+y*y+z*z)的平方根=1的向量x,y,z
        //归一化可以防止两球之间距离一直在变,导致速度的改变
        if (transform.position.y < -10)
        {
            Destroy(gameObject);
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed=5.0f;
    private Rigidbody playerRb;

    private GameObject focalPoint;
    public GameObject powerupIndicator;
    public bool hasPowerup=false;
    private float powerupStrength=15.0f;
    // Start is called before the first frame update
    void Start()
    {
        playerRb = GetComponent<Rigidbody>();
        focalPoint = GameObject.Find("Focal Point");
    }

    // Update is called once per frame
    void Update()
    {
        float forwardInput = Input.GetAxis("Vertical");
        playerRb.AddForce(focalPoint.transform.forward * speed * forwardInput);
        powerupIndicator.transform.position = transform.position + new Vector3(0, -0.5f, 0);
    }
    private void OnTriggerEnter(Collider other)//进入此函数的前提是两个物体至少有其中一个勾选了触发器
    {
        if (other.CompareTag("Powerup")){//加标签更安全,虽然敌人和玩家都没有勾选触发器,即使碰撞也是进不来这个函数的
            hasPowerup = true;
            Destroy(other.gameObject);//销毁玩家碰撞的钻石
            powerupIndicator.gameObject.SetActive(true);
            StartCoroutine(PowerupCountdownRoutine());//开启协程
            
        }
    }
    IEnumerator PowerupCountdownRoutine()//接口
    {
        yield return new WaitForSeconds(7);//协程做倒计时,yield暂停 执行到此暂停7秒再往后执行
                                           //或者使用最上面定义一个float类型时间,和一个定时器,Update中每次让定时器减去Time.deltaTime(两个帧时间间隔),直到<=0就结束
        hasPowerup = false;
        powerupIndicator.gameObject.SetActive(false);
    }
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Enemy") && hasPowerup)
        {
            Rigidbody enemyRigidbody = collision.gameObject.GetComponent<Rigidbody>();
            Vector3 awayFromPlayer = (collision.gameObject.transform.position - transform.position);

            Debug.Log("Collided with " + collision.gameObject.name + " with powerup set to " + hasPowerup);
            enemyRigidbody.AddForce(awayFromPlayer * powerupStrength, ForceMode.Impulse); //ForceMode.Impulse顺时爆发
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateCamera : MonoBehaviour
{
    public float rotationSpeed;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        transform.Rotate(Vector3.up, horizontalInput * rotationSpeed * Time.deltaTime);
    }
}

 文章来源地址https://www.toymoban.com/news/detail-793832.html

 

 

到了这里,关于Unity相扑战斗球的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(46)
  • Unity 回合制战斗

             回合制战斗游戏是一种流行的游戏类型,它的基本玩法是让玩家控制角色在回合制系统下进行战斗。本文将介绍如何使用Unity引擎实现一个基于回合制系统的3D战斗游戏,并提供完整的代码和注释。 游戏设计          我们的回合制战斗游戏将包括一个主菜单场

    2024年02月16日
    浏览(12)
  • 【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(上)

    【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(上)

    乒乓克隆 使用立方体建造竞技场、球拍和球。 移动球和球拍。 击球并得分。 让相机感受到冲击力。 给游戏一个抽象的霓虹灯外观。 这是有关基础游戏的系列教程中的第一个教程。在其中,我们将创建一个简单的 Pong 克隆。 本教程是使用 Unity 2021.3.16f1 制作的。 本系列将涵

    2024年02月13日
    浏览(15)
  • Unity如何设计一个战斗系统

    战斗系统的基本原理 在游戏中,战斗系统的基本原理是通过计算双方的属性和技能等信息,来模拟双方的战斗过程。在战斗过程中,玩家需要根据自己的策略和技能来进行操作,以便战胜对手。在战斗过程中,需要考虑到双方的攻击、防御、血量、状态效果等因素,以便更加

    2024年02月12日
    浏览(8)
  • Unity vs Godot :哪个游戏引擎更适合你?

    Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(56)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(66)
  • Unity Physics2D 2d物理引擎游戏 笔记

    Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(43)
  • GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT,是一个免费开源的3D引擎。本文以unity作对比,简述两者区别和选型建议。由于是很久以前写的ppt,技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的机遇,第一个是oprea的合作奖,第二个是用支持c#换来的微软的投资,第三个是虚幻

    2024年02月14日
    浏览(112)
  • Unity和UE4两大游戏引擎,你该如何选择?

    Unity和UE4两大游戏引擎,你该如何选择?

    目录 游戏引擎 2 —— 难易区别 编程语言 3 —— 游戏产品 UE4制作的游戏产品  Unity制作的游戏产品  产品类型 5 —— 资源商店 6 —— 人才需求 平均薪资 总结      Unity和UE4都是游戏引擎,所谓游戏引擎就是集成了复杂功能的游戏开发软件,他们帮我们实现了复杂的底层逻

    2023年04月08日
    浏览(50)
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    一、简介 2. Unity相当于什么GameObject? 3. 如何设计一个由多种资产、生物等组成的关卡? 4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么? 5.Unity子目录相当于什么Assets? 6. 支持哪些模型格式? 7. 支持FBX模型格式吗? 8.

    2024年02月07日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包