3D游戏设计:空间与运动

1.简答并用程序验证

(1) 游戏对象运动的本质是什么

游戏对象运动的本质是坐标的变换

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

  • 可以直接对物体的position属性进行修改
private void Update()
    {
        this.transform.position += Vector3.right * Time.deltaTime * 6f;
        this.transform.position += Vector3.up * Time.deltaTime * 8f;
    }
  • 也可以利用lerp方法进行操作
Vector3 Target = new Vector3(6,4,2);
    void Update()
    {
        gameObject.transform.localPosition = Vector3.Lerp(transform.position, Target,Time.deltaTime);
    }

这两种方法如果在不加重力的情况下,物体都是一直像斜上方运动的,要想让物体做先向上再向下的抛物线运动,则需要添加重力,当然参数不太好调,比较容易出现物体刚向上走一点就下落的情况
第三种方法是我在网上看到的一种很"高大上"的方法

public GameObject target;
    public float speed = 10;
    private float distanceToTarget;
    private bool move = true;

    void Start()
    {
        distanceToTarget = Vector3.Distance(this.transform.position, target.transform.position);
        StartCoroutine(Shoot());
    }

    IEnumerator Shoot()
    {

        while (move)
        {
            Vector3 targetPos = target.transform.position;
            this.transform.LookAt(targetPos);
            float angle = Mathf.Min(1, Vector3.Distance(this.transform.position, targetPos) / distanceToTarget) * 45;
            this.transform.rotation = this.transform.rotation * Quaternion.Euler(Mathf.Clamp(-angle, -42, 42), 0, 0);
            float currentDist = Vector3.Distance(this.transform.position, target.transform.position);
            if (currentDist < 0.5f)
            {
                move = false;
            }
            this.transform.Translate(Vector3.forward * Mathf.Min(speed * Time.deltaTime, currentDist));
            yield return null;
        }
    }

这种方法大体思路是根据距离衰减以及旋转对应的角度(对角度的操作还用到了线性插值),然后向目标点进行移动,当然这里用到了许多比较复杂的数学知识

写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上

这里的太阳系只取其中的太阳以及八大行星(金星,水星,土星,木星,地球,天王星,海王星)
在这里把太阳当作父对象,其他八大行星作为太阳的子对象
当然,每个行星都要自转,其他八大行星绕太阳公转
自转

void Update()
    {
        this.transform.RotateAround(this.transform.position, Vector3.up, 2);
    }

公转的话,因为要求转速不一样,所以通过取随机数来实现这一点

public Transform sun;
    private float random_x, random_y;
    private void Start()
    {
        random_x = Random.Range(1, 10);
        random_y = Random.Range(10, 60);
    }
    void Update()
    {
        Vector3 axis = new Vector3(random_x, random_y, 0);
        this.transform.RotateAround(sun.position, axis, 15 * Time.deltaTime);
    }

2.编程实践

这次要做的游戏叫牧师与魔鬼
游戏简介如下:
牧师和魔鬼是一个益智游戏,在这个游戏中,你将帮助牧师和魔鬼在时间限制内过河。河的一边有3个牧师和3个魔鬼。他们都想到达这条河的对岸,但只有一条船,这条船每次只能载两个人。必须有一个人操纵船从一边到另一边。在Flash游戏中,你可以点击它们移动它们,然后点击“前进”按钮将船移到另一个方向。如果牧师在河的两边被魔鬼数数,他们就会被杀,游戏结束。你可以用多种方式尝试。让所有的牧师都活着
在这里需要把物体做成预制,然后在代码中将它们实例化
在这里插入图片描述
动作表

点击鼠标左键牧师/魔鬼上船或者下船
点击Go按钮船出发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值