Unity空间与运动(中山大学3D游戏作业3)

这篇具有很好参考价值的文章主要介绍了Unity空间与运动(中山大学3D游戏作业3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity空间与运动(中山大学3D游戏作业3)

代码仓库:https://github.com/linfn3/3d_game

b站视频:https://www.bilibili.com/video/BV1YD4y1r7GR/?vd_source=6d44ed4eff5157be7cd6838983f17b44

一、程序验证

物体运动的本质

unity中物体运动的本质是游戏对象的位置和状态变化。

三种方法实现抛物线运动

  1. 使用translate方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
	private float speed1 = 0.00f;
	public float speed2 = 5.00f;
	const float g = 0.1f;
    // Start is called before the first frame update
    void Start()
    {
        
    }
	// Update is called once per frame
	void Update()
	{
		Vector3 change = new Vector3(Time.deltaTime * speed2, -Time.deltaTime * speed1, 0.0f);
		this.transform.Translate(change);
		speed1 += g;
	}
}
  1. 将transfrom.position1加上改变向量
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Behavior : MonoBehaviour
{
	private float speed1 = 0.00f;
    public float speed2 = 5.00f;
    const float g = 0.1f;
    // Use this for initialization
    void Start()
    {

    }
    // Update is called once per frame
    void Update()
    {
        Vector3 change = new Vector3(Time.deltaTime * speed2, -Time.deltaTime * speed1, 0.0f);
        this.transform.position += change;
        speed1 += g;
    }
}

  1. position加减实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Behavior : MonoBehaviour
{
    private float speed1 = 0.00f;
    public float speed2 = 5.00f;
    const float g = 0.098f;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        this.transform.position += Vector3.right * Time.deltaTime * speed2;
        this.transform.position += Vector3.down * Time.deltaTime * speed1;
        speed1 += g;

    }
}

实现太阳系

首先,9个创建球体最为星体,再加上图片作为材质:
Unity空间与运动(中山大学3D游戏作业3)
然后编写代码,调用transform.RotateAround方法,使得行星绕着太阳转。

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

public class Rotate : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        GameObject.Find("global").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 30 * Time.deltaTime);
        GameObject.Find("global").transform.Rotate(Vector3.up * Time.deltaTime*10000);
        GameObject.Find("Mercury").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 20 * Time.deltaTime);
        GameObject.Find("Mercury").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("gold").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 45 * Time.deltaTime);
        GameObject.Find("gold").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("juiter").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 35 * Time.deltaTime);
        GameObject.Find("juiter").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("Saturn").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime);
        GameObject.Find("Saturn").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("spark").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 15 * Time.deltaTime);
        GameObject.Find("spark").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("sky").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 25 * Time.deltaTime);
        GameObject.Find("sky").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("sea").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 15 * Time.deltaTime);
        GameObject.Find("sea").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        
      
    }
}

运行游戏,查看结果:
Unity空间与运动(中山大学3D游戏作业3)

二、牧师与恶魔游戏

要求:
Unity空间与运动(中山大学3D游戏作业3)
事务表:

事务 数量
牧师 3
恶魔 3
河流 1
石头(河岸) 2
1

动作表:

动作 事件
点击小船 船移动
点击角色 角色上(下)船

预制:
如下图,用红色方块代表恶魔,用球体代表牧师。
Unity空间与运动(中山大学3D游戏作业3)
MVC模式:
Unity空间与运动(中山大学3D游戏作业3)

  1. model包括Boat、Character和Stone,用于维护船、角色(恶魔、牧师)、石头的坐标、特征位置等,具体代码过多,详细可见代码仓库。
  2. UserGUI用于绘制场景和获取鼠标事件:
    void OnMouseDown()获取鼠标事件
    OnGUI() 进行渲染绘制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace MyNamespace
{
    public class UserGUI : MonoBehaviour
    {
       


        private IUserAction action;
        private GUIStyle textStyle;
        public CharacterController contronller;
        public int flag;
        private GUIStyle hintStyle;
        private GUIStyle btnStyle;

        // 初始化获得当前场记 CurrentSecnController
        void Start()
        {
            flag = 0;
            action = Director.GetInstance().CurrentSecnController as IUserAction;
        }

        // Update is called once per frame
        void OnGUI()
        {
            textStyle = new GUIStyle
            {
                fontSize = 40,
                alignment = TextAnchor.MiddleCenter
            };
            hintStyle = new GUIStyle
            {
                fontSize = 15,
                fontStyle = FontStyle.Normal
            };
            btnStyle = new GUIStyle("button")
            {
                fontSize = 30
            };


            if (flag == 1)
            {
                // Lose
                GUI.Label(new Rect(Screen.width / 2 - 48, Screen.height / 2 - 85, 100, 50), "Lose!", textStyle);
                if (GUI.Button(new Rect(Screen.width / 2 - 70, Screen.height / 2, 140, 70), "Restart", btnStyle))
                {
                    flag = 0;
                    action.Restart();
                }
            }
            else if (flag == 2)
            {
                // Win
                GUI.Label(new Rect(Screen.width / 2 - 48, Screen.height / 2 - 85, 100, 50), "Win!", textStyle);
                if (GUI.Button(new Rect(Screen.width / 2 - 70, Screen.height / 2, 140, 70), "Restart", btnStyle))
                {
                    flag = 0;
                    action.Restart();
                }
            }
        }

        public void SetCharacterCtrl(CharacterController controller)
        {
            contronller = controller;
        }

        void OnMouseDown()
        {
            Debug.Log("tmp");

            if (gameObject.name == "boat")
            {
                action.Boatmoved();
                Debug.Log("yes");
            }
            else
            {
                Debug.Log("r");
                action.CharacterClicked(contronller);
            }
        }
    }
}

  1. Controller包括Director、FirstController、GameObjectController、Moveable、interFaces
    Director:用于获取游戏场景,继承System.Object
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MyNamespace;

namespace MyNamespace
{
    public class Director : System.Object
    {
        private static Director SSDirector;
        public ISceneController CurrentSecnController { get; set; }

        // get instance anytime anywhere!
        public static Director GetInstance()
        {
            if (SSDirector == null)
            {
                SSDirector = new Director();
            }
            return SSDirector;
        }

        public int getFPS()
        {
            return Application.targetFrameRate;
        }

        public void setFPS(int fps)
        {
            Application.targetFrameRate = fps;
        }
    }
}

Moveable:控制游戏对象运动
GameObjectController:控制上船、上岸、计算穿上的角色数量、计算岸上和船上空余位置等功能
FirstController:被唤醒时自动导入场景、实现判断游戏胜负等功能。
以上代码详见仓库:

展示:
胜利:
Unity空间与运动(中山大学3D游戏作业3)
失败:
Unity空间与运动(中山大学3D游戏作业3)文章来源地址https://www.toymoban.com/news/detail-437402.html

到了这里,关于Unity空间与运动(中山大学3D游戏作业3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 3D 游戏编程与设计:第3次作业

    姓名:韩宝欣 学号:20331013 代码仓库:https://gitee.com/sse_20331013/3d-game.git 1、简答并用程序验证【建议做】 游戏对象运动的本质是什么? 本质是游戏对象在游戏每一帧的渲染过程中Transform属性在发生变化。这里物体的Transform属性是指Position与Rotation两个属性。 请用三种方法以上

    2024年02月09日
    浏览(31)
  • Unity3D_物体抛物线运动

    参考:Unity 贝塞尔曲线实现抛物线运动,投掷功能实现  用到了DOTween插件, 回想起之前不知道这个插件还在用协程和SmoothDamp做运动控制的自己仿佛是个哈批 路径绘制使用的LineRenderer

    2024年02月13日
    浏览(69)
  • Unity大作业-第一人称射箭游戏

    视频地址:BILIBILI 代码地址:Gitee 本项目中使用了 Cross Bow 、 VegetationSpawner 、 Military Target 和 Fantacy Skybox F REE 资源包,均可在Asset Store免费下载。其中 Cross Bow 提供了弓和箭的预制, VegetationSpawner 提供了树的预制, Military Target 提供了靶子的预制, Fantacy Skybox F REE 提供了天空

    2024年02月04日
    浏览(42)
  • Unity 3D期末大作业--背包系统

    1. 功能描述 该部分主要实现了游戏中玩家在个人背包和游戏角色之间切换装备,能够从背包中将装备装到游戏角色上也能够将游戏角色的装备卸下放入背包。 卸下装备放入背包 将背包中装备赋给游戏角色 2. 实现思路 本功能无需3D效果,只需要在UI上进行涉及即可,因此主要

    2024年02月06日
    浏览(43)
  • Unity3D根据物体运动画出实体轨迹线

    在Unity3D根据物体运动画出实体轨迹线 在Inspector里面添加组件LineRender,线条圆滑设置如下, 颜色可以新建材质直接拖上该物体上就行。 添加脚本LineMark 将上面的Line放在OBS里面,对应需要画出的物体直接拖入右侧的 — 小技巧:想画出对应阶段的轨迹曲线可以通过启用和不启

    2024年02月12日
    浏览(65)
  • Unity 3D汽车模拟驾驶期末大作业

    在Unity中制作汽车模拟驾驶游戏的期末大作业。包含登录注册、加载、选择、迷宫地图、夜晚道路、科目二模拟等场景。

    2023年04月08日
    浏览(61)
  • unity3d 物体高速运动下穿模的解决方案

    以下是一些解决Unity 3D中物体高速运动下穿模问题的方法: 提高物理引擎的迭代次数:在Unity中,可以通过增加物理引擎的迭代次数来提高碰撞检测的精度。这可以通过修改项目的物理设置来实现。增加迭代次数可以减少物体在高速运动下穿越其他物体的可能性。 增加物理步

    2024年02月16日
    浏览(137)
  • Unity3d数字化看板-多关节机器人运动控制

    在工业数字化看板中,常见的一种设备就是机械臂,也可能说是多关节的机器人,通过机械臂的各个关节旋转运动(也有机械臂的轴是伸缩),运行到指定位置,再配合夹爪和其他设备进行操作,这种时候获取的数据就是一组角度数组,需要跟模型上的各个关节进行关联,来

    2024年02月12日
    浏览(55)
  • Unity 新建你的第一个游戏,以及如何按WASD控制角色运动 (Unity Demo2D)

    当你打开 Unity Hub,初始化一个 2D 项目,进入了 Unity 编辑器,你会发现在 左侧 : 一个叫 SampleScene (或者其他) 的场景 场景下有一个 Main Camera,主相机 这就是一个新建的 2D 项目自带的内容。 在 Main Camera 同级目录新建: 2D Object - Sprites - Capsule ,这里 Capsule 是精灵的种类,我们

    2024年02月02日
    浏览(46)
  • unity期末作业-两个简单小游戏游戏-躲避障碍和跑酷(附下载链接和gif动态图演示)

    游戏角色为一个小人,天上不时会掉落障碍物,人物撞到了会掉生命值,人物可以左右移动跳跃来躲避,带游戏音效,比较简单!具体情况如下所示: 点我下载源文件和exe导出文件》》》》》》》 角色可以上下左右移动,J发射子弹k跳跃,只有在跳板上才可以跳跃,可以吃能

    2024年02月04日
    浏览(66)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包