Unity入门案例(约翰的密室逃脱)

这篇具有很好参考价值的文章主要介绍了Unity入门案例(约翰的密室逃脱)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CameraFollow1.cs 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow1 : MonoBehaviour
{
    //跟随的游戏人物
    private Transform Player;
    //相机与人物之间的距离
    Vector3 offset;
    // Start is called before the first frame update
    void Start()
    {
        Player = GameObject.Find("JohnLemon").transform;
        offset = transform.position - Player.position;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = offset + Player.position;
    }
}

PlayMovement.cs

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class PlayMovement : MonoBehaviour
{
    //定义一个旋转的速度
    public float turnspeed = 20f;

    //定义游戏任务上的组件
    Animator m_Animator;
    Rigidbody m_Rigidbody;

    //游戏人物移动的方向
    Vector3 m_Movement;
    //游戏人物旋转的角度
    Quaternion m_Quaternion = Quaternion.identity;
    // Start is called before the first frame update
    void Start()
    {
        //获取游戏人物上的刚体,动画控制机组件
        m_Animator = GetComponent<Animator>();
        m_Rigidbody = GetComponent<Rigidbody>();
    }


    private void FixedUpdate()
    {
        //获取水平,竖直(z轴方向)是否有键值输入
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        //设置游戏任务移动的方向
        m_Movement.Set(horizontal,0f,vertical);
        m_Movement.Normalize();

        //定义游戏人物是否移动的bool值
        //bool hasHorizontalInput=!Mathf.Approximately(horizontal,0f);
        bool hasHorizontalInput = !Mathf.Approximately(horizontal,0f);
        bool hasVerticalInput = !Mathf.Approximately(vertical,0f);
        //控制人物动画的转换
        bool iswalking = hasHorizontalInput || hasVerticalInput;
        m_Animator.SetBool("IsWalking", iswalking);
        //旋转的过渡,通过三元数转四元数的方式获取游戏人物当前应有的角度
        Vector3 desirForward = Vector3.RotateTowards(transform.forward, m_Movement, turnspeed * Time.deltaTime,0f);
        m_Quaternion = Quaternion.LookRotation(desirForward);
     }
    //游戏人物的旋转和移动
    private void OnAnimatorMove()
    {
        m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
        m_Rigidbody.MoveRotation(m_Quaternion);
    }

}

GameEnding.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine. SceneManagement;

public class GameEnding : MonoBehaviour
{
    //游戏胜利时,图片淡入淡出的时间
    public float fadeDuration = 1f;
    //游戏胜利时图片显示的时间
    public float displayDuration=1f;
    //游戏人物
    public GameObject Player;
    //游戏胜利时的画布背景
    public CanvasGroup ExitBK;
    //游戏失败时的画布背景
    public CanvasGroup FailBK;

    //游戏胜利时的bool值
    bool IsExit=false;
    //游戏失败时的bool值
    bool IsFail=false;
    //定义计时器,用于图片的渐变和完全显示
    public float timer=0f;

    //音频组件
    public AudioSource winaudio;
    public AudioSource failaudio;

    //bool值控制音效只播放一次
    bool IsPlay=false;
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject == Player)
        {
            //检测到玩家
            //游戏胜利
            IsExit = true;
        }
    }
    //游戏失败时的控制函数
    public void Caught()
    {
        IsFail = true;
    }
    // Update is called once per frame
    void Update()
    {
        //游戏胜利
        if (IsExit)
        {
            EndLevel(ExitBK, false,winaudio);
        }
        //游戏失败
        else if (IsFail)
        {
            EndLevel(FailBK, true,failaudio);
        }
    }

    //游戏胜利或失败时的方法
    void EndLevel(CanvasGroup igCanvasGroup,bool doRestart,AudioSource playaudio)
    {
        //游戏胜利或失败的音效播放
        if (!IsPlay)
        {
            playaudio.Play();
            IsPlay=true;
        }
        //玩家碰到触发器时,计时器开始计时
        timer+=Time.deltaTime;
        //控制CanvasGroup的不透明度
        igCanvasGroup.alpha = timer/fadeDuration;

        //游戏胜利/失败图片渐变了1秒,显示了1秒,游戏结束
        if(timer>fadeDuration+displayDuration) 
        {
            //游戏失败,重启游戏
            if (doRestart)
            {
                SceneManager.LoadScene(0);
            }
            //游戏胜利,退出游戏
            else if (!doRestart) 
            { 
                Application.Quit(); 
            }
            
        }
    }
}

 Observer.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Observer : MonoBehaviour
{
    //游戏角色
    public Transform Player;
    //GameEnding
    public GameEnding gameEnding;
    //游戏玩家是否进入到扫描棒的视线范围
    bool IsInRange=false;

    private void OnTriggerEnter(Collider other)
    {
        //扫描棒扫描到玩家了
        if (other.gameObject == Player.gameObject)
        {
            IsInRange = true;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        //扫描棒扫描到玩家离开了
        if(other.gameObject == Player.gameObject)
        {
            IsInRange=false;
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (IsInRange == true)
        {
            //射线检测
            Vector3 dir=Player.position-transform.position+Vector3.up;
            Ray ray = new Ray(transform.position,dir);
            RaycastHit raycastHit;

            if(Physics.Raycast(ray,out raycastHit))
            {
                if (raycastHit.collider.transform == Player)
                {
                    //游戏失败,玩家被抓住,调用gameEnding的Caught方法
                    gameEnding.Caught();
                }
            }
        }
        
    }
}

 WayPointsPatrol.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class WayPointsPatrol : MonoBehaviour
{
    //导航组件
    private NavMeshAgent navMeshAgent;
    //导航点的数组
    public Transform[] waypoints;
    //当前巡逻的目标点
    int m_currentpointIndex;
    // Start is called before the first frame update
    void Start()
    {
        //获取NavMeshAgent组件
        navMeshAgent = GetComponent<NavMeshAgent>();
        //从起点到达第一个巡逻点
        navMeshAgent.SetDestination(waypoints[0].position);
    }

    // Update is called once per frame
    void Update()
    {
        //到达目标点,前往下一个目标点
        if (navMeshAgent.remainingDistance<navMeshAgent.stoppingDistance)
        {
            m_currentpointIndex=(m_currentpointIndex + 1) % waypoints.Length;
            navMeshAgent.SetDestination(waypoints[m_currentpointIndex].position);
        }
    }
}

PS:根据b站教程完成 文章来源地址https://www.toymoban.com/news/detail-518215.html

到了这里,关于Unity入门案例(约翰的密室逃脱)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • UNITY—2D游戏制作入门!

    Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱。 像是炉石传说,以及逃离塔克夫,都是由unity引擎开发制作。 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目标,都有一个微不足道的开始。让我们从一个2D小游戏入手,来学习Unit

    2024年02月04日
    浏览(52)
  • Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)

    //【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、   2.发射子弹(空格键) //【程序逻辑2】 首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数    3.克隆子弹 4.让克隆的子弹往前跑 为子弹模板添加刚体,并且限制旋转 这个脚本需要挂在到摄像机,里面谈

    2024年02月06日
    浏览(53)
  • Unity和C#游戏编程入门:创建迷宫小球游戏示例

    💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 当涉及到Unity和C#游戏编程入门时,以下是一些示例代码,可以帮助初学者更好地理

    2024年02月08日
    浏览(37)
  • Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇)

    01 Unity2D 回合制游戏案例 - 梦幻西游(第一季 战斗逻辑篇) 01 Unity2D 回合制游戏案例 - 梦幻西游(第一季 战斗逻辑篇)【B站的第一季的部分视频】 02 Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇) 03 Unity2D 商业游戏案例《梦幻西游》(番外篇 - 场景系统) 。。。。。

    2024年02月05日
    浏览(113)
  • 2022版本unity-2D游戏官方案例--带视频案例(1)(层级渲染,物理碰撞,粒子动画,UI等多位基础一体化)

      👨‍💻个人主页:@元宇宙-秩沅 hallo  欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由  秩沅  原创 收录于专栏 unity实战入门  ⭐相关文章⭐ ——————————————————— -[本站最全-unity常用API大全(万字详解),不信你不收藏] -[关于游戏剧情模式中用到的

    2024年02月03日
    浏览(63)
  • 从零开始入门创作游戏——Unity编辑器的使用

    还没找到工作的我继续瞎折腾中,上次搭建环境就花了我3天的时间 从零开始入门创作游戏——Unity3d的环境搭建_默哀d的博客-CSDN博客 接下来是根据油土鳖的视频学习创作的一个小恐龙跳跳跳游戏,直接上手做一次学得更多 https://www.youtube.com/watch?v=UdM9DEys-rI 选择2D核心模板就可

    2024年02月05日
    浏览(64)
  • 游戏开发入门ue4和unity要怎么选择?

    关于两款引擎该怎么选的问题 先从行业大环境这个角度分析: 目前市场主流是U3D,这并不意味着UE4不好。UE4的学习成本更 高且招人困难导致了大部分公司不选择用UE4去做游戏。U3D是做端游也可以,做手游格外方便,而且U3D学起来也更简单导致了市场上大部分都在用U3D开发游

    2023年04月15日
    浏览(82)
  • 【Unity入门】25.零基础实现游戏Demo--神鸟大战怪兽

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢      经过了两个月的学习,我们也顺利的完成了入门课程,最后就用一个Demo作为我们的结课句号吧,这篇文章会带大家从0完成这些~~ 文末会附带项目资源包,一定要看到最后哇 (●

    2024年02月16日
    浏览(39)
  • Unity IL2CPP 游戏分析入门

    很多时候App加密本身并不难,难得是他用了一套新玩意,天生自带加密光环。例如PC时代的VB,直接ida的话,汇编代码能把你看懵。 但是要是搞明白了他的玩法,VB Decompiler一上,那妥妥的就是源码。 Unity 和 Flutter 也是如此。 最近迷上了一个小游戏 Dream Blast,今天就拿他解剖

    2024年01月18日
    浏览(46)
  • 【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例

    前言 Unity2018版本之后推出了一款名为 Shader Graph 的可编程渲染管线工具。 这个工具可以通过可视化界面拖拽来实现着色器的创建和编辑,大大简化了着色器的制作过程,同时着色效果编译显示也快。 下面就来介绍一下Shader Graph的基本信息及使用方法,上手非常简单,一起来

    2024年02月08日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包