Unity 3D课程学习 week 2

这篇博客探讨了在Unity 3D中实现太阳系模拟,包括游戏对象运动本质的解析,抛物线运动的三种实现方式,以及完整太阳系的设计与编程实践。此外,还介绍了谜题游戏"Priests and Devils"的规则,要求使用MVC架构编程,并详细阐述了游戏对象、玩家动作表以及预制对象的创建和管理。
摘要由CSDN通过智能技术生成

1、简答并用程序验证

  • 游戏对象运动的本质是什么?
  • 请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)
  • 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。

游戏对象运动的本质

  • 游戏对象运动的本质,其实是游戏对象跟随每一帧的变化,空间地变化。这里的空间变化包括了游戏对象的transform属性中的position跟rotation两个属性。一个是绝对或者相对位置的改变,一个是所处位置的角度的旋转变化。

实现物体的抛物线运动

  • 第一种方法是利用position的改变来实现抛物线运动,水平方向的移动是匀速进行,竖直方向是有一定的加速度变化的,按照物理的规律来看,两个方向的运动矢量相加即可实现抛物线运动,代码如下:
using System.Collections;
using System.Collections.Generic;

using UnityEngine;


public class move1 : MonoBehaviour {


    public float speed = 1;

      // Use this for initialization

      void Start () {

      Debug.Log("start!");

      }


      // Update is called once per frame

      void Update () {


      this.transform.position += Vector3.down * Time.deltaTime * (speed/10);

      this.transform.position += Vector3.right * Time.deltaTime * 5;

      speed++;

      }

}

 

  •  
  • 第二种方法是直接声明创建一个Vector3变量,同时定义该变量的值,也是竖直方向上是一个均匀增加的数值,水平方向是一个保持不变的数值,然后将游戏对象原本的position属性与该向量相加即可实现抛物线运动,代码如下:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class move2 : MonoBehaviour {


    public float speed = 1;

      // Use this for initialization

      void Start () {

      Debug.Log("start!");

      }


      // Update is called once per frame

      void Update () {


      Vector3 change = new Vector3( Time.deltaTime*5, -Time.deltaTime*(speed/10), 0);

      ;

      this.transform.position += change;

      speed++;

      }

}

第三种方法其实与第二种方法类似,区别在于第二种方法直接是利用Vector3的矢量相加,而第三种方法则是利用transform中的translate函数来进行改变position,传入参数也需要是一个Vector3向量,才可以实现position的改变,代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class move3 : MonoBehaviour {


    public float speed = 1;

      // Use this for initialization

      void Start () {

      Debug.Log("start!");

      }


      // Update is called once per frame

      void Update () {


      Vector3 change = new Vector3(Time.deltaTime * 5, -Time.deltaTime * (speed / 10), 0);


      transform.Translate(change);

      speed++;

      }

}

 

完整太阳系的设计

  • 首先是游戏对象的安排,如下图所示:

​​​​​​​

 

  • 其次按照一定的大小以及距离,将八大行星的位置大小依次安排,修改它们的transform属性即可,同时将图片素材直接拉到该对象上面即可添加对象

  • 将八大行星的运动写进同个脚本里面,挂在Sun对象上即可。首先利用GameObject.Find函数找到该游戏对象,再通过其transform函数中的RotationAround跟Rotation函数分别来实现公转跟自转。
  • RotationAround需要三个参数,第一个参数是旋转的中心,这个八大行星都是以太阳中心为旋转中心;第二个参数是旋转轴,也就是一个Vector3变量,通过改变旋转轴的属性。
  • Rotation函数则可以只需要一个参数,即旋转时的方向及速度,用Vector3.up代表该物体是沿着自己的Y轴进行旋转的,后面的参数则是代表旋转的角速度,因此即可实现自转。
  • 挂在sun上的行为代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Sun : MonoBehaviour {
 
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        GameObject.Find("Earth").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 30 * Time.deltaTime);
        GameObject.Find("Earth").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("Mercury").transform.RotateAround(Vector3.zero, new Vector3(1, 1, 0), 25 * Time.deltaTime);
        GameObject.Find("Mercury").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
        GameObject.Find("Venus").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 1), 20 * Time.deltaTime);
        GameObject.Find("Venus").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值