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日
    浏览(47)
  • Unity 回合制战斗

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月07日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包