欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unity

程序员文章站 2022-03-21 10:32:23
...

1、简答并用程序验证

  • 游戏对象运动的本质是什么?

游戏运动的本质就是使用矩阵变换(平移、旋转、缩放)改变游戏对象的空间属性。

  • 请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)

(1)修改Transform属性

抛物运动的原理就是水平方向做匀速运动,竖直方向上做加速度不变的运动,例如让一个物体在x轴和y轴组成的平面上做抛物运动,那么就是z轴的坐标不变,x轴和y轴的坐标改变。

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

public class move1 : MonoBehaviour {  //假设斜上抛
    public float v_start = 10f;  //初始速度
    public float angle = 45f; //假设初始的角度为45°
    public float g = 10f; //重力加速度

    private float vx; //初始x轴的速度
    private float vy; //初始y轴的速度
    private float vy1; //y的顺时速度
    private float t;  //时间

    void Start() {
        vx = v_start * Mathf.Cos(angle); 
        vy = v_start * Mathf.Sin(angle);
        t = Time.deltaTime;
    }

    void Update() {
        Vector3 change = new Vector3(t * vx, vy * t + 0.5f * g * Mathf.Pow(t, 2f) , 0);
        vy1 = vy - g * t;
        this.transform.position += change;
    }
}

(2)使用向量Vector3的方法

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

public class move1 : MonoBehaviour {  //假设斜上抛
    public float v_start = 10f;  //初始速度
    public float angle = 45f; //假设初始的角度为45°
    public float g = 10f; //重力加速度

    private float vx; //初始x轴的速度
    private float vy; //初始y轴的速度
    private float vy1; //y的顺时速度
    private float t;  //时间

    void Start() {
        vx = v_start * Mathf.Cos(angle); 
        vy = v_start * Mathf.Sin(angle);
        t = Time.deltaTime;
    }

    void Update() {
        Vector3 change = new Vector3(t * vx, vy * t + 0.5f * g * Mathf.Pow(t, 2f) , 0);
        vy1 = vy - g * t;
        this.transform.position = Vector3.Lerp(transform.position, transform.position + change, 1);
    }
}

(3)使用transform.Translate方法

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

public class move1 : MonoBehaviour {  //假设斜上抛
    public float v_start = 10f;  //初始速度
    public float angle = 45f; //假设初始的角度为45°
    public float g = 10f; //重力加速度

    private float vx; //初始x轴的速度
    private float vy; //初始y轴的速度
    private float vy1; //y的顺时速度
    private float t;  //时间

    void Start() {
        vx = v_start * Mathf.Cos(angle); 
        vy = v_start * Mathf.Sin(angle);
        t = Time.deltaTime;
    }

    void Update() {
        Vector3 change = new Vector3(t * vx, vy * t + 0.5f * g * Mathf.Pow(t, 2f) , 0);
        vy1 = vy - g * t;
        this.transform.Translate(change);
    }
}
  • 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAroundSun : MonoBehaviour
{
    public Transform Sun;
    public Transform Mercury; //水星
    public Transform Venus; //金星
    public Transform Earth;
    public Transform Mars; //火星
    public Transform Jupiter; //木星
    public Transform Saturn;  //土星
    public Transform Uranus; //天王星
    public Transform Neptune; //海王星
    public Transform moon;

    // Start is called before the first frame update
    void Start()
    {
        Sun.position = Vector3.zero;
    }

    // Update is called once per frame
    void Update()
    {
        Mercury.RotateAround(Sun.position, new Vector3(0,1,1), 80 * Time.deltaTime);
        Mercury.Rotate(new Vector3(0,1,1) * 5 * Time.deltaTime);

        Venus.RotateAround(Sun.position, new Vector3(0,1,2), 70 * Time.deltaTime);
        Venus.Rotate(new Vector3(0,1,2) * 10 * Time.deltaTime);

        Earth.RotateAround(Sun.position, new Vector3(0,5,1), 60 * Time.deltaTime);
        Earth.Rotate(new Vector3(0,5,1) * 15 * Time.deltaTime);

        Mars.RotateAround(Sun.position, new Vector3(0,3,1), 50 * Time.deltaTime);
        Mars.Rotate(new Vector3(0,3,1) * 20 * Time.deltaTime);

        Jupiter.RotateAround(Sun.position, new Vector3(0,10,1), 40 * Time.deltaTime);
        Jupiter.Rotate(new Vector3(0,10,1) * 25 * Time.deltaTime);

        Saturn.RotateAround(Sun.position, new Vector3(0,4,1), 30 * Time.deltaTime);
        Saturn.Rotate(new Vector3(0,4,1) * 30 * Time.deltaTime);

        Uranus.RotateAround(Sun.position, new Vector3(0,2,1), 20 * Time.deltaTime);
        Uranus.Rotate(new Vector3(0,2,1) * 35 * Time.deltaTime);

        Neptune.RotateAround(Sun.position, new Vector3(0,8,1), 10 * Time.deltaTime);
        Neptune.Rotate(new Vector3(0,8,1) * 40 * Time.deltaTime);

        moon.transform.RotateAround(Earth.position, Vector3.up, 20 * Time.deltaTime);
    }
}

视频链接:https://v.youku.com/v_show/id_XNDM2NTE2MTc2OA==.html?spm=a2h3j.8428770.3416059.1

2、编程实践

(1)游戏对象:牧师,魔鬼,船,河岸,河水

(2)玩家动作表:

条件 事件
船在岸边且岸上至少有一个角色 上船
船在岸边且船上至少有一个角色 下船
所有牧师和魔鬼都到达对岸 胜利
任意一边的岸上魔鬼数量大于牧师数量 失败

(3)将游戏对象做成预制:
unity

(4)根据MVC架构,将程序分为三个部分:

  • Model:

Move_model:控制魔鬼,牧师和船的移动。

Coast_model:控制角色上下船以及船的离岸和靠岸动作。

Character_model:控制牧师和魔鬼的上船、上岸等动作。

Boat_model:控制船的运动以及牧师、魔鬼的上下船动作。

  • Controller:用一个场记My_Scene_controller控制所有角色的行为以及交互,另外还有一个导演Director类实现单例模式。
  • View:与用户交互的界面,包括游戏场景,对象的生成,游戏Continue,Pause,Restart功能。两个类ClickGUI和UserGUI。

基于门面模式,有两个接口,Scene_controller和User_action。Scene_controller由Director控制

来实现游戏场景的加载,通过User_action接口来控制用户与游戏的互动。
unity